From a3a8079320cbcc221f8bf8a87a5c0d97913f96e4 Mon Sep 17 00:00:00 2001 From: Vanitha S <116701245+vanitha1822@users.noreply.github.com> Date: Wed, 16 Jul 2025 15:45:09 +0530 Subject: [PATCH 01/47] Fix the issue in retrieving the Casesheet Print Data for Cancer Screening (#96) * fix: change the return type to object to get the details * fix: remove commented lines --- pom.xml | 17 +++++++++++------ .../iemr/mmu/repo/nurse/BenVisitDetailRepo.java | 2 +- .../cancerScreening/CSNurseServiceImpl.java | 2 +- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/pom.xml b/pom.xml index 70859837..eeef30e2 100644 --- a/pom.xml +++ b/pom.xml @@ -163,6 +163,17 @@ jackson-datatype-joda 2.17.0 + + org.slf4j + slf4j-api + ${slf4j.version} + + + org.slf4j + slf4j-simple + ${slf4j.version} + + jakarta.servlet jakarta.servlet-api @@ -179,12 +190,6 @@ org.apache.poi poi-ooxml 5.2.5 - - - org.apache.commons - commons-compress - - diff --git a/src/main/java/com/iemr/mmu/repo/nurse/BenVisitDetailRepo.java b/src/main/java/com/iemr/mmu/repo/nurse/BenVisitDetailRepo.java index d0902ee0..8c659c8b 100644 --- a/src/main/java/com/iemr/mmu/repo/nurse/BenVisitDetailRepo.java +++ b/src/main/java/com/iemr/mmu/repo/nurse/BenVisitDetailRepo.java @@ -68,7 +68,7 @@ public Integer updateBenFlowStatus(@Param("visitFlowStatusFlag") String visitFlo + "bvd.reportFilePath,sp.serviceProviderName from BeneficiaryVisitDetail bvd " + "INNER JOIN bvd.providerServiceMapping p " + "INNER JOIN p.serviceProvider sp " + "WHERE bvd.beneficiaryRegID = :benRegID AND bvd.visitCode = :visitCode ") - public List getBeneficiaryVisitDetails(@Param("benRegID") Long benRegID, + public List getBeneficiaryVisitDetails(@Param("benRegID") Long benRegID, @Param("visitCode") Long visitCode); @Query(" SELECT COUNT(benVisitID) FROM BeneficiaryVisitDetail WHERE beneficiaryRegID = :benRegID GROUP BY beneficiaryRegID ") diff --git a/src/main/java/com/iemr/mmu/service/cancerScreening/CSNurseServiceImpl.java b/src/main/java/com/iemr/mmu/service/cancerScreening/CSNurseServiceImpl.java index 770e81a8..b6b15f22 100644 --- a/src/main/java/com/iemr/mmu/service/cancerScreening/CSNurseServiceImpl.java +++ b/src/main/java/com/iemr/mmu/service/cancerScreening/CSNurseServiceImpl.java @@ -710,7 +710,7 @@ public Map getBenNurseDataForCaseSheet(Long benRegID, Long visit } public BeneficiaryVisitDetail getBeneficiaryVisitDetails(Long benRegID, Long visitCode) { - List beneficiaryVisitDetail = benVisitDetailRepo.getBeneficiaryVisitDetails(benRegID, visitCode); + List beneficiaryVisitDetail = benVisitDetailRepo.getBeneficiaryVisitDetails(benRegID, visitCode); BeneficiaryVisitDetail beneficiaryVisit = null; if (null != beneficiaryVisitDetail) { for (Object[] obj : beneficiaryVisitDetail) { From 458af672d6c553a79385552dd184aab83beaa6cd Mon Sep 17 00:00:00 2001 From: Vanitha S <116701245+vanitha1822@users.noreply.github.com> Date: Wed, 16 Jul 2025 15:49:36 +0530 Subject: [PATCH 02/47] fix: add the column for NumberperWeek to store and fetch the data (#94) --- .../iemr/mmu/data/anc/BenPersonalHabit.java | 35 +++++++++++++++---- .../repo/nurse/anc/BenPersonalHabitRepo.java | 4 +-- .../transaction/CommonNurseServiceImpl.java | 9 +++-- 3 files changed, 37 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/iemr/mmu/data/anc/BenPersonalHabit.java b/src/main/java/com/iemr/mmu/data/anc/BenPersonalHabit.java index 17594d3e..078c3208 100644 --- a/src/main/java/com/iemr/mmu/data/anc/BenPersonalHabit.java +++ b/src/main/java/com/iemr/mmu/data/anc/BenPersonalHabit.java @@ -93,6 +93,10 @@ public class BenPersonalHabit { @Column(name = "NumberperDay") private Short numberperDay; + @Expose + @Column(name = "NumberperWeek") + private Short numberperWeek; + @Expose @Column(name = "TobaccoUseDuration") private Timestamp tobaccoUseDuration; @@ -333,10 +337,18 @@ public Short getNumberperDay() { return numberperDay; } + public Short getNumberperWeek() { + return numberperWeek; + } + public void setNumberperDay(Short numberperDay) { this.numberperDay = numberperDay; } + public void setNumberperWeek(Short numberperWeek) { + this.numberperWeek = numberperWeek; + } + public Timestamp getTobaccoUseDuration() { return tobaccoUseDuration; } @@ -579,6 +591,9 @@ public ArrayList getPersonalHistory() { if (null != tobaccoInfo.get("numberperDay")) { benPersonalHabit.setNumberperDay(new Short(tobaccoInfo.get("numberperDay"))); } + if (null != tobaccoInfo.get("numberperWeek")) { + benPersonalHabit.setNumberperWeek(new Short(tobaccoInfo.get("numberperWeek"))); + } timePeriodUnit = (String) tobaccoInfo.get("durationUnit"); if (null != tobaccoInfo.get("duration")) { @@ -634,7 +649,7 @@ public ArrayList getPersonalHistory() { } public BenPersonalHabit(Date createdDate, String dietaryType, String physicalActivityType, String tobaccoUseStatus, - String tobaccoUseType, String otherTobaccoUseType, Short numberperDay, Date tobaccoUseDuration, + String tobaccoUseType, String otherTobaccoUseType, Short numberperDay, Short numberperWeek, Date tobaccoUseDuration, Character riskySexualPracticesStatus) { super(); this.captureDate = createdDate; @@ -650,6 +665,8 @@ public BenPersonalHabit(Date createdDate, String dietaryType, String physicalAct } else if(riskySexualPracticesStatus !=null && riskySexualPracticesStatus == '1') { this.riskySexualPracticeStatus = "Yes"; } + this.numberperWeek = numberperWeek; + } public BenPersonalHabit(Date createdDate, String dietaryType, String physicalActivityType, @@ -687,7 +704,7 @@ public BenPersonalHabit(Long beneficiaryRegID, Long benVisitID, Integer provider } public BenPersonalHabit(String tobaccoUseTypeID, String tobaccoUseType, String otherTobaccoUseType, - Short numberperDay, Timestamp tobaccoUseDuration, String alcoholTypeID, String alcoholType, + Short numberperDay, Short numberperWeek, Timestamp tobaccoUseDuration, String alcoholTypeID, String alcoholType, String otherAlcoholType, String alcoholIntakeFrequency, String avgAlcoholConsumption, Timestamp alcoholDuration, Timestamp createdDate, Long visitCode) { super(); @@ -704,6 +721,7 @@ public BenPersonalHabit(String tobaccoUseTypeID, String tobaccoUseType, String o this.alcoholDuration = alcoholDuration; this.createdDate = createdDate; this.visitCode = visitCode; + this.numberperWeek = numberperWeek; } public static BenPersonalHabit getPersonalDetails(ArrayList personalHistoryDetails) { @@ -712,15 +730,15 @@ public static BenPersonalHabit getPersonalDetails(ArrayList personalHi Object[] obj1 = personalHistoryDetails.get(0); personalDetails = new BenPersonalHabit((Long) obj1[0], (Long) obj1[1], (Integer) obj1[2], (String) obj1[3], - (String) obj1[4], (String) obj1[5], (String) obj1[11], (Character) obj1[18]); + (String) obj1[4], (String) obj1[5], (String) obj1[12], (Character) obj1[19]); ArrayList> tobaccoList = new ArrayList>(); ArrayList> alcoholList = new ArrayList>(); for (Object[] obj : personalHistoryDetails) { BenPersonalHabit personalHabits = new BenPersonalHabit((String) obj[6], (String) obj[7], - (String) obj[8], (Short) obj[9], (Timestamp) obj[10], (String) obj[12], (String) obj[13], - (String) obj[14], (String) obj[15], (String) obj[16], (Timestamp) obj[17], (Timestamp) obj[19], - (Long) obj[20]); + (String) obj[8], (Short) obj[9], (Short) obj[10], (Timestamp) obj[11], (String) obj[13], (String) obj[14], + (String) obj[15], (String) obj[16], (String) obj[17], (Timestamp) obj[18], (Timestamp) obj[20], + (Long) obj[21]); Map timePeriod = null; // Integer timePeriodAgo = null; @@ -732,7 +750,10 @@ public static BenPersonalHabit getPersonalDetails(ArrayList personalHi if (null != personalHabits.getNumberperDay()) { tobaccoInfo.put("numberperDay", personalHabits.getNumberperDay().toString()); } - + if (null != personalHabits.getNumberperWeek()) { + tobaccoInfo.put("numberperWeek", personalHabits.getNumberperWeek().toString()); + } + timePeriod = Utility.convertTimeToWords(personalHabits.getTobaccoUseDuration(), personalHabits.getCreatedDate()); diff --git a/src/main/java/com/iemr/mmu/repo/nurse/anc/BenPersonalHabitRepo.java b/src/main/java/com/iemr/mmu/repo/nurse/anc/BenPersonalHabitRepo.java index 8ad5044f..be3d149d 100644 --- a/src/main/java/com/iemr/mmu/repo/nurse/anc/BenPersonalHabitRepo.java +++ b/src/main/java/com/iemr/mmu/repo/nurse/anc/BenPersonalHabitRepo.java @@ -39,7 +39,7 @@ public interface BenPersonalHabitRepo extends CrudRepository getBenLastVisitID(@Param("beneficiaryRegID") Long beneficiaryRegID); - @Query("select Date(createdDate), dietaryType, physicalActivityType, tobaccoUseStatus, tobaccoUseType, otherTobaccoUseType, numberperDay, " + @Query("select Date(createdDate), dietaryType, physicalActivityType, tobaccoUseStatus, tobaccoUseType, otherTobaccoUseType, numberperDay, numberperWeek, " + "Date(tobaccoUseDuration), riskySexualPracticesStatus from BenPersonalHabit a where a.beneficiaryRegID = :beneficiaryRegID " + "AND tobaccoUseStatus is not null AND deleted = false order by createdDate DESC") public ArrayList getBenPersonalTobaccoHabitDetail(@Param("beneficiaryRegID") Long beneficiaryRegID); @@ -51,7 +51,7 @@ public interface BenPersonalHabitRepo extends CrudRepository getBenPersonalAlcoholHabitDetail(@Param("beneficiaryRegID") Long beneficiaryRegID); @Query(" SELECT beneficiaryRegID, benVisitID, providerServiceMapID, dietaryType, physicalActivityType, tobaccoUseStatus, tobaccoUseTypeID, " - + "tobaccoUseType, otherTobaccoUseType, numberperDay, tobaccoUseDuration, alcoholIntakeStatus, alcoholTypeID, " + + "tobaccoUseType, otherTobaccoUseType, numberperDay, numberperWeek, tobaccoUseDuration, alcoholIntakeStatus, alcoholTypeID, " + "alcoholType, otherAlcoholType, alcoholIntakeFrequency, avgAlcoholConsumption, alcoholDuration, riskySexualPracticesStatus, createdDate, visitCode " + "FROM BenPersonalHabit WHERE beneficiaryRegID = :benRegID AND deleted = false AND visitCode = :visitCode") public ArrayList getBenPersonalHabitDetail(@Param("benRegID") Long benRegID, diff --git a/src/main/java/com/iemr/mmu/service/common/transaction/CommonNurseServiceImpl.java b/src/main/java/com/iemr/mmu/service/common/transaction/CommonNurseServiceImpl.java index 4326df40..0fedb10d 100644 --- a/src/main/java/com/iemr/mmu/service/common/transaction/CommonNurseServiceImpl.java +++ b/src/main/java/com/iemr/mmu/service/common/transaction/CommonNurseServiceImpl.java @@ -1085,6 +1085,11 @@ public String fetchBenPersonalTobaccoHistory(Long beneficiaryRegID) { column.put("keyName", "numberperDay"); columns.add(column); + column = new HashMap(); + column.put("columnName", "Number Per Week"); + column.put("keyName", "numberperWeek"); + columns.add(column); + column = new HashMap(); column.put("columnName", "Tobacco Use Start Date"); column.put("keyName", "tobacco_use_duration"); @@ -1100,8 +1105,8 @@ public String fetchBenPersonalTobaccoHistory(Long beneficiaryRegID) { for (Object[] obj : benPersonalHabits) { BenPersonalHabit benPersonalHabit = new BenPersonalHabit((Date) obj[0], (String) obj[1], - (String) obj[2], (String) obj[3], (String) obj[4], (String) obj[5], (Short) obj[6], - (Date) obj[7], (Character) obj[8]); + (String) obj[2], (String) obj[3], (String) obj[4], (String) obj[5], (Short) obj[6], (Short) obj[7], + (Date) obj[8], (Character) obj[9]); personalHabits.add(benPersonalHabit); } From cd5cffbeb95f7cf4fe12f4ff9832dcf9afc1f639 Mon Sep 17 00:00:00 2001 From: Amoghavarsh <93114621+5Amogh@users.noreply.github.com> Date: Mon, 21 Jul 2025 11:57:09 +0530 Subject: [PATCH 03/47] Update version in pom.xml to 3.4.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index eeef30e2..e436c7bb 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 com.iemr.mmu mmu-api - 3.1.0 + 3.4.0 war MMU-API From 16c39912c602ee2a9c7770a607b3a07f67460b67 Mon Sep 17 00:00:00 2001 From: Vanitha S <116701245+vanitha1822@users.noreply.github.com> Date: Mon, 21 Jul 2025 14:34:15 +0530 Subject: [PATCH 04/47] chore: add Lombok @Data to BenClinicalObservations (#97) --- .../mmu/data/quickConsultation/BenClinicalObservations.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/iemr/mmu/data/quickConsultation/BenClinicalObservations.java b/src/main/java/com/iemr/mmu/data/quickConsultation/BenClinicalObservations.java index 3d2941c1..96721ce6 100644 --- a/src/main/java/com/iemr/mmu/data/quickConsultation/BenClinicalObservations.java +++ b/src/main/java/com/iemr/mmu/data/quickConsultation/BenClinicalObservations.java @@ -34,7 +34,10 @@ import com.google.gson.annotations.Expose; +import lombok.Data; + @Entity +@Data @Table(name = "t_benclinicalobservation") public class BenClinicalObservations { @Id From b66035cdf1b1da7bdaba74bc8637b748d4a33978 Mon Sep 17 00:00:00 2001 From: Vanitha S <116701245+vanitha1822@users.noreply.github.com> Date: Fri, 25 Jul 2025 14:55:13 +0530 Subject: [PATCH 05/47] fix: add file path in cancer gynecological examination (#98) --- .../mmu/data/doctor/CancerGynecologicalExamination.java | 8 ++++++++ .../iemr/mmu/service/cancerScreening/CSServiceImpl.java | 6 ++++++ 2 files changed, 14 insertions(+) diff --git a/src/main/java/com/iemr/mmu/data/doctor/CancerGynecologicalExamination.java b/src/main/java/com/iemr/mmu/data/doctor/CancerGynecologicalExamination.java index fb1ab66f..a63bbc9b 100644 --- a/src/main/java/com/iemr/mmu/data/doctor/CancerGynecologicalExamination.java +++ b/src/main/java/com/iemr/mmu/data/doctor/CancerGynecologicalExamination.java @@ -33,9 +33,12 @@ import jakarta.persistence.Transient; import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonProperty; import com.google.gson.annotations.Expose; +import lombok.Data; @Entity +@Data @Table(name = "t_cancergynecologicalexamination") public class CancerGynecologicalExamination { @Id @@ -92,6 +95,11 @@ public class CancerGynecologicalExamination { @Column(name = "RTIOrSTIDetail") private String rTIOrSTIDetail; + @Expose + @Transient + @JsonProperty("fileIDs") + private List fileIDs; + @Expose @Column(name = "FilePath") private String filePath; diff --git a/src/main/java/com/iemr/mmu/service/cancerScreening/CSServiceImpl.java b/src/main/java/com/iemr/mmu/service/cancerScreening/CSServiceImpl.java index c65f38f2..9a97fbcb 100644 --- a/src/main/java/com/iemr/mmu/service/cancerScreening/CSServiceImpl.java +++ b/src/main/java/com/iemr/mmu/service/cancerScreening/CSServiceImpl.java @@ -977,6 +977,12 @@ public Long saveBenExaminationDetails(JsonObject requestOBJ, Long benVisitID, St .fromJson(examinationOBJ.get("gynecologicalDetails"), CancerGynecologicalExamination.class); cancerGynecologicalExamination.setBenVisitID(benVisitID); cancerGynecologicalExamination.setVisitCode(benVisitCode); + + if (cancerGynecologicalExamination.getFileIDs() != null) { + cancerGynecologicalExamination.setFilePath( + String.join(",", cancerGynecologicalExamination.getFileIDs())); + } + Long ID = cSNurseServiceImpl.saveCancerGynecologicalExaminationData(cancerGynecologicalExamination); if (ID != null && ID > 0) { // gynecologicalDetails stored successfully... From d878d4b1037a8debbe285cfdfbe2d8f393c993fa Mon Sep 17 00:00:00 2001 From: Vanitha S <116701245+vanitha1822@users.noreply.github.com> Date: Wed, 30 Jul 2025 11:04:36 +0530 Subject: [PATCH 06/47] Fix the data sync issue (#93) * fix: Data Sync batch processing for large data * fix: use parameterized query * fix: revert the updated query * fix: add token if it is missing while calling restTemplate * fix: update the properties * fix: sync group wise * fix: enable logger in pom.xml * fix: coderabbit comments * fix: remove logger and replace the license * fix: remove the logs * fix: resolve code scanning alert * fix: resolve code scanning alert * fix: resolve code scanning alert * fix: resolve code scanning alert * fix: add comment for code violation * fix: use syncuploaddataDigester class to load the deatils * fix: add syncuploaddigestor in implementation file too * fix: sonarcube comments --- pom.xml | 14 +- .../MMUDataSyncVanToServer.java | 11 +- .../DataSyncRepositoryCentral.java | 348 +++---- .../GetDataFromVanAndSyncToDBImpl.java | 952 +++++++++++------- .../com/iemr/mmu/utils/RestTemplateUtil.java | 45 +- src/main/resources/application.properties | 7 + 6 files changed, 848 insertions(+), 529 deletions(-) diff --git a/pom.xml b/pom.xml index e436c7bb..b0e8639c 100644 --- a/pom.xml +++ b/pom.xml @@ -47,12 +47,22 @@ org.springframework.boot spring-boot-starter - + + + + org.slf4j + slf4j-api + ${slf4j.version} + + + org.slf4j + slf4j-simple + ${slf4j.version} co.elastic.logging diff --git a/src/main/java/com/iemr/mmu/controller/dataSyncLayerCentral/MMUDataSyncVanToServer.java b/src/main/java/com/iemr/mmu/controller/dataSyncLayerCentral/MMUDataSyncVanToServer.java index dedad0eb..eeb54e9f 100644 --- a/src/main/java/com/iemr/mmu/controller/dataSyncLayerCentral/MMUDataSyncVanToServer.java +++ b/src/main/java/com/iemr/mmu/controller/dataSyncLayerCentral/MMUDataSyncVanToServer.java @@ -36,9 +36,11 @@ import com.iemr.mmu.service.dataSyncLayerCentral.FetchDownloadDataImpl; import com.iemr.mmu.service.dataSyncLayerCentral.GetDataFromVanAndSyncToDBImpl; import com.iemr.mmu.service.dataSyncLayerCentral.GetMasterDataFromCentralForVanImpl; +import com.iemr.mmu.utils.CookieUtil; import com.iemr.mmu.utils.response.OutputResponse; import io.swagger.v3.oas.annotations.Operation; +import jakarta.servlet.http.HttpServletRequest; /*** * @operation Class used for data sync from van-to-server & server-to-van @@ -58,10 +60,15 @@ public class MMUDataSyncVanToServer { @Operation(summary = "Sync data from van-to-server") @PostMapping(value = { "/van-to-server" }, consumes = "application/json", produces = "application/json") public String dataSyncToServer(@RequestBody String requestOBJ, - @RequestHeader(value = "Authorization") String Authorization) { + @RequestHeader(value = "Authorization") String Authorization, HttpServletRequest request) { OutputResponse response = new OutputResponse(); + + logger.info("test: vanto server auth="+Authorization); try { - String s = getDataFromVanAndSyncToDBImpl.syncDataToServer(requestOBJ, Authorization); + String jwtToken = CookieUtil.getJwtTokenFromCookie(request); + logger.info("test: vanto server token="+jwtToken); + + String s = getDataFromVanAndSyncToDBImpl.syncDataToServer(requestOBJ, Authorization, jwtToken); if (s != null) response.setResponse(s); else diff --git a/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/DataSyncRepositoryCentral.java b/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/DataSyncRepositoryCentral.java index 6b62af69..175de980 100644 --- a/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/DataSyncRepositoryCentral.java +++ b/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/DataSyncRepositoryCentral.java @@ -25,6 +25,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.Set; import javax.sql.DataSource; @@ -34,175 +35,186 @@ import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; -/*** - * - * @author NE298657 - * - */ +import com.iemr.mmu.data.syncActivity_syncLayer.SyncUploadDataDigester; @Service public class DataSyncRepositoryCentral { - @Autowired - private DataSource dataSource; - - private JdbcTemplate jdbcTemplate; - - private JdbcTemplate getJdbcTemplate() { - return new JdbcTemplate(dataSource); - - } - - private Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName()); - - // Data Upload Repository - public int checkRecordIsAlreadyPresentOrNot(String schemaName, String tableName, String vanSerialNo, String vanID, - String vanAutoIncColumnName, int syncFacilityID) { - jdbcTemplate = getJdbcTemplate(); - - List params = new ArrayList<>(); - - StringBuilder queryBuilder = new StringBuilder("SELECT "); - queryBuilder.append(vanAutoIncColumnName); - queryBuilder.append(" FROM "); - queryBuilder.append(schemaName+"."+tableName); - - //params.add(vanAutoIncColumnName); - //params.add(schemaName); - //params.add(tableName); - - StringBuilder whereClause = new StringBuilder(); - whereClause.append(" WHERE "); - whereClause.append("VanSerialNo = ?"); - params.add(vanSerialNo); - - if ((tableName.equalsIgnoreCase("t_patientissue") || tableName.equalsIgnoreCase("t_physicalstockentry") - || tableName.equalsIgnoreCase("t_stockadjustment") || tableName.equalsIgnoreCase("t_saitemmapping") - || tableName.equalsIgnoreCase("t_stocktransfer") || tableName.equalsIgnoreCase("t_patientreturn") - || tableName.equalsIgnoreCase("t_facilityconsumption") || tableName.equalsIgnoreCase("t_indent") - || tableName.equalsIgnoreCase("t_indentorder") || tableName.equalsIgnoreCase("t_indentissue") - || tableName.equalsIgnoreCase("t_itemstockentry") || tableName.equalsIgnoreCase("t_itemstockexit")) - && syncFacilityID > 0) { - - whereClause.append(" AND "); - whereClause.append("SyncFacilityID = ?"); - params.add(syncFacilityID); - - } - - else { - - whereClause.append(" AND "); - whereClause.append("VanID = ?"); - params.add(vanID); - - } - - queryBuilder.append(whereClause); - String query = queryBuilder.toString(); - Object[] queryParams = params.toArray(); - List> resultSet = jdbcTemplate.queryForList(query, queryParams); - if (resultSet != null && resultSet.size() > 0) - return 1; - else - return 0; - } - - // Method for synchronization of data to central DB - public int[] syncDataToCentralDB(String schema, String tableName, String serverColumns, String query, - List syncDataList) { - jdbcTemplate = getJdbcTemplate(); - if (query.startsWith("INSERT")) { - for (int i = 0; i < syncDataList.size(); i++) { - Object[] array = syncDataList.get(i);// Arrey 1 - - if (query.startsWith("INSERT")) { -// array = new Object[] {serverColumns, array }; - syncDataList.set(i, array); - } - } - } else { - for (int i = 0; i < syncDataList.size(); i++) { - - Object[] array = syncDataList.get(i);// Arrey 1 - String[] columnsArray = null; - if(null != serverColumns) - columnsArray = serverColumns.split(","); // arrey 2 - - List Newarray = new ArrayList<>(); - - int arrayIndex = 0; - int columnsArrayIndex = 0; - //Newarray.add(schema); - //Newarray.add(tableName); - //while (columnsArrayIndex < columnsArray.length || arrayIndex < array.length) { - if (null != columnsArray && columnsArrayIndex < columnsArray.length) { - Newarray.add(columnsArray[columnsArrayIndex]); - columnsArrayIndex++; - } - - /* - * if (arrayIndex < array.length) { Newarray.add(array); arrayIndex++; } - */ - //} - - // Convert Newarray back to an array - //Object[] resultArray = Newarray.toArray(new Object[0]); - syncDataList.set(i, array); - - } - } - // start batch insert/update - int[] i = jdbcTemplate.batchUpdate(query, syncDataList); - return i; - - } - - // End of Data Upload Repository - - public List> getMasterDataFromTable(String schema, String table, String columnNames, - String masterType, Timestamp lastDownloadDate, Integer vanID, Integer psmID) throws Exception { - jdbcTemplate = getJdbcTemplate(); - List> resultSetList =new ArrayList<>(); - String baseQuery = ""; - if (masterType != null) { - if (lastDownloadDate != null) { - if (masterType.equalsIgnoreCase("A")) { - baseQuery += " SELECT " + columnNames + " FROM " + schema + "." + table - + " WHERE LastModDate >= ? "; - resultSetList = jdbcTemplate.queryForList(baseQuery,lastDownloadDate); - - } - else if (masterType.equalsIgnoreCase("V")) { - baseQuery += " SELECT " + columnNames + " FROM " + schema + "." + table - + " WHERE LastModDate >= ? AND VanID = ? "; - resultSetList = jdbcTemplate.queryForList(baseQuery,lastDownloadDate,vanID); - } - else if (masterType.equalsIgnoreCase("P")) { - baseQuery += " SELECT " + columnNames + " FROM " + schema + "." + table - + " WHERE LastModDate >= ? AND ProviderServiceMapID = ? "; - resultSetList = jdbcTemplate.queryForList(baseQuery,lastDownloadDate,psmID); - } - } else { - if (masterType.equalsIgnoreCase("A")) { - baseQuery += " SELECT " + columnNames + " FROM " + schema + "." + table; - resultSetList = jdbcTemplate.queryForList(baseQuery); - } - else if (masterType.equalsIgnoreCase("V")) { - baseQuery += " SELECT " + columnNames + " FROM " + schema + "." + table + " WHERE VanID = ? "; - resultSetList = jdbcTemplate.queryForList(baseQuery,vanID); - } - else if (masterType.equalsIgnoreCase("P")) { - baseQuery += " SELECT " + columnNames + " FROM " + schema + "." + table - + " WHERE ProviderServiceMapID = ? "; - resultSetList = jdbcTemplate.queryForList(baseQuery,psmID); - } - } - } - logger.info("Select query central: " + baseQuery); - logger.info("Last Downloaded Date " + lastDownloadDate); - logger.info("Result set Details: " + resultSetList); - return resultSetList; - } - - // End of Data Download Repository + @Autowired + private DataSource dataSource; + + private JdbcTemplate jdbcTemplate; + + private JdbcTemplate getJdbcTemplate() { + if (this.jdbcTemplate == null) { + this.jdbcTemplate = new JdbcTemplate(dataSource); + } + return this.jdbcTemplate; + } + + private final Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName()); + + private static final Set VALID_SCHEMAS = Set.of("public", "db_iemr"); + + private static final Set VALID_TABLES = Set.of( + "m_beneficiaryregidmapping", "i_beneficiaryaccount", "i_beneficiaryaddress", "i_beneficiarycontacts", + "i_beneficiarydetails", "i_beneficiaryfamilymapping", "i_beneficiaryidentity", "i_beneficiarymapping", + "t_benvisitdetail", "t_phy_anthropometry", "t_phy_vitals", "t_benadherence", "t_anccare", "t_pnccare", + "t_ncdscreening", "t_ncdcare", "i_ben_flow_outreach", "t_covid19", "t_idrsdetails", "t_physicalactivity", + "t_phy_generalexam", "t_phy_headtotoe", "t_sys_obstetric", "t_sys_gastrointestinal", "t_sys_cardiovascular", + "t_sys_respiratory", "t_sys_centralnervous", "t_sys_musculoskeletalsystem", "t_sys_genitourinarysystem", + "t_ancdiagnosis", "t_ncddiagnosis", "t_pncdiagnosis", "t_benchefcomplaint", "t_benclinicalobservation", + "t_prescription", "t_prescribeddrug", "t_lab_testorder", "t_benreferdetails", + "t_lab_testresult", "t_physicalstockentry", "t_patientissue", "t_facilityconsumption", "t_itemstockentry", + "t_itemstockexit", "t_benmedhistory", "t_femaleobstetrichistory", "t_benmenstrualdetails", + "t_benpersonalhabit", "t_childvaccinedetail1", "t_childvaccinedetail2", "t_childoptionalvaccinedetail", + "t_ancwomenvaccinedetail", "t_childfeedinghistory", "t_benallergyhistory", "t_bencomorbiditycondition", + "t_benmedicationhistory", "t_benfamilyhistory", "t_perinatalhistory", "t_developmenthistory", + "t_cancerfamilyhistory", "t_cancerpersonalhistory", "t_cancerdiethistory", "t_cancerobstetrichistory", + "t_cancervitals", "t_cancersignandsymptoms", "t_cancerlymphnode", "t_canceroralexamination", + "t_cancerbreastexamination", "t_cancerabdominalexamination", "t_cancergynecologicalexamination", + "t_cancerdiagnosis", "t_cancerimageannotation", "i_beneficiaryimage", "t_stockadjustment", + "t_stocktransfer", "t_patientreturn", "t_indent", "t_indentissue", "t_indentorder", "t_saitemmapping" + ); + + private boolean isValidDatabaseIdentifierCharacter(String identifier) { + return identifier != null && identifier.matches("^[a-zA-Z_][a-zA-Z0-9_]*$"); + } + + private boolean isValidSchemaName(String schemaName) { + return VALID_SCHEMAS.contains(schemaName.toLowerCase()); + } + + private boolean isValidTableName(String tableName) { + return VALID_TABLES.contains(tableName.toLowerCase()); + } + + private boolean isValidColumnNamesList(String columnNames) { + if (columnNames == null || columnNames.trim().isEmpty()) { + return false; + } + for (String col : columnNames.split(",")) { + if (!isValidDatabaseIdentifierCharacter(col.trim())) { + return false; + } + } + return true; + } + + public int checkRecordIsAlreadyPresentOrNot(String schemaName, String tableName, String vanSerialNo, String vanID, + String vanAutoIncColumnName, int syncFacilityID) { + jdbcTemplate = getJdbcTemplate(); + List params = new ArrayList<>(); + + if (!isValidSchemaName(schemaName) || !isValidTableName(tableName) || + !isValidDatabaseIdentifierCharacter(vanAutoIncColumnName)) { + logger.error("Invalid identifiers: schema={}, table={}, column={}", schemaName, tableName, vanAutoIncColumnName); + throw new IllegalArgumentException("Invalid identifiers provided."); + } + + StringBuilder queryBuilder = new StringBuilder("SELECT ") + .append(vanAutoIncColumnName).append(" FROM ") + .append(schemaName).append(".").append(tableName).append(" WHERE VanSerialNo = ?"); + + params.add(vanSerialNo); + + if (List.of("t_patientissue", "t_physicalstockentry", "t_stockadjustment", "t_saitemmapping", + "t_stocktransfer", "t_patientreturn", "t_facilityconsumption", "t_indent", + "t_indentorder", "t_indentissue", "t_itemstockentry", "t_itemstockexit").contains(tableName.toLowerCase()) && syncFacilityID > 0) { + queryBuilder.append(" AND SyncFacilityID = ?"); + params.add(syncFacilityID); + } else { + queryBuilder.append(" AND VanID = ?"); + params.add(vanID); + } + + try { + List> resultSet = jdbcTemplate.queryForList(queryBuilder.toString(), params.toArray()); + return (resultSet != null && !resultSet.isEmpty()) ? 1 : 0; + } catch (Exception e) { + logger.error("Error checking record presence: {}", e.getMessage(), e); + throw new RuntimeException("Failed to check record existence: " + e.getMessage(), e); + } + } + + public int[] syncDataToCentralDB(String schema, String tableName, String serverColumns, String query, + List syncDataList) { + jdbcTemplate = getJdbcTemplate(); + try { + return jdbcTemplate.batchUpdate(query, syncDataList); + } catch (Exception e) { + logger.error("Batch sync failed for table {}: {}", tableName, e.getMessage(), e); + throw new RuntimeException("Batch sync failed: " + e.getMessage(), e); + } + } + + public List> getMasterDataFromTable(String schema, String table, String columnNames, + String masterType, Timestamp lastDownloadDate, Integer vanID, Integer psmID) { + jdbcTemplate = getJdbcTemplate(); + List params = new ArrayList<>(); + + if (!isValidSchemaName(schema) || !isValidTableName(table) || !isValidColumnNamesList(columnNames)) { + throw new IllegalArgumentException("Invalid schema, table, or column names."); + } + + StringBuilder queryBuilder = new StringBuilder("SELECT ").append(columnNames) + .append(" FROM ").append(schema).append(".").append(table); + + if (masterType != null) { + if (lastDownloadDate != null) { + queryBuilder.append(" WHERE LastModDate >= ?"); + params.add(lastDownloadDate); + + if ("V".equalsIgnoreCase(masterType)) { + queryBuilder.append(" AND VanID = ?"); + params.add(vanID); + } else if ("P".equalsIgnoreCase(masterType)) { + queryBuilder.append(" AND ProviderServiceMapID = ?"); + params.add(psmID); + } + } else { + queryBuilder.append(" WHERE "); + if ("V".equalsIgnoreCase(masterType)) { + queryBuilder.append("VanID = ?"); + params.add(vanID); + } else if ("P".equalsIgnoreCase(masterType)) { + queryBuilder.append("ProviderServiceMapID = ?"); + params.add(psmID); + } + } + } + + try { + // Safe dynamic SQL: All dynamic parts (table names, columns, etc.) are validated or hardcoded. + // Parameter values are bound safely using prepared statement placeholders (?). + return jdbcTemplate.queryForList(queryBuilder.toString(), params.toArray()); + } catch (Exception e) { + logger.error("Error fetching master data: {}", e.getMessage(), e); + throw new RuntimeException("Failed to fetch master data: " + e.getMessage(), e); + } + } + + public List> getBatchForBenDetails(SyncUploadDataDigester digester, + String whereClause, int limit, int offset) { + jdbcTemplate = getJdbcTemplate(); + +String schema = digester.getSchemaName(); + String table = digester.getTableName(); + String columnNames = digester.getServerColumns(); + + + if (!isValidSchemaName(schema) || !isValidTableName(table) || !isValidColumnNamesList(columnNames)) { + throw new IllegalArgumentException("Invalid schema, table, or column names."); + } + // Safe dynamic SQL: Schema, table, and column names are validated against predefined whitelists. + // Only trusted values are used in the query string. + // limit and offset are passed as parameters to prevent SQL injection. + String query = String.format("SELECT %s FROM %s.%s %s LIMIT ? OFFSET ?", columnNames, schema, table, whereClause); //NOSONAR + + try { + return jdbcTemplate.queryForList(query, limit, offset); + } catch (Exception e) { + logger.error("Error fetching batch details: {}", e.getMessage(), e); + throw new RuntimeException("Failed to fetch batch data: " + e.getMessage(), e); + } + } } diff --git a/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java b/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java index d70404bb..2d88e6f6 100644 --- a/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java +++ b/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java @@ -21,365 +21,625 @@ */ package com.iemr.mmu.service.dataSyncLayerCentral; -import java.sql.Timestamp; -import java.text.DateFormat; -import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.Map; +import java.util.HashMap; +import java.util.Set; +import java.util.HashSet; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.fasterxml.jackson.databind.ObjectMapper; import com.iemr.mmu.data.syncActivity_syncLayer.SyncUploadDataDigester; -import com.iemr.mmu.utils.mapper.InputMapper; -/*** - * - * @author NE298657 - * - */ @Service public class GetDataFromVanAndSyncToDBImpl implements GetDataFromVanAndSyncToDB { - private static final String ServerColumnsNotRequired = null; - @Autowired - private DataSyncRepositoryCentral dataSyncRepositoryCentral; - - public String syncDataToServer(String requestOBJ, String Authorization) throws Exception { - - // feed sync request - ObjectMapper mapper = new ObjectMapper(); - SyncUploadDataDigester syncUploadDataDigester = mapper.readValue(requestOBJ, SyncUploadDataDigester.class); - /* - * SyncUploadDataDigester syncUploadDataDigester = - * InputMapper.gson().fromJson(requestOBJ, SyncUploadDataDigester.class); - */ - String syncTableName = syncUploadDataDigester.getTableName(); - if (syncUploadDataDigester != null && syncTableName != null - && syncTableName.equalsIgnoreCase("m_beneficiaryregidmapping")) { - String s = update_M_BeneficiaryRegIdMapping_for_provisioned_benID(syncUploadDataDigester); - return s; - } else { - - List> dataToBesync = syncUploadDataDigester.getSyncData(); - - Object[] objArr; - - // sync data 'list of object array' - List syncDataListInsert = new ArrayList<>(); - List syncDataListUpdate = new ArrayList<>(); - - int pointer; - String vanSerialNo; - String vanID; - int recordCheck; - int syncFacilityID = 0; - - for (Map map : dataToBesync) { - pointer = 0; - recordCheck = 0; - vanSerialNo = ""; - vanID = ""; - - vanSerialNo = String.valueOf(map.get(syncUploadDataDigester.getVanAutoIncColumnName())); - vanID = String.valueOf(map.get("VanID")); - - map.replace("SyncedBy", syncUploadDataDigester.getSyncedBy()); - - map.replace("date_format(SyncedDate,'%Y-%m-%d %H:%i:%s')", String.valueOf(LocalDateTime.now())); - - if (syncUploadDataDigester.getFacilityID() != null) { - Double changeDoubleToIntegerID = 0.0; - switch (syncTableName) { - case "t_indent": { - if (map.containsKey("FromFacilityID") && map.get("FromFacilityID") != null) { - changeDoubleToIntegerID = (Double) map.get("FromFacilityID"); - if (changeDoubleToIntegerID.intValue() == syncUploadDataDigester.getFacilityID()) - map.replace("Processed", "P"); - } - - } - case "t_indentorder": { - if (map.containsKey("FromFacilityID") && map.get("FromFacilityID") != null) - changeDoubleToIntegerID = (Double) map.get("FromFacilityID"); - if (changeDoubleToIntegerID.intValue() == syncUploadDataDigester.getFacilityID()) - map.replace("Processed", "P"); - } - case "t_indentissue": { - if (map.containsKey("ToFacilityID") && map.get("ToFacilityID") != null) { - changeDoubleToIntegerID = (Double) map.get("ToFacilityID"); - if (changeDoubleToIntegerID.intValue() == syncUploadDataDigester.getFacilityID()) - map.replace("Processed", "P"); - } - - } - // here a change in rule, will compare with toFacilityID - case "t_stocktransfer": { - if (map.containsKey("TransferToFacilityID") && map.get("TransferToFacilityID") != null) { - changeDoubleToIntegerID = (Double) map.get("TransferToFacilityID"); - if (changeDoubleToIntegerID.intValue() == syncUploadDataDigester.getFacilityID()) - map.replace("Processed", "P"); - } - - } - case "t_itemstockentry": { - - if (map.containsKey("FacilityID") && map.get("FacilityID") != null) { - changeDoubleToIntegerID = (Double) map.get("FacilityID"); - if (changeDoubleToIntegerID.intValue() == syncUploadDataDigester.getFacilityID()) - map.replace("Processed", "P"); - } - - } - default: - - } - - } - - if (map.containsKey("SyncFacilityID")) { - //double syncFaciltyID = (double) map.get("SyncFacilityID"); - syncFacilityID = (int) map.get("SyncFacilityID"); - } - - recordCheck = dataSyncRepositoryCentral.checkRecordIsAlreadyPresentOrNot( - syncUploadDataDigester.getSchemaName(), syncUploadDataDigester.getTableName(), vanSerialNo, - vanID, syncUploadDataDigester.getVanAutoIncColumnName(), syncFacilityID); - - if (recordCheck == 0) { - objArr = new Object[map.size()]; - } else { - objArr = new Object[map.size() + 2]; - } - - for (Map.Entry entry : map.entrySet()) { - if (entry.getValue() != null) { - if (String.valueOf(entry.getValue()).equalsIgnoreCase("false") - || String.valueOf(entry.getValue()).equalsIgnoreCase("true")) - objArr[pointer] = entry.getValue(); - else - objArr[pointer] = String.valueOf(entry.getValue()); - } else - objArr[pointer] = entry.getValue(); - - pointer++; - } - - if (recordCheck == 0) { - syncDataListInsert.add(objArr); - } else { - - - objArr[pointer] = String.valueOf(vanSerialNo); - - if ((syncTableName.equalsIgnoreCase("t_patientissue") - || syncTableName.equalsIgnoreCase("t_physicalstockentry") - || syncTableName.equalsIgnoreCase("t_stockadjustment") - || syncTableName.equalsIgnoreCase("t_saitemmapping") - || syncTableName.equalsIgnoreCase("t_stocktransfer") - || syncTableName.equalsIgnoreCase("t_patientreturn") - || syncTableName.equalsIgnoreCase("t_facilityconsumption") - || syncTableName.equalsIgnoreCase("t_indent") - || syncTableName.equalsIgnoreCase("t_indentorder") - || syncTableName.equalsIgnoreCase("t_indentissue") - || syncTableName.equalsIgnoreCase("t_itemstockentry") - || syncTableName.equalsIgnoreCase("t_itemstockexit")) - && map.containsKey("SyncFacilityID")) { - - objArr[pointer + 1] = String.valueOf(map.get("SyncFacilityID")); - } else - objArr[pointer + 1] = String.valueOf(vanID); - - syncDataListUpdate.add(objArr); - } - - } - - int[] i = null; - if (syncDataListInsert != null && syncDataListInsert.size() > 0) { - // schema name hard coded(Insert query builder) - String queryInsert = getQueryToInsertDataToServerDB(syncUploadDataDigester.getSchemaName(), - syncUploadDataDigester.getTableName(),syncUploadDataDigester.getServerColumns()); - - // call repository to execute the query with given data list(Insert) - i = dataSyncRepositoryCentral.syncDataToCentralDB( - syncUploadDataDigester.getSchemaName(), - syncUploadDataDigester.getTableName(), syncUploadDataDigester.getServerColumns(), queryInsert, - syncDataListInsert); - } - - int[] j = null; - if (syncDataListUpdate != null && syncDataListUpdate.size() > 0) { - // schema name hard coded(Update query builder) - String queryUpdate = getQueryToUpdateDataToServerDB(syncUploadDataDigester.getSchemaName(), syncUploadDataDigester.getServerColumns(), - syncUploadDataDigester.getTableName()); - - // call repository to execute the query with given data list(Update) - j = dataSyncRepositoryCentral.syncDataToCentralDB(syncUploadDataDigester.getSchemaName(), - syncUploadDataDigester.getTableName(), ServerColumnsNotRequired, queryUpdate, - syncDataListUpdate); - } - - // validating if data sync successfully - if ((i != null && syncDataListInsert.size() != i.length) - || (j != null && syncDataListUpdate.size() != j.length)) - return null; - else - return "data sync passed"; - - } - - } - - public String update_M_BeneficiaryRegIdMapping_for_provisioned_benID( - SyncUploadDataDigester syncUploadDataDigester) { - String returnOBJ = null; - List> dataToBesync = syncUploadDataDigester.getSyncData(); - - Object[] objArr; - // sync data 'list of object array' - List syncData = new ArrayList<>(); - - String query = getqueryFor_M_BeneficiaryRegIdMapping(syncUploadDataDigester.getSchemaName(), - syncUploadDataDigester.getTableName()); - - for (Map map : dataToBesync) { - if (map.get("BenRegId") != null && map.get("BeneficiaryID") != null && map.get("VanID") != null) { - objArr = new Object[4]; - objArr[0] = String.valueOf(syncUploadDataDigester.getSyncedBy()); - objArr[1] = String.valueOf(map.get("BenRegId")); - objArr[2] = String.valueOf(map.get("BeneficiaryID")); - objArr[3] = String.valueOf(map.get("VanID")); - - syncData.add(objArr); - } - } - int[] i = null; - - if (syncData != null && syncData.size() > 0) { - i = dataSyncRepositoryCentral.syncDataToCentralDB(syncUploadDataDigester.getSchemaName(), - syncUploadDataDigester.getTableName(), ServerColumnsNotRequired, query, syncData); - - if (i.length == syncData.size()) { - returnOBJ = "data sync passed"; - } - } else { - returnOBJ = "data sync passed"; - } - - return returnOBJ; - - } - - private String getqueryFor_M_BeneficiaryRegIdMapping(String schemaName, String tableName) { - - StringBuilder queryBuilder = new StringBuilder(" UPDATE "); - queryBuilder.append(schemaName+"."+tableName); - queryBuilder.append(" SET "); - queryBuilder.append("Provisioned = true, SyncedDate = now(), syncedBy = ?"); - queryBuilder.append(" WHERE "); - queryBuilder.append(" BenRegId = ? "); - queryBuilder.append(" AND "); - queryBuilder.append(" BeneficiaryID = ? "); - queryBuilder.append(" AND "); - queryBuilder.append(" VanID = ? "); - String query = queryBuilder.toString(); - return query; - } - - public String getQueryToInsertDataToServerDB(String schemaName, String tableName, String serverColumns) { - String[] columnsArr = null; - if (serverColumns != null) - columnsArr = serverColumns.split(","); - - StringBuilder preparedStatementSetter = new StringBuilder(); - /// StringBuilder updateStatement = new StringBuilder(); - - if (columnsArr != null && columnsArr.length > 0) { - int index = 0; - for (String column : columnsArr) { - if (index == columnsArr.length - 1) { - preparedStatementSetter.append(" ? "); - - } else { - preparedStatementSetter.append(" ?, "); - - } - index++; - } - } - /* - * String query = "INSERT INTO " + schemaName + "." + tableName + "( " + - * serverColumns + ") VALUES ( " + preparedStatementSetter + " ) "; - */ - - StringBuilder queryBuilder = new StringBuilder("INSERT INTO "); - queryBuilder.append(schemaName + "." + tableName); - queryBuilder.append("("); -// queryBuilder.append("?"); - queryBuilder.append(serverColumns); - queryBuilder.append(") VALUES ("); - queryBuilder.append(preparedStatementSetter); - queryBuilder.append(") "); - String query = queryBuilder.toString(); - - return query; - } - - public String getQueryToUpdateDataToServerDB(String schemaName, String serverColumns, String tableName) { - String[] columnsArr = null; - if (serverColumns != null) - columnsArr = serverColumns.split(","); - - StringBuilder preparedStatementSetter = new StringBuilder(); - - if (columnsArr != null && columnsArr.length > 0) { - int index = 0; - for (String column : columnsArr) { - if (index == columnsArr.length - 1) { - preparedStatementSetter.append(column); - preparedStatementSetter.append("= ?"); - } else { - preparedStatementSetter.append(column); - preparedStatementSetter.append("= ?, "); - } - index++; - } - } - - if (tableName.equalsIgnoreCase("t_patientissue") || tableName.equalsIgnoreCase("t_physicalstockentry") - || tableName.equalsIgnoreCase("t_stockadjustment") || tableName.equalsIgnoreCase("t_saitemmapping") - || tableName.equalsIgnoreCase("t_stocktransfer") || tableName.equalsIgnoreCase("t_patientreturn") - || tableName.equalsIgnoreCase("t_facilityconsumption") || tableName.equalsIgnoreCase("t_indent") - || tableName.equalsIgnoreCase("t_indentorder") || tableName.equalsIgnoreCase("t_indentissue") - || tableName.equalsIgnoreCase("t_itemstockentry") || tableName.equalsIgnoreCase("t_itemstockexit")) { - - StringBuilder queryBuilder = new StringBuilder(" UPDATE "); - queryBuilder.append(schemaName+"."+tableName); - queryBuilder.append(" SET "); - queryBuilder.append(preparedStatementSetter); - queryBuilder.append(" WHERE "); - queryBuilder.append(" VanSerialNo =? "); - queryBuilder.append(" AND "); - queryBuilder.append(" SyncFacilityID = ? "); - String query = queryBuilder.toString(); - return query; - } else { - StringBuilder queryBuilder = new StringBuilder(" UPDATE "); - queryBuilder.append(schemaName+"."+tableName); - queryBuilder.append(" SET "); - queryBuilder.append(preparedStatementSetter); - queryBuilder.append(" WHERE "); - queryBuilder.append(" VanSerialNo =? "); - queryBuilder.append(" AND "); - queryBuilder.append(" VanID = ? "); - String query = queryBuilder.toString(); - return query; - } - - } + private static final String SERVER_COLUMNS_NOT_REQUIRED = null; // Renamed for clarity + private static final Logger logger = LoggerFactory.getLogger(GetDataFromVanAndSyncToDBImpl.class); + + @Autowired + private DataSyncRepositoryCentral dataSyncRepositoryCentral; + + private static final Map> TABLE_GROUPS = new HashMap<>(); + private static final Set VALID_SCHEMAS = new HashSet<>(Arrays.asList("public", "db_iemr")); // Add your actual schema names + private static final Set VALID_TABLES = new HashSet<>(Arrays.asList( + "m_beneficiaryregidmapping", "i_beneficiaryaccount","i_beneficiaryaddress","i_beneficiarycontacts","i_beneficiarydetails","i_beneficiaryfamilymapping","i_beneficiaryidentity","i_beneficiarymapping", + "t_benvisitdetail","t_phy_anthropometry","t_phy_vitals","t_benadherence","t_anccare","t_pnccare","t_ncdscreening","t_ncdcare","i_ben_flow_outreach","t_covid19","t_idrsdetails","t_physicalactivity", + "t_phy_generalexam","t_phy_headtotoe","t_sys_obstetric","t_sys_gastrointestinal","t_sys_cardiovascular","t_sys_respiratory","t_sys_centralnervous","t_sys_musculoskeletalsystem","t_sys_genitourinarysystem", + "t_ancdiagnosis","t_ncddiagnosis","t_pncdiagnosis","t_benchefcomplaint","t_benclinicalobservation","t_prescription","t_prescribeddrug","t_lab_testorder","t_benreferdetails", + "t_lab_testresult","t_physicalstockentry","t_patientissue","t_facilityconsumption","t_itemstockentry","t_itemstockexit", + "t_benmedhistory","t_femaleobstetrichistory","t_benmenstrualdetails","t_benpersonalhabit","t_childvaccinedetail1","t_childvaccinedetail2","t_childoptionalvaccinedetail","t_ancwomenvaccinedetail","t_childfeedinghistory","t_benallergyhistory","t_bencomorbiditycondition","t_benmedicationhistory","t_benfamilyhistory","t_perinatalhistory","t_developmenthistory", + "t_cancerfamilyhistory","t_cancerpersonalhistory","t_cancerdiethistory","t_cancerobstetrichistory","t_cancervitals","t_cancersignandsymptoms","t_cancerlymphnode","t_canceroralexamination","t_cancerbreastexamination","t_cancerabdominalexamination","t_cancergynecologicalexamination","t_cancerdiagnosis","t_cancerimageannotation", + "i_beneficiaryimage", + "t_stockadjustment","t_stocktransfer","t_patientreturn","t_indent","t_indentissue","t_indentorder","t_saitemmapping" + )); + + static { + + TABLE_GROUPS.put(1, Arrays.asList("m_beneficiaryregidmapping", "i_beneficiaryaccount","i_beneficiaryaddress","i_beneficiarycontacts","i_beneficiarydetails","i_beneficiaryfamilymapping","i_beneficiaryidentity","i_beneficiarymapping")); + + TABLE_GROUPS.put(2, Arrays.asList("t_benvisitdetail","t_phy_anthropometry","t_phy_vitals","t_benadherence","t_anccare","t_pnccare","t_ncdscreening","t_ncdcare","i_ben_flow_outreach","t_covid19","t_idrsdetails","t_physicalactivity")); + + TABLE_GROUPS.put(3, Arrays.asList("t_phy_generalexam","t_phy_headtotoe","t_sys_obstetric","t_sys_gastrointestinal","t_sys_cardiovascular","t_sys_respiratory","t_sys_centralnervous","t_sys_musculoskeletalsystem","t_sys_genitourinarysystem")); + + TABLE_GROUPS.put(4, Arrays.asList("t_ancdiagnosis","t_ncddiagnosis","t_pncdiagnosis","t_benchefcomplaint","t_benclinicalobservation","t_prescription","t_prescribeddrug","t_lab_testorder","t_benreferdetails")); + + TABLE_GROUPS.put(5, Arrays.asList("t_lab_testresult","t_physicalstockentry","t_patientissue","t_facilityconsumption","t_itemstockentry","t_itemstockexit")); + + TABLE_GROUPS.put(6, Arrays.asList("t_benmedhistory","t_femaleobstetrichistory","t_benmenstrualdetails","t_benpersonalhabit","t_childvaccinedetail1","t_childvaccinedetail2","t_childoptionalvaccinedetail","t_ancwomenvaccinedetail","t_childfeedinghistory","t_benallergyhistory","t_bencomorbiditycondition","t_benmedicationhistory","t_benfamilyhistory","t_perinatalhistory","t_developmenthistory")); + + TABLE_GROUPS.put(7, Arrays.asList("t_cancerfamilyhistory","t_cancerpersonalhistory","t_cancerdiethistory","t_cancerobstetrichistory","t_cancervitals","t_cancersignandsymptoms","t_cancerlymphnode","t_canceroralexamination","t_cancerbreastexamination","t_cancerabdominalexamination","t_cancergynecologicalexamination","t_cancerdiagnosis","t_cancerimageannotation")); + + TABLE_GROUPS.put(8, Arrays.asList("i_beneficiaryimage")); + + TABLE_GROUPS.put(9, Arrays.asList("t_itemstockentry","t_itemstockexit","t_patientissue","t_physicalstockentry","t_stockadjustment","t_stocktransfer","t_patientreturn","t_facilityconsumption","t_indent","t_indentissue","t_indentorder","t_saitemmapping")); + + } + + public String syncDataToServer(String requestOBJ, String Authorization, String token) throws Exception { + logger.info("Starting syncDataToServer. Token: {}", token); + ObjectMapper mapper = new ObjectMapper(); + SyncUploadDataDigester syncUploadDataDigester = mapper.readValue(requestOBJ, SyncUploadDataDigester.class); + + if (syncUploadDataDigester == null || syncUploadDataDigester.getTableName() == null) { + logger.error("Invalid SyncUploadDataDigester object or tableName is null."); + return "Error: Invalid sync request."; + } + + String syncTableName = syncUploadDataDigester.getTableName(); + String schemaName = syncUploadDataDigester.getSchemaName(); + + if (!isValidSchemaName(schemaName) || !isValidTableName(syncTableName)) { + logger.error("Invalid schema or table name provided: Schema='{}', Table='{}'.", schemaName, syncTableName); + return "Error: Invalid schema or table name."; + } + + + // Handle specific tables first, if their logic is distinct + if ("m_beneficiaryregidmapping".equalsIgnoreCase(syncTableName)) { + String result = update_M_BeneficiaryRegIdMapping_for_provisioned_benID(syncUploadDataDigester); + if ("data sync passed".equals(result)) { + return "Sync successful for m_beneficiaryregidmapping."; + } else { + logger.error("Sync failed for m_beneficiaryregidmapping: {}", result); + return "Sync failed for m_beneficiaryregidmapping."; + } + } + if ("i_beneficiarydetails".equalsIgnoreCase(syncTableName)) { + String result = update_I_BeneficiaryDetails_for_processed_in_batches(syncUploadDataDigester); + if ("data sync passed".equals(result)) { + return "Sync successful for i_beneficiarydetails."; + } else { + logger.error("Sync failed for i_beneficiarydetails: {}", result); + return "Sync failed for i_beneficiarydetails."; + } + } else { + // Determine the group for the current table or iterate through all if no specific table is given + boolean syncSuccess = true; + String errorMessage = ""; + + // If a specific table is provided in the request, try to find its group and sync only that table. + // Otherwise, iterate through all defined groups. + if (syncTableName != null && !syncTableName.isEmpty()) { + boolean foundInGroup = false; + for (Map.Entry> entry : TABLE_GROUPS.entrySet()) { + if (entry.getValue().contains(syncTableName.toLowerCase())) { + logger.info("Attempting to sync table '{}' from Group {}", syncTableName, entry.getKey()); + syncSuccess = syncTablesInGroup(syncUploadDataDigester.getSchemaName(), syncTableName, syncUploadDataDigester); + foundInGroup = true; + break; + } + } + if (!foundInGroup) { + logger.warn("Table '{}' not found in any predefined groups. Proceeding with generic sync logic.", syncTableName); + syncSuccess = performGenericTableSync(syncUploadDataDigester); + } + } else { + // If no specific table is in the request (e.g., a general sync trigger), iterate through groups + logger.info("No specific table provided. Attempting to sync all tables group by group."); + for (Map.Entry> entry : TABLE_GROUPS.entrySet()) { + Integer groupId = entry.getKey(); + List tablesInGroup = entry.getValue(); + logger.info("Starting sync for Group {}", groupId); + for (String table : tablesInGroup) { + if (!isValidTableName(table)) { + logger.error("Invalid table name '{}' encountered in group {}. Skipping.", table, groupId); + syncSuccess = false; + errorMessage += "Invalid table name: " + table + " in Group " + groupId + ". "; + continue; // Skip this table + } + + try { + + boolean currentTableSyncResult = syncTablesInGroup(syncUploadDataDigester.getSchemaName(), table, syncUploadDataDigester); + if (!currentTableSyncResult) { + syncSuccess = false; + errorMessage += "Failed to sync table: " + table + " in Group " + groupId + ". "; + logger.error("Sync failed for table '{}' in Group {}. Error: {}", table, groupId, errorMessage); + } else { + logger.info("Successfully synced table: {} in Group {}", table, groupId); + } + } catch (Exception e) { + syncSuccess = false; + errorMessage += "Exception during sync for table: " + table + " in Group " + groupId + ": " + e.getMessage() + ". "; + logger.error("Exception during sync for table '{}' in Group {}: {}", table, groupId, e.getMessage(), e); + } + } + } + } + + if (syncSuccess) { + logger.info("Overall data sync passed."); + return "Overall data sync passed."; + } else { + logger.info("Overall data sync failed. Details: " + errorMessage); + return "Overall data sync failed. Details: " + errorMessage; + } + } + } + + + private boolean syncTablesInGroup(String schemaName, String currentTableName, SyncUploadDataDigester originalDigester) { + logger.info("Attempting generic sync for table: {}", currentTableName); + + // Validate schemaName and currentTableName for safety before proceeding + if (!isValidSchemaName(schemaName) || !isValidTableName(currentTableName)) { + logger.error("Invalid schema or table name for group sync: Schema='{}', Table='{}'.", schemaName, currentTableName); + return false; // Fail fast if identifiers are invalid + } + + SyncUploadDataDigester tableSpecificDigester = new SyncUploadDataDigester(); + tableSpecificDigester.setSchemaName(schemaName); + tableSpecificDigester.setTableName(currentTableName); + tableSpecificDigester.setSyncedBy(originalDigester.getSyncedBy()); + tableSpecificDigester.setFacilityID(originalDigester.getFacilityID()); + tableSpecificDigester.setVanAutoIncColumnName(originalDigester.getVanAutoIncColumnName()); + tableSpecificDigester.setServerColumns(originalDigester.getServerColumns()); // Assuming serverColumns is generic or set per table + + tableSpecificDigester.setSyncData(originalDigester.getSyncData()); // Placeholder: Replace with actual data fetching + + return performGenericTableSync(tableSpecificDigester); + } + + + private String update_M_BeneficiaryRegIdMapping_for_provisioned_benID(SyncUploadDataDigester syncUploadDataDigester) { + logger.info("Processing update_M_BeneficiaryRegIdMapping_for_provisioned_benID for table: {}", syncUploadDataDigester.getTableName()); + + String schemaName = syncUploadDataDigester.getSchemaName(); + String tableName = syncUploadDataDigester.getTableName(); + + if (!isValidSchemaName(schemaName) || !isValidTableName(tableName)) { + logger.error("Invalid schema or table name provided for m_beneficiaryregidmapping update: Schema='{}', Table='{}'.", schemaName, tableName); + return "Error: Invalid schema or table name."; + } + + List> dataToBesync = syncUploadDataDigester.getSyncData(); + List syncData = new ArrayList<>(); + + String query = String.format("UPDATE %s.%s SET Provisioned = true, SyncedDate = now(), SyncedBy = ? WHERE BenRegId = ? AND BeneficiaryID = ? AND VanID = ?", schemaName, tableName); + + for (Map map : dataToBesync) { + if (map.get("BenRegId") != null && map.get("BeneficiaryID") != null && map.get("VanID") != null) { + Object[] objArr = new Object[4]; + objArr[0] = syncUploadDataDigester.getSyncedBy(); // SyncedBy + objArr[1] = String.valueOf(map.get("BenRegId")); + objArr[2] = String.valueOf(map.get("BeneficiaryID")); + objArr[3] = String.valueOf(map.get("VanID")); + syncData.add(objArr); + } else { + logger.warn("Skipping record in m_beneficiaryregidmapping due to missing BenRegId, BeneficiaryID, or VanID: {}", map); + } + } + + if (!syncData.isEmpty()) { + try { + int[] i = dataSyncRepositoryCentral.syncDataToCentralDB(schemaName, + tableName, SERVER_COLUMNS_NOT_REQUIRED, query, syncData); + + if (i.length == syncData.size()) { + logger.info("Successfully updated {} records for m_beneficiaryregidmapping.", i.length); + return "data sync passed"; + } else { + logger.error("Partial update for m_beneficiaryregidmapping. Expected {} updates, got {}. Failed records: {}", syncData.size(), i.length, getFailedRecords(i, syncData)); + return "Partial data sync for m_beneficiaryregidmapping."; + } + } catch (Exception e) { + logger.error("Exception during update for m_beneficiaryregidmapping: {}", e.getMessage(), e); + return "Error during sync for m_beneficiaryregidmapping: " + e.getMessage(); + } + } else { + logger.info("No data to sync for m_beneficiaryregidmapping."); + return "data sync passed"; + } + } + + + public String update_I_BeneficiaryDetails_for_processed_in_batches(SyncUploadDataDigester syncUploadDataDigester) { + logger.info("Processing update_I_BeneficiaryDetails_for_processed_in_batches for table: {}", syncUploadDataDigester.getTableName()); + String schemaName = syncUploadDataDigester.getSchemaName(); + String tableName = syncUploadDataDigester.getTableName(); + + if (!isValidSchemaName(schemaName) || !isValidTableName(tableName)) { + logger.error("Invalid schema or table name provided for i_beneficiarydetails update: Schema='{}', Table='{}'.", schemaName, tableName); + return "Error: Invalid schema or table name."; + } + + List syncData = new ArrayList<>(); // This list will hold data for batch updates to 'Processed' + + String updateQuery = getQueryFor_I_BeneficiaryDetails(schemaName, tableName); + + int limit = 1000; + int offset = 0; + int totalProcessed = 0; + + String whereClauseForBatchFetch = " WHERE Processed <> 'P' AND VanID IS NOT NULL "; // This is for fetching, not for update + + while (true) { + List> batchToFetch; + try { + batchToFetch = dataSyncRepositoryCentral.getBatchForBenDetails( + syncUploadDataDigester, + whereClauseForBatchFetch, + limit, + offset); + } catch (Exception e) { + logger.error("Error fetching batch for i_beneficiarydetails: {}", e.getMessage(), e); + return "Error fetching data for i_beneficiarydetails: " + e.getMessage(); + } + + if (batchToFetch.isEmpty()) { + break; + } + + for (Map map : batchToFetch) { + if (map.get("BeneficiaryDetailsId") != null && map.get("VanID") != null) { + Object[] params = new Object[3]; + params[0] = syncUploadDataDigester.getSyncedBy(); + params[1] = String.valueOf(map.get("BeneficiaryDetailsId")); + params[2] = String.valueOf(map.get("VanID")); + syncData.add(params); + } else { + logger.warn("Skipping record in i_beneficiarydetails due to missing BeneficiaryDetailsId or VanID: {}", map); + } + } + + if (!syncData.isEmpty()) { + try { + int[] batchUpdateResults = dataSyncRepositoryCentral.syncDataToCentralDB( + schemaName, + tableName, + SERVER_COLUMNS_NOT_REQUIRED, + updateQuery, + syncData); + + int successfulUpdates = 0; + for (int result : batchUpdateResults) { + if (result >= 1) { + successfulUpdates++; + } + } + totalProcessed += successfulUpdates; + logger.info("Batch update for i_beneficiarydetails: {} records processed, {} successfully updated.", syncData.size(), successfulUpdates); + + syncData.clear(); + offset += limit; + + } catch (Exception e) { + logger.error("Exception during batch update for i_beneficiarydetails: {}", e.getMessage(), e); + return "Error during sync for i_beneficiarydetails: " + e.getMessage(); + } + } else { + logger.info("No valid records in the current batch for i_beneficiarydetails to update."); + offset += limit; + } + } + + if (totalProcessed > 0) { + logger.info("Finished processing i_beneficiarydetails. Total records processed: {}", totalProcessed); + return "data sync passed"; + } else { + logger.info("No records were processed for i_beneficiarydetails."); + return "No data processed for i_beneficiarydetails."; + } + } + + private String getQueryFor_I_BeneficiaryDetails(String schemaName, String tableName) { + if (!isValidSchemaName(schemaName) || !isValidTableName(tableName)) { + logger.error("Invalid schema or table name for getQueryFor_I_BeneficiaryDetails: Schema='{}', Table='{}'.", schemaName, tableName); + throw new IllegalArgumentException("Invalid schema or table name provided."); + } + return String.format("UPDATE %s.%s SET Processed = 'P', SyncedDate = now(), SyncedBy = ? WHERE BeneficiaryDetailsId = ? AND VanID = ?", schemaName, tableName); + } + + + + private boolean performGenericTableSync(SyncUploadDataDigester syncUploadDataDigester) { + logger.info("Performing generic sync for table: {}", syncUploadDataDigester.getTableName()); + + String schemaName = syncUploadDataDigester.getSchemaName(); + String syncTableName = syncUploadDataDigester.getTableName(); + String vanAutoIncColumnName = syncUploadDataDigester.getVanAutoIncColumnName(); + String serverColumns = syncUploadDataDigester.getServerColumns(); + + if (!isValidSchemaName(schemaName) || !isValidTableName(syncTableName)) { + logger.error("Invalid schema or table name for generic sync: Schema='{}', Table='{}'.", schemaName, syncTableName); + return false; + } + + if (!isValidColumnNames(serverColumns)) { + logger.error("Invalid server columns provided for generic sync: {}", serverColumns); + return false; + } + + + List> dataToBesync = syncUploadDataDigester.getSyncData(); + List syncDataListInsert = new ArrayList<>(); + List syncDataListUpdate = new ArrayList<>(); + + if (dataToBesync == null || dataToBesync.isEmpty()) { + logger.info("No data to sync for table: {}", syncUploadDataDigester.getTableName()); + return true; // Nothing to sync, consider it a success + } + + Integer facilityIDFromDigester = syncUploadDataDigester.getFacilityID(); + + for (Map map : dataToBesync) { + String vanSerialNo = String.valueOf(map.get(vanAutoIncColumnName)); + String vanID = String.valueOf(map.get("VanID")); + int syncFacilityID = 0; + + map.put("SyncedBy", syncUploadDataDigester.getSyncedBy()); + map.put("SyncedDate", String.valueOf(LocalDateTime.now())); // Ensure column name matches DB + + if (facilityIDFromDigester != null) { + switch (syncTableName.toLowerCase()) { + case "t_indent": + case "t_indentorder": { + if (map.containsKey("FromFacilityID") && map.get("FromFacilityID") instanceof Double) { + Double fromFacilityID = (Double) map.get("FromFacilityID"); + if (fromFacilityID.intValue() == facilityIDFromDigester) { + map.put("Processed", "P"); + } + } + break; + } + case "t_indentissue": { + if (map.containsKey("ToFacilityID") && map.get("ToFacilityID") instanceof Double) { + Double toFacilityID = (Double) map.get("ToFacilityID"); + if (toFacilityID.intValue() == facilityIDFromDigester) { + map.put("Processed", "P"); + } + } + break; + } + case "t_stocktransfer": { + if (map.containsKey("TransferToFacilityID") && map.get("TransferToFacilityID") instanceof Double) { + Double transferToFacilityID = (Double) map.get("TransferToFacilityID"); + if (transferToFacilityID.intValue() == facilityIDFromDigester) { + map.put("Processed", "P"); + } + } + break; + } + case "t_itemstockentry": { + if (map.containsKey("FacilityID") && map.get("FacilityID") instanceof Double) { + Double mapFacilityID = (Double) map.get("FacilityID"); + if (mapFacilityID.intValue() == facilityIDFromDigester) { + map.put("Processed", "P"); + } + } + break; + } + default: + // No specific facility ID logic for other tables, maintain existing 'Processed' status or default + break; + } + } + + // Extract SyncFacilityID for checkRecordIsAlreadyPresentOrNot + if (map.containsKey("SyncFacilityID") && map.get("SyncFacilityID") instanceof Integer) { + syncFacilityID = (Integer) map.get("SyncFacilityID"); + } else if (map.containsKey("SyncFacilityID") && map.get("SyncFacilityID") instanceof Double) { + syncFacilityID = ((Double) map.get("SyncFacilityID")).intValue(); + } + + + int recordCheck; + try { + recordCheck = dataSyncRepositoryCentral.checkRecordIsAlreadyPresentOrNot( + schemaName, syncTableName, vanSerialNo, vanID, vanAutoIncColumnName, syncFacilityID); + } catch (Exception e) { + logger.error("Error checking record existence for table {}: VanSerialNo={}, VanID={}. Error: {}", syncTableName, vanSerialNo, vanID, e.getMessage(), e); + return false; // Critical error, stop sync for this table + } + + // Prepare Object array for insert/update + Object[] objArr; + List serverColumnsList = Arrays.asList(serverColumns.split(",")); + List currentRecordValues = new ArrayList<>(); + + for (String column : serverColumnsList) { + Object value = map.get(column.trim()); + // Handle boolean conversion if necessary, though String.valueOf should generally work for prepared statements + if (value instanceof Boolean) { + currentRecordValues.add(value); + } else if (value != null) { + currentRecordValues.add(String.valueOf(value)); + } else { + currentRecordValues.add(null); + } + } + + objArr = currentRecordValues.toArray(); + + if (recordCheck == 0) { + syncDataListInsert.add(objArr); + } else { + // For update, append the WHERE clause parameters at the end of the array + List updateParams = new ArrayList<>(Arrays.asList(objArr)); + updateParams.add(String.valueOf(vanSerialNo)); + + if (Arrays.asList("t_patientissue", "t_physicalstockentry", "t_stockadjustment", "t_saitemmapping", + "t_stocktransfer", "t_patientreturn", "t_facilityconsumption", "t_indent", + "t_indentorder", "t_indentissue", "t_itemstockentry", "t_itemstockexit") + .contains(syncTableName.toLowerCase()) && map.containsKey("SyncFacilityID")) { + updateParams.add(String.valueOf(map.get("SyncFacilityID"))); + } else { + updateParams.add(String.valueOf(vanID)); + } + syncDataListUpdate.add(updateParams.toArray()); + } + } + + boolean insertSuccess = true; + boolean updateSuccess = true; + + if (!syncDataListInsert.isEmpty()) { + String queryInsert = getQueryToInsertDataToServerDB(schemaName, syncTableName, serverColumns); + try { + int[] i = dataSyncRepositoryCentral.syncDataToCentralDB(schemaName, syncTableName, serverColumns, queryInsert, syncDataListInsert); + if (i.length != syncDataListInsert.size()) { + insertSuccess = false; + logger.error("Partial insert for table {}. Expected {} inserts, got {}. Failed records: {}", syncTableName, syncDataListInsert.size(), i.length, getFailedRecords(i, syncDataListInsert)); + } else { + logger.info("Successfully inserted {} records into table {}.", i.length, syncTableName); + } + } catch (Exception e) { + insertSuccess = false; + logger.error("Exception during insert for table {}: {}", syncTableName, e.getMessage(), e); + } + } + + if (!syncDataListUpdate.isEmpty()) { + String queryUpdate = getQueryToUpdateDataToServerDB(schemaName, serverColumns, syncTableName); + try { + int[] j = dataSyncRepositoryCentral.syncDataToCentralDB(schemaName, syncTableName, SERVER_COLUMNS_NOT_REQUIRED, queryUpdate, syncDataListUpdate); + if (j.length != syncDataListUpdate.size()) { + updateSuccess = false; + logger.error("Partial update for table {}. Expected {} updates, got {}. Failed records: {}", syncTableName, syncDataListUpdate.size(), j.length, getFailedRecords(j, syncDataListUpdate)); + } else { + logger.info("Successfully updated {} records in table {}.", j.length, syncTableName); + } + } catch (Exception e) { + updateSuccess = false; + logger.error("Exception during update for table {}: {}", syncTableName, e.getMessage(), e); + } + } + return insertSuccess && updateSuccess; + } + + private String getQueryToInsertDataToServerDB(String schemaName, String tableName, String serverColumns) { + if (!isValidSchemaName(schemaName) || !isValidTableName(tableName)) { + logger.error("Invalid schema or table name for getQueryToInsertDataToServerDB: Schema='{}', Table='{}'.", schemaName, tableName); + throw new IllegalArgumentException("Invalid schema or table name provided."); + } + if (!isValidColumnNames(serverColumns)) { + logger.error("Invalid server columns provided for getQueryToInsertDataToServerDB: {}", serverColumns); + throw new IllegalArgumentException("Invalid column names provided."); + } + + + String[] columnsArr = serverColumns.split(","); + StringBuilder preparedStatementSetter = new StringBuilder(); + + for (int i = 0; i < columnsArr.length; i++) { + preparedStatementSetter.append("?"); + if (i < columnsArr.length - 1) { + preparedStatementSetter.append(", "); + } + } + + return String.format("INSERT INTO %s.%s(%s) VALUES (%s)", schemaName, tableName, serverColumns, preparedStatementSetter.toString()); + } + + public String getQueryToUpdateDataToServerDB(String schemaName, String serverColumns, String tableName) { + if (!isValidSchemaName(schemaName) || !isValidTableName(tableName)) { + logger.error("Invalid schema or table name for getQueryToUpdateDataToServerDB: Schema='{}', Table='{}'.", schemaName, tableName); + throw new IllegalArgumentException("Invalid schema or table name provided."); + } + if (!isValidColumnNames(serverColumns)) { + logger.error("Invalid server columns provided for getQueryToUpdateDataToServerDB: {}", serverColumns); + throw new IllegalArgumentException("Invalid column names provided."); + } + + String[] columnsArr = serverColumns.split(","); + StringBuilder preparedStatementSetter = new StringBuilder(); + + for (int i = 0; i < columnsArr.length; i++) { + String column = columnsArr[i].trim(); + if (!isValidColumnName(column)) { + logger.error("Invalid individual column name encountered: {}", column); + throw new IllegalArgumentException("Invalid individual column name provided: " + column); + } + + preparedStatementSetter.append(column); + preparedStatementSetter.append(" = ?"); + if (i < columnsArr.length - 1) { + preparedStatementSetter.append(", "); + } + } + + StringBuilder queryBuilder = new StringBuilder(); + queryBuilder.append(String.format("UPDATE %s.%s SET %s WHERE VanSerialNo = ?", schemaName, tableName, preparedStatementSetter.toString())); + + + if (Arrays.asList("t_patientissue", "t_physicalstockentry", "t_stockadjustment", "t_saitemmapping", + "t_stocktransfer", "t_patientreturn", "t_facilityconsumption", "t_indent", + "t_indentorder", "t_indentissue", "t_itemstockentry", "t_itemstockexit") + .contains(tableName.toLowerCase())) { + queryBuilder.append(" AND SyncFacilityID = ? "); + } else { + queryBuilder.append(" AND VanID = ? "); + } + return queryBuilder.toString(); + } + + private boolean isValidSchemaName(String schemaName) { + return VALID_SCHEMAS.contains(schemaName.toLowerCase()); + } + + private boolean isValidTableName(String tableName) { + return VALID_TABLES.contains(tableName.toLowerCase()); + } + + private boolean isValidColumnName(String columnName) { + return columnName != null && columnName.matches("^[a-zA-Z_][a-zA-Z0-9_]*$"); + } + + private boolean isValidColumnNames(String columnNames) { + if (columnNames == null || columnNames.trim().isEmpty()) { + return false; + } + String[] cols = columnNames.split(","); + for (String col : cols) { + if (!isValidColumnName(col.trim())) { + return false; + } + } + return true; + } + + + private String getFailedRecords(int[] results, List data) { + List failedRecordsInfo = new ArrayList<>(); + for (int k = 0; k < results.length; k++) { + if (results[k] < 1) { + String idInfo = "N/A"; + if (data.get(k) != null && data.get(k).length > 0) { + idInfo = "Record data size: " + data.get(k).length; + } + failedRecordsInfo.add("Record at index " + k + " (Info: " + idInfo + ")"); + } + } + return String.join("; ", failedRecordsInfo); + } } \ No newline at end of file diff --git a/src/main/java/com/iemr/mmu/utils/RestTemplateUtil.java b/src/main/java/com/iemr/mmu/utils/RestTemplateUtil.java index cf07391c..2cbab41d 100644 --- a/src/main/java/com/iemr/mmu/utils/RestTemplateUtil.java +++ b/src/main/java/com/iemr/mmu/utils/RestTemplateUtil.java @@ -1,3 +1,24 @@ +/* +* AMRIT – Accessible Medical Records via Integrated Technology +* Integrated EHR (Electronic Health Records) Solution +* +* Copyright (C) "Piramal Swasthya Management and Research Institute" +* +* This file is part of AMRIT. +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see https://www.gnu.org/licenses/. +*/ package com.iemr.mmu.utils; import org.slf4j.Logger; @@ -23,16 +44,19 @@ public static HttpEntity createRequestEntity(Object body, String authori headers.add(HttpHeaders.AUTHORIZATION, "Bearer " + authorization); } - if (jwtToken == null || jwtToken.isEmpty()) { - ServletRequestAttributes attrs = - (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); - if (attrs != null) { - HttpServletRequest request = attrs.getRequest(); - try { - jwtToken = CookieUtil.getJwtTokenFromCookie(request); - } catch (Exception e) { - logger.error("Error while getting JWT token from cookie: {}", e.getMessage()); - } + ServletRequestAttributes attrs = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + + if ((jwtToken == null || jwtToken.isEmpty()) && attrs != null) { + HttpServletRequest request = attrs.getRequest(); + try { + jwtToken = CookieUtil.getJwtTokenFromCookie(request); + } catch (Exception e) { + logger.error("Error while getting JWT token from cookie: {}", e.getMessage()); + } + + String jwtTokenHeader = request.getHeader("JwtToken"); + if (jwtTokenHeader != null && !jwtTokenHeader.isEmpty()) { + jwtToken = jwtTokenHeader; } } @@ -41,7 +65,6 @@ public static HttpEntity createRequestEntity(Object body, String authori headers.add(HttpHeaders.COOKIE, "Jwttoken=" + jwtToken); } - return new HttpEntity<>(body, headers); } } \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index d172f4aa..2e6ce84f 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -7,6 +7,8 @@ spring.datasource.tomcat.remove-abandoned=true spring.datasource.tomcat.remove-abandoned-timeout=1800 spring.datasource.tomcat.logAbandoned=true spring.datasource.continue-on-error=true +spring.datasource.tomcat.max-wait=60000 + ## below line added by neeraj for reset abandoned DB connection from connection pool spring.datasource.tomcat.jdbc-interceptors=ResetAbandonedTimer @@ -46,3 +48,8 @@ logging.level.org.springframework=INFO spring.main.allow-circular-references=true spring.main.allow-bean-definition-overriding=true + +spring.datasource.tomcat.testOnBorrow=true +spring.datasource.tomcat.validationQuery=SELECT 1 +spring.datasource.tomcat.validationInterval=30000 # 30 sec +logging.level.org.apache.tomcat.jdbc.pool=DEBUG From 2b7f4c3a8b74a64f1c18469cbbf2af4e12451967 Mon Sep 17 00:00:00 2001 From: Vanitha S <116701245+vanitha1822@users.noreply.github.com> Date: Wed, 30 Jul 2025 16:41:17 +0530 Subject: [PATCH 07/47] fix: add functionality to save the file ID's uploaded from doctor screen (#99) --- .../ncdscreening/NCDScreeningServiceImpl.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/main/java/com/iemr/mmu/service/ncdscreening/NCDScreeningServiceImpl.java b/src/main/java/com/iemr/mmu/service/ncdscreening/NCDScreeningServiceImpl.java index a395eec1..9f1018a7 100644 --- a/src/main/java/com/iemr/mmu/service/ncdscreening/NCDScreeningServiceImpl.java +++ b/src/main/java/com/iemr/mmu/service/ncdscreening/NCDScreeningServiceImpl.java @@ -1182,6 +1182,30 @@ public Long saveDoctorData(JsonObject requestOBJ, String Authorization) throws E TcSpecialistSlotBookingRequestOBJ tcSpecialistSlotBookingRequestOBJ = null; CommonUtilityClass commonUtilityClass = InputMapper.gson().fromJson(requestOBJ, CommonUtilityClass.class); + if (requestOBJ.has("visitDetails") && !requestOBJ.get("visitDetails").isJsonNull()) { + JsonObject visitWrapperObj = requestOBJ.getAsJsonObject("visitDetails"); + JsonObject visitDetailsObj = visitWrapperObj.getAsJsonObject("visitDetails"); + + if (visitDetailsObj.has("fileIDs") && visitDetailsObj.get("fileIDs").isJsonArray()) { + JsonArray fileIDs = visitDetailsObj.getAsJsonArray("fileIDs"); + StringBuilder fileIDBuilder = new StringBuilder(); + for (JsonElement fileIdElement : fileIDs) { + if (!fileIdElement.isJsonNull()) { + fileIDBuilder.append(fileIdElement.getAsString()).append(","); + } + } + + if (fileIDBuilder.length() > 0) { + fileIDBuilder.setLength(fileIDBuilder.length() - 1); + + benVisitDetailRepo.updateFileID( + fileIDBuilder.toString(), + commonUtilityClass.getBeneficiaryRegID(), + commonUtilityClass.getVisitCode() + ); + } + } +} if (commonUtilityClass != null && commonUtilityClass.getServiceID() != null && commonUtilityClass.getServiceID() == 4 && requestOBJ != null && requestOBJ.has("tcRequest") && requestOBJ.get("tcRequest") != null) { From 1aadead0c331f5c0c25f4a718ed72f425dc13bf6 Mon Sep 17 00:00:00 2001 From: 5Amogh Date: Thu, 31 Jul 2025 16:14:58 +0530 Subject: [PATCH 08/47] story: amm-1668 task - 1754 --- .../iemr/mmu/repo/benFlowStatus/BeneficiaryFlowStatusRepo.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/iemr/mmu/repo/benFlowStatus/BeneficiaryFlowStatusRepo.java b/src/main/java/com/iemr/mmu/repo/benFlowStatus/BeneficiaryFlowStatusRepo.java index d996f43e..d4adc10e 100644 --- a/src/main/java/com/iemr/mmu/repo/benFlowStatus/BeneficiaryFlowStatusRepo.java +++ b/src/main/java/com/iemr/mmu/repo/benFlowStatus/BeneficiaryFlowStatusRepo.java @@ -75,7 +75,7 @@ public int updateBenFlowStatusTMReferred(@Param("benFlowID") Long benFlowID, @Pa @Query("SELECT t.benFlowID, t.beneficiaryRegID, t.visitDate, t.benName, t.age, t.ben_age_val, t.genderID, t.genderName, " + " t.villageName, t.districtName, t.beneficiaryID, t.servicePointName, t.VisitReason, t.VisitCategory, t.benVisitID, " - + " t.registrationDate, t.benVisitDate, t.visitCode, t.consultationDate FROM BeneficiaryFlowStatus t " + + " t.registrationDate, t.benVisitDate, t.visitCode, t.consultationDate, t.fatherName, t.preferredPhoneNum FROM BeneficiaryFlowStatus t " + " Where t.beneficiaryRegID = :benRegID AND t.benFlowID = :benFlowID ") public ArrayList getBenDetailsForLeftSidePanel(@Param("benRegID") Long benRegID, @Param("benFlowID") Long benFlowID); From ea849644e4f6f47a582939cd33f49a5c3a005129 Mon Sep 17 00:00:00 2001 From: Amoghavarsh <93114621+5Amogh@users.noreply.github.com> Date: Fri, 1 Aug 2025 11:55:47 +0530 Subject: [PATCH 09/47] story: amm-1754 updated response including father name and phone no of the beneficiary (#102) * fix: amm-1754 changing the query to get the expected response similar to hwc * fix: amm-1754 compilation error fix * fix: amm-1754 argument issue fix * fix: amm-1754 argument issue fix * fix: amm-1754 argument issue fix --- .../iemr/mmu/data/benFlowStatus/BeneficiaryFlowStatus.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/iemr/mmu/data/benFlowStatus/BeneficiaryFlowStatus.java b/src/main/java/com/iemr/mmu/data/benFlowStatus/BeneficiaryFlowStatus.java index 4e32b433..0cce7849 100644 --- a/src/main/java/com/iemr/mmu/data/benFlowStatus/BeneficiaryFlowStatus.java +++ b/src/main/java/com/iemr/mmu/data/benFlowStatus/BeneficiaryFlowStatus.java @@ -324,7 +324,7 @@ public BeneficiaryFlowStatus() { public BeneficiaryFlowStatus(Long benFlowID, Long benRegID, Timestamp visitDate, String benName, String age, Integer ageVal, Short genderID, String genderName, String villageName, String districtName, Long beneficiaryID, String servicePoint, String VisitReason, String VisitCategory, Long benVisitID, - Timestamp regDate, Timestamp benVisitDate, Long visitCode, Timestamp consultationDate) { + Timestamp regDate, Timestamp benVisitDate, Long visitCode, Timestamp consultationDate, String fatherName, String preferredPhoneNum) { this.benFlowID = benFlowID; this.beneficiaryRegID = benRegID; this.serviceDate = benVisitDate; @@ -344,6 +344,8 @@ public BeneficiaryFlowStatus(Long benFlowID, Long benRegID, Timestamp visitDate, this.visitCode = visitCode; this.consultationDate = consultationDate; this.bloodGroup = null; + this.fatherName = fatherName; + this.preferredPhoneNum = preferredPhoneNum; } @@ -366,7 +368,8 @@ public static BeneficiaryFlowStatus getBeneficiaryFlowStatusForLeftPanel(ArrayLi (String) objArr[3], (String) objArr[4], (Integer) objArr[5], (Short) objArr[6], (String) objArr[7], (String) objArr[8], (String) objArr[9], (Long) objArr[10], (String) objArr[11], (String) objArr[12], (String) objArr[13], (Long) objArr[14], - (Timestamp) objArr[15], (Timestamp) objArr[16], (Long) objArr[17], (Timestamp) objArr[18]); + (Timestamp) objArr[15], (Timestamp) objArr[16], (Long) objArr[17], (Timestamp) objArr[18], + (String) objArr[19], (String) objArr[20]); } } return obj; From e1d6ece47f903b72b822f6b9699f95a29684982e Mon Sep 17 00:00:00 2001 From: Vanitha S <116701245+vanitha1822@users.noreply.github.com> Date: Fri, 1 Aug 2025 14:49:24 +0530 Subject: [PATCH 10/47] Save the files uploaded from Doctor Screen (#100) * fix: add file path in cancer gynecological examination * fix: save the files uploaded from the doctor portal * fix: get file names in the response of gynecological examination --- .../CancerGynecologicalExamination.java | 18 ++++++++ .../cancerScreening/CSNurseServiceImpl.java | 43 +++++++++++++++++-- .../cancerScreening/CSServiceImpl.java | 5 +++ 3 files changed, 62 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/iemr/mmu/data/doctor/CancerGynecologicalExamination.java b/src/main/java/com/iemr/mmu/data/doctor/CancerGynecologicalExamination.java index a63bbc9b..4e96ba30 100644 --- a/src/main/java/com/iemr/mmu/data/doctor/CancerGynecologicalExamination.java +++ b/src/main/java/com/iemr/mmu/data/doctor/CancerGynecologicalExamination.java @@ -22,7 +22,9 @@ package com.iemr.mmu.data.doctor; import java.sql.Timestamp; +import java.util.ArrayList; import java.util.List; +import java.util.Map; import jakarta.persistence.Column; import jakarta.persistence.Entity; @@ -37,6 +39,8 @@ import com.google.gson.annotations.Expose; import lombok.Data; +import lombok.Data; + @Entity @Data @Table(name = "t_cancergynecologicalexamination") @@ -104,6 +108,10 @@ public class CancerGynecologicalExamination { @Column(name = "FilePath") private String filePath; + @Expose + @Transient + private ArrayList> files; + @Expose @Column(name = "ExperiencedPostCoitalBleeding") private Boolean experiencedPostCoitalBleeding; @@ -430,4 +438,14 @@ public void setVisitCode(Long visitCode) { this.visitCode = visitCode; } + + public ArrayList> getFiles() { + return files; + } + + public void setFiles(ArrayList> files) { + this.files = files; + } + + } diff --git a/src/main/java/com/iemr/mmu/service/cancerScreening/CSNurseServiceImpl.java b/src/main/java/com/iemr/mmu/service/cancerScreening/CSNurseServiceImpl.java index b6b15f22..77364bbd 100644 --- a/src/main/java/com/iemr/mmu/service/cancerScreening/CSNurseServiceImpl.java +++ b/src/main/java/com/iemr/mmu/service/cancerScreening/CSNurseServiceImpl.java @@ -63,10 +63,14 @@ import com.iemr.mmu.repo.nurse.BenPersonalCancerDietHistoryRepo; import com.iemr.mmu.repo.nurse.BenPersonalCancerHistoryRepo; import com.iemr.mmu.repo.nurse.BenVisitDetailRepo; +import com.iemr.mmu.utils.AESEncryption.AESEncryptionDecryption; @Service public class CSNurseServiceImpl implements CSNurseService { private final Logger logger = LoggerFactory.getLogger(this.getClass().getName()); + + @Autowired + private AESEncryptionDecryption aESEncryptionDecryption; private BenFamilyCancerHistoryRepo benFamilyCancerHistoryRepo; private BenPersonalCancerHistoryRepo benPersonalCancerHistoryRepo; private BenPersonalCancerDietHistoryRepo benPersonalCancerDietHistoryRepo; @@ -593,10 +597,41 @@ public CancerBreastExamination getBenCancerBreastExaminationData(Long benRegID, } public CancerGynecologicalExamination getBenCancerGynecologicalExaminationData(Long benRegID, Long visitCode) { - CancerGynecologicalExamination cancerGynecologicalExamination = cancerGynecologicalExaminationRepo - .getBenCancerGynecologicalExaminationDetails(benRegID, visitCode); - return cancerGynecologicalExamination; - } + CancerGynecologicalExamination cancerGynecologicalExamination = cancerGynecologicalExaminationRepo + .getBenCancerGynecologicalExaminationDetails(benRegID, visitCode); + + if (cancerGynecologicalExamination != null) { + + String filePathStr = cancerGynecologicalExamination.getFilePath(); + + if (filePathStr != null && !filePathStr.trim().isEmpty()) { + ArrayList> fileList = new ArrayList<>(); + String[] fileIds = filePathStr.split(","); + + for (String str : fileIds) { + if (str != null && !str.trim().isEmpty()) { + try { + String decryptedFilePath = aESEncryptionDecryption.decrypt(str); // Decrypt + String[] tempArr = decryptedFilePath.split("/"); + String fileName = tempArr[tempArr.length - 1]; + + Map fileMap = new HashMap<>(); + fileMap.put("filePath", str); + fileMap.put("fileName", fileName); + + fileList.add(fileMap); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + + cancerGynecologicalExamination.setFiles(fileList); + } + } + + return cancerGynecologicalExamination; +} public CancerSignAndSymptoms getBenCancerSignAndSymptomsData(Long benRegID, Long visitCode) { CancerSignAndSymptoms cancerSignAndSymptoms = cancerSignAndSymptomsRepo diff --git a/src/main/java/com/iemr/mmu/service/cancerScreening/CSServiceImpl.java b/src/main/java/com/iemr/mmu/service/cancerScreening/CSServiceImpl.java index 9a97fbcb..23fdf9d8 100644 --- a/src/main/java/com/iemr/mmu/service/cancerScreening/CSServiceImpl.java +++ b/src/main/java/com/iemr/mmu/service/cancerScreening/CSServiceImpl.java @@ -595,6 +595,11 @@ public int updateBenExaminationDetail(JsonObject jsnOBJ) throws Exception { CancerGynecologicalExamination cancerGynecologicalExamination = InputMapper.gson() .fromJson(jsnOBJ.get("gynecologicalDetails"), CancerGynecologicalExamination.class); + if (cancerGynecologicalExamination.getFileIDs() != null) { + cancerGynecologicalExamination.setFilePath( + String.join(",", cancerGynecologicalExamination.getFileIDs())); + } + int ID = cSNurseServiceImpl.updateCancerGynecologicalExaminationDetails(cancerGynecologicalExamination); if (ID > 0) { // gynecologicalDetails stored successfully... From 690e358b5c49560f60b8b4803fe63a9ca9784301 Mon Sep 17 00:00:00 2001 From: Vanitha Date: Tue, 5 Aug 2025 14:29:45 +0530 Subject: [PATCH 11/47] fix: cherry-pick the commits from develop --- .../common/transaction/CommonServiceImpl.java | 2 +- .../com/iemr/mmu/utils/RestTemplateUtil.java | 24 +++++++++---------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/iemr/mmu/service/common/transaction/CommonServiceImpl.java b/src/main/java/com/iemr/mmu/service/common/transaction/CommonServiceImpl.java index 3c962bc1..bd4f7cc0 100644 --- a/src/main/java/com/iemr/mmu/service/common/transaction/CommonServiceImpl.java +++ b/src/main/java/com/iemr/mmu/service/common/transaction/CommonServiceImpl.java @@ -650,7 +650,7 @@ public ArrayList getTmCaseSheet(BeneficiaryFlowStatus TmBenFlowOBJ, Bene headers.add("Cookie", "Jwttoken=" + jwtTokenFromCookie); // get TM case sheet by passing TM details - ResponseEntity response = restTemplatePost(tmCentralServer, Authorization, new Gson().toJson(tmReqObj), jwtTokenFromCookie); + ResponseEntity response = restTemplatePost(tmCentralServer, Authorization, new Gson().toJson(tmReqObj)); if (response.getStatusCodeValue() == 200 & response.hasBody()) { JsonObject jsnOBJ = getJsonObj(response); diff --git a/src/main/java/com/iemr/mmu/utils/RestTemplateUtil.java b/src/main/java/com/iemr/mmu/utils/RestTemplateUtil.java index 2cbab41d..d1ea0efd 100644 --- a/src/main/java/com/iemr/mmu/utils/RestTemplateUtil.java +++ b/src/main/java/com/iemr/mmu/utils/RestTemplateUtil.java @@ -44,19 +44,16 @@ public static HttpEntity createRequestEntity(Object body, String authori headers.add(HttpHeaders.AUTHORIZATION, "Bearer " + authorization); } - ServletRequestAttributes attrs = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); - - if ((jwtToken == null || jwtToken.isEmpty()) && attrs != null) { - HttpServletRequest request = attrs.getRequest(); - try { - jwtToken = CookieUtil.getJwtTokenFromCookie(request); - } catch (Exception e) { - logger.error("Error while getting JWT token from cookie: {}", e.getMessage()); - } - - String jwtTokenHeader = request.getHeader("JwtToken"); - if (jwtTokenHeader != null && !jwtTokenHeader.isEmpty()) { - jwtToken = jwtTokenHeader; + if (jwtToken == null || jwtToken.isEmpty()) { + ServletRequestAttributes attrs = + (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + if (attrs != null) { + HttpServletRequest request = attrs.getRequest(); + try { + jwtToken = CookieUtil.getJwtTokenFromCookie(request); + } catch (Exception e) { + logger.error("Error while getting JWT token from cookie: {}", e.getMessage()); + } } } @@ -65,6 +62,7 @@ public static HttpEntity createRequestEntity(Object body, String authori headers.add(HttpHeaders.COOKIE, "Jwttoken=" + jwtToken); } + return new HttpEntity<>(body, headers); } } \ No newline at end of file From b384bc5c2f530368c7342ba07f56422b049180bf Mon Sep 17 00:00:00 2001 From: Vanitha Date: Tue, 1 Jul 2025 14:00:33 +0530 Subject: [PATCH 12/47] fix: cherry-pick commits from develop --- .../common/transaction/CommonServiceImpl.java | 2 +- ...wnloadDataFromServerTransactionalImpl.java | 20 +++++++++---------- .../GetMasterDataFromCentralForVanImpl.java | 5 +++++ 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/iemr/mmu/service/common/transaction/CommonServiceImpl.java b/src/main/java/com/iemr/mmu/service/common/transaction/CommonServiceImpl.java index bd4f7cc0..3c962bc1 100644 --- a/src/main/java/com/iemr/mmu/service/common/transaction/CommonServiceImpl.java +++ b/src/main/java/com/iemr/mmu/service/common/transaction/CommonServiceImpl.java @@ -650,7 +650,7 @@ public ArrayList getTmCaseSheet(BeneficiaryFlowStatus TmBenFlowOBJ, Bene headers.add("Cookie", "Jwttoken=" + jwtTokenFromCookie); // get TM case sheet by passing TM details - ResponseEntity response = restTemplatePost(tmCentralServer, Authorization, new Gson().toJson(tmReqObj)); + ResponseEntity response = restTemplatePost(tmCentralServer, Authorization, new Gson().toJson(tmReqObj), jwtTokenFromCookie); if (response.getStatusCodeValue() == 200 & response.hasBody()) { JsonObject jsnOBJ = getJsonObj(response); diff --git a/src/main/java/com/iemr/mmu/service/dataSyncActivity/DownloadDataFromServerTransactionalImpl.java b/src/main/java/com/iemr/mmu/service/dataSyncActivity/DownloadDataFromServerTransactionalImpl.java index ee3c39a5..d2441802 100644 --- a/src/main/java/com/iemr/mmu/service/dataSyncActivity/DownloadDataFromServerTransactionalImpl.java +++ b/src/main/java/com/iemr/mmu/service/dataSyncActivity/DownloadDataFromServerTransactionalImpl.java @@ -87,7 +87,7 @@ public int downloadTransactionalData(int vanID, String ServerAuthorization, Stri for (int i = 0; i < 5; i++) { switch (i) { case 0: { - obj = downloadDataFromCentral("db_iemr", "t_indent", vanID, ServerAuthorization, token); + obj = downloadDataFromCentral("db_iemr_sync", "t_indent", vanID, ServerAuthorization, token); List ids = new ArrayList(); Indent[] indentArr = InputMapper.gson(1).fromJson(String.valueOf(obj.get("data")), Indent[].class, 1); List indentList = Arrays.asList(indentArr); @@ -109,13 +109,13 @@ public int downloadTransactionalData(int vanID, String ServerAuthorization, Stri } indentRepo.saveAll(indentList); - int updateFlag = updateProcessedFlagToCentral("db_iemr", "t_indent", ids, ServerAuthorization, token); + int updateFlag = updateProcessedFlagToCentral("db_iemr_sync", "t_indent", ids, ServerAuthorization, token); } break; } case 1: { - obj = downloadDataFromCentral("db_iemr", "t_indentorder", vanID, ServerAuthorization, token); + obj = downloadDataFromCentral("db_iemr_sync", "t_indentorder", vanID, ServerAuthorization, token); List ids = new ArrayList(); IndentOrder[] indentOrderArr = InputMapper.gson(1).fromJson(String.valueOf(obj.get("data")), IndentOrder[].class, 1); @@ -136,12 +136,12 @@ public int downloadTransactionalData(int vanID, String ServerAuthorization, Stri indentOrder.setProcessed("P"); } indentOrderRepo.saveAll(indentOrderList); - int updateFlag = updateProcessedFlagToCentral("db_iemr", "t_indentorder", ids, ServerAuthorization, token); + int updateFlag = updateProcessedFlagToCentral("db_iemr_sync", "t_indentorder", ids, ServerAuthorization, token); } break; } case 2: { - obj = downloadDataFromCentral("db_iemr", "t_indentissue", vanID, ServerAuthorization, token); + obj = downloadDataFromCentral("db_iemr_sync", "t_indentissue", vanID, ServerAuthorization, token); List ids = new ArrayList(); IndentIssue[] indentIssueArr = InputMapper.gson(1).fromJson(String.valueOf(obj.get("data")), IndentIssue[].class, 1); @@ -164,12 +164,12 @@ public int downloadTransactionalData(int vanID, String ServerAuthorization, Stri } indentIssueRepo.saveAll(indentIssueList); - int updateFlag = updateProcessedFlagToCentral("db_iemr", "t_indentissue", ids, ServerAuthorization, token); + int updateFlag = updateProcessedFlagToCentral("db_iemr_sync", "t_indentissue", ids, ServerAuthorization, token); } break; } case 3: { - obj = downloadDataFromCentral("db_iemr", "t_stocktransfer", vanID, ServerAuthorization, token); + obj = downloadDataFromCentral("db_iemr_sync", "t_stocktransfer", vanID, ServerAuthorization, token); List ids = new ArrayList(); T_StockTransfer[] stockTransferArr = InputMapper.gson(1).fromJson(String.valueOf(obj.get("data")), T_StockTransfer[].class, 1); @@ -191,13 +191,13 @@ public int downloadTransactionalData(int vanID, String ServerAuthorization, Stri } stockTransferRepo.saveAll(stockTransferList); - int updateFlag = updateProcessedFlagToCentral("db_iemr", "t_stocktransfer", ids, + int updateFlag = updateProcessedFlagToCentral("db_iemr_sync", "t_stocktransfer", ids, ServerAuthorization, token); } break; } case 4: { - obj = downloadDataFromCentral("db_iemr", "t_itemstockentry", vanID, ServerAuthorization, token); + obj = downloadDataFromCentral("db_iemr_sync", "t_itemstockentry", vanID, ServerAuthorization, token); List ids = new ArrayList(); ItemStockEntry[] itemStockEntryArr = InputMapper.gson(1).fromJson(String.valueOf(obj.get("data")), ItemStockEntry[].class, 1); @@ -219,7 +219,7 @@ public int downloadTransactionalData(int vanID, String ServerAuthorization, Stri } itemStockEntryRepo.saveAll(itemStockEntryList); - int updateFlag = updateProcessedFlagToCentral("db_iemr", "t_itemstockentry", ids, + int updateFlag = updateProcessedFlagToCentral("db_iemr_sync", "t_itemstockentry", ids, ServerAuthorization, token); } break; diff --git a/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetMasterDataFromCentralForVanImpl.java b/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetMasterDataFromCentralForVanImpl.java index eaae79c3..6142d257 100644 --- a/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetMasterDataFromCentralForVanImpl.java +++ b/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetMasterDataFromCentralForVanImpl.java @@ -27,7 +27,10 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.json.JSONObject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.iemr.mmu.data.syncActivity_syncLayer.SyncDownloadMaster; @@ -36,6 +39,7 @@ public class GetMasterDataFromCentralForVanImpl implements GetMasterDataFromCentralForVan { @Autowired private DataSyncRepositoryCentral dataSyncRepositoryCentral; + private Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName()); public String getMasterDataForVan(SyncDownloadMaster obj) throws Exception { List> resultSetList = new ArrayList<>(); @@ -56,6 +60,7 @@ public String getMasterDataForVan(SyncDownloadMaster obj) throws Exception { } private List> getMasterDataFromGivenTable(SyncDownloadMaster tableDetails) throws Exception { + logger.info("ger master data="+ tableDetails.getSchemaName()); List> resultSetList = new ArrayList<>(); resultSetList = dataSyncRepositoryCentral.getMasterDataFromTable(tableDetails.getSchemaName(), tableDetails.getTableName(), tableDetails.getServerColumnName(), tableDetails.getMasterType(), From 9571a35f77a36b578e41b0b50ff452a839ffb0fe Mon Sep 17 00:00:00 2001 From: Vanitha S <116701245+vanitha1822@users.noreply.github.com> Date: Tue, 5 Aug 2025 19:03:02 +0530 Subject: [PATCH 13/47] Fix the Download Masters issue (#103) * fix: resolve the conflicts * fix: fix the issue in download masters table --- ...wnloadDataFromServerTransactionalImpl.java | 10 +- .../DataSyncRepositoryCentralDownload.java | 208 ++++++++++++++++++ .../GetMasterDataFromCentralForVanImpl.java | 6 +- 3 files changed, 218 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/DataSyncRepositoryCentralDownload.java diff --git a/src/main/java/com/iemr/mmu/service/dataSyncActivity/DownloadDataFromServerTransactionalImpl.java b/src/main/java/com/iemr/mmu/service/dataSyncActivity/DownloadDataFromServerTransactionalImpl.java index d2441802..5cd8d26d 100644 --- a/src/main/java/com/iemr/mmu/service/dataSyncActivity/DownloadDataFromServerTransactionalImpl.java +++ b/src/main/java/com/iemr/mmu/service/dataSyncActivity/DownloadDataFromServerTransactionalImpl.java @@ -87,7 +87,7 @@ public int downloadTransactionalData(int vanID, String ServerAuthorization, Stri for (int i = 0; i < 5; i++) { switch (i) { case 0: { - obj = downloadDataFromCentral("db_iemr_sync", "t_indent", vanID, ServerAuthorization, token); + obj = downloadDataFromCentral("db_iemr", "t_indent", vanID, ServerAuthorization, token); List ids = new ArrayList(); Indent[] indentArr = InputMapper.gson(1).fromJson(String.valueOf(obj.get("data")), Indent[].class, 1); List indentList = Arrays.asList(indentArr); @@ -115,7 +115,7 @@ public int downloadTransactionalData(int vanID, String ServerAuthorization, Stri break; } case 1: { - obj = downloadDataFromCentral("db_iemr_sync", "t_indentorder", vanID, ServerAuthorization, token); + obj = downloadDataFromCentral("db_iemr", "t_indentorder", vanID, ServerAuthorization, token); List ids = new ArrayList(); IndentOrder[] indentOrderArr = InputMapper.gson(1).fromJson(String.valueOf(obj.get("data")), IndentOrder[].class, 1); @@ -141,7 +141,7 @@ public int downloadTransactionalData(int vanID, String ServerAuthorization, Stri break; } case 2: { - obj = downloadDataFromCentral("db_iemr_sync", "t_indentissue", vanID, ServerAuthorization, token); + obj = downloadDataFromCentral("db_iemr", "t_indentissue", vanID, ServerAuthorization, token); List ids = new ArrayList(); IndentIssue[] indentIssueArr = InputMapper.gson(1).fromJson(String.valueOf(obj.get("data")), IndentIssue[].class, 1); @@ -169,7 +169,7 @@ public int downloadTransactionalData(int vanID, String ServerAuthorization, Stri break; } case 3: { - obj = downloadDataFromCentral("db_iemr_sync", "t_stocktransfer", vanID, ServerAuthorization, token); + obj = downloadDataFromCentral("db_iemr", "t_stocktransfer", vanID, ServerAuthorization, token); List ids = new ArrayList(); T_StockTransfer[] stockTransferArr = InputMapper.gson(1).fromJson(String.valueOf(obj.get("data")), T_StockTransfer[].class, 1); @@ -197,7 +197,7 @@ public int downloadTransactionalData(int vanID, String ServerAuthorization, Stri break; } case 4: { - obj = downloadDataFromCentral("db_iemr_sync", "t_itemstockentry", vanID, ServerAuthorization, token); + obj = downloadDataFromCentral("db_iemr", "t_itemstockentry", vanID, ServerAuthorization, token); List ids = new ArrayList(); ItemStockEntry[] itemStockEntryArr = InputMapper.gson(1).fromJson(String.valueOf(obj.get("data")), ItemStockEntry[].class, 1); diff --git a/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/DataSyncRepositoryCentralDownload.java b/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/DataSyncRepositoryCentralDownload.java new file mode 100644 index 00000000..565e2466 --- /dev/null +++ b/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/DataSyncRepositoryCentralDownload.java @@ -0,0 +1,208 @@ +/* +* AMRIT – Accessible Medical Records via Integrated Technology +* Integrated EHR (Electronic Health Records) Solution +* +* Copyright (C) "Piramal Swasthya Management and Research Institute" +* +* This file is part of AMRIT. +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see https://www.gnu.org/licenses/. +*/ +package com.iemr.mmu.service.dataSyncLayerCentral; + +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import javax.sql.DataSource; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Service; + +/*** + * + * @author NE298657 + * + */ + +@Service +public class DataSyncRepositoryCentralDownload { + @Autowired + private DataSource dataSource; + + private JdbcTemplate jdbcTemplate; + + private JdbcTemplate getJdbcTemplate() { + return new JdbcTemplate(dataSource); + + } + + private Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName()); + + // Data Upload Repository + public int checkRecordIsAlreadyPresentOrNot(String schemaName, String tableName, String vanSerialNo, String vanID, + String vanAutoIncColumnName, int syncFacilityID) { + jdbcTemplate = getJdbcTemplate(); + + List params = new ArrayList<>(); + + StringBuilder queryBuilder = new StringBuilder("SELECT "); + queryBuilder.append(vanAutoIncColumnName); + queryBuilder.append(" FROM "); + queryBuilder.append(schemaName+"."+tableName); + + //params.add(vanAutoIncColumnName); + //params.add(schemaName); + //params.add(tableName); + + StringBuilder whereClause = new StringBuilder(); + whereClause.append(" WHERE "); + whereClause.append("VanSerialNo = ?"); + params.add(vanSerialNo); + + if ((tableName.equalsIgnoreCase("t_patientissue") || tableName.equalsIgnoreCase("t_physicalstockentry") + || tableName.equalsIgnoreCase("t_stockadjustment") || tableName.equalsIgnoreCase("t_saitemmapping") + || tableName.equalsIgnoreCase("t_stocktransfer") || tableName.equalsIgnoreCase("t_patientreturn") + || tableName.equalsIgnoreCase("t_facilityconsumption") || tableName.equalsIgnoreCase("t_indent") + || tableName.equalsIgnoreCase("t_indentorder") || tableName.equalsIgnoreCase("t_indentissue") + || tableName.equalsIgnoreCase("t_itemstockentry") || tableName.equalsIgnoreCase("t_itemstockexit")) + && syncFacilityID > 0) { + + whereClause.append(" AND "); + whereClause.append("SyncFacilityID = ?"); + params.add(syncFacilityID); + + } + + else { + + whereClause.append(" AND "); + whereClause.append("VanID = ?"); + params.add(vanID); + + } + + queryBuilder.append(whereClause); + String query = queryBuilder.toString(); + Object[] queryParams = params.toArray(); + List> resultSet = jdbcTemplate.queryForList(query, queryParams); + if (resultSet != null && resultSet.size() > 0) + return 1; + else + return 0; + } + + // Method for synchronization of data to central DB + public int[] syncDataToCentralDB(String schema, String tableName, String serverColumns, String query, + List syncDataList) { + jdbcTemplate = getJdbcTemplate(); + if (query.startsWith("INSERT")) { + for (int i = 0; i < syncDataList.size(); i++) { + Object[] array = syncDataList.get(i);// Arrey 1 + + if (query.startsWith("INSERT")) { +// array = new Object[] {serverColumns, array }; + syncDataList.set(i, array); + } + } + } else { + for (int i = 0; i < syncDataList.size(); i++) { + + Object[] array = syncDataList.get(i);// Arrey 1 + String[] columnsArray = null; + if(null != serverColumns) + columnsArray = serverColumns.split(","); // arrey 2 + + List Newarray = new ArrayList<>(); + + int arrayIndex = 0; + int columnsArrayIndex = 0; + //Newarray.add(schema); + //Newarray.add(tableName); + //while (columnsArrayIndex < columnsArray.length || arrayIndex < array.length) { + if (null != columnsArray && columnsArrayIndex < columnsArray.length) { + Newarray.add(columnsArray[columnsArrayIndex]); + columnsArrayIndex++; + } + + /* + * if (arrayIndex < array.length) { Newarray.add(array); arrayIndex++; } + */ + //} + + // Convert Newarray back to an array + //Object[] resultArray = Newarray.toArray(new Object[0]); + syncDataList.set(i, array); + + } + } + // start batch insert/update + int[] i = jdbcTemplate.batchUpdate(query, syncDataList); + return i; + + } + + // End of Data Upload Repository + + public List> getMasterDataFromTable(String schema, String table, String columnNames, + String masterType, Timestamp lastDownloadDate, Integer vanID, Integer psmID) throws Exception { + jdbcTemplate = getJdbcTemplate(); + List> resultSetList =new ArrayList<>(); + String baseQuery = ""; + if (masterType != null) { + if (lastDownloadDate != null) { + if (masterType.equalsIgnoreCase("A")) { + baseQuery += " SELECT " + columnNames + " FROM " + schema + "." + table + + " WHERE LastModDate >= ? "; + resultSetList = jdbcTemplate.queryForList(baseQuery,lastDownloadDate); + + } + else if (masterType.equalsIgnoreCase("V")) { + baseQuery += " SELECT " + columnNames + " FROM " + schema + "." + table + + " WHERE LastModDate >= ? AND VanID = ? "; + resultSetList = jdbcTemplate.queryForList(baseQuery,lastDownloadDate,vanID); + } + else if (masterType.equalsIgnoreCase("P")) { + baseQuery += " SELECT " + columnNames + " FROM " + schema + "." + table + + " WHERE LastModDate >= ? AND ProviderServiceMapID = ? "; + resultSetList = jdbcTemplate.queryForList(baseQuery,lastDownloadDate,psmID); + } + } else { + if (masterType.equalsIgnoreCase("A")) { + baseQuery += " SELECT " + columnNames + " FROM " + schema + "." + table; + resultSetList = jdbcTemplate.queryForList(baseQuery); + } + else if (masterType.equalsIgnoreCase("V")) { + baseQuery += " SELECT " + columnNames + " FROM " + schema + "." + table + " WHERE VanID = ? "; + resultSetList = jdbcTemplate.queryForList(baseQuery,vanID); + } + else if (masterType.equalsIgnoreCase("P")) { + baseQuery += " SELECT " + columnNames + " FROM " + schema + "." + table + + " WHERE ProviderServiceMapID = ? "; + resultSetList = jdbcTemplate.queryForList(baseQuery,psmID); + } + } + } + logger.info("Select query central: " + baseQuery); + logger.info("Last Downloaded Date " + lastDownloadDate); + logger.info("Result set Details: " + resultSetList); + return resultSetList; + } + + // End of Data Download Repository +} \ No newline at end of file diff --git a/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetMasterDataFromCentralForVanImpl.java b/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetMasterDataFromCentralForVanImpl.java index 6142d257..b1ed9103 100644 --- a/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetMasterDataFromCentralForVanImpl.java +++ b/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetMasterDataFromCentralForVanImpl.java @@ -39,6 +39,10 @@ public class GetMasterDataFromCentralForVanImpl implements GetMasterDataFromCentralForVan { @Autowired private DataSyncRepositoryCentral dataSyncRepositoryCentral; + + @Autowired + private DataSyncRepositoryCentralDownload dataSyncRepositoryCentralDownload; + private Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName()); public String getMasterDataForVan(SyncDownloadMaster obj) throws Exception { @@ -62,7 +66,7 @@ public String getMasterDataForVan(SyncDownloadMaster obj) throws Exception { private List> getMasterDataFromGivenTable(SyncDownloadMaster tableDetails) throws Exception { logger.info("ger master data="+ tableDetails.getSchemaName()); List> resultSetList = new ArrayList<>(); - resultSetList = dataSyncRepositoryCentral.getMasterDataFromTable(tableDetails.getSchemaName(), + resultSetList = dataSyncRepositoryCentralDownload.getMasterDataFromTable(tableDetails.getSchemaName(), tableDetails.getTableName(), tableDetails.getServerColumnName(), tableDetails.getMasterType(), tableDetails.getLastDownloadDate(), tableDetails.getVanID(), tableDetails.getProviderServiceMapID()); return resultSetList; From 3d3ce58c1ca2eb8cdad0b52011d88f6537ae9179 Mon Sep 17 00:00:00 2001 From: Vanitha S <116701245+vanitha1822@users.noreply.github.com> Date: Wed, 6 Aug 2025 13:38:56 +0530 Subject: [PATCH 14/47] fix: remove the validation (#105) --- .../GetDataFromVanAndSyncToDBImpl.java | 96 +++++++++---------- 1 file changed, 48 insertions(+), 48 deletions(-) diff --git a/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java b/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java index 2d88e6f6..5f67b89f 100644 --- a/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java +++ b/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java @@ -98,10 +98,10 @@ public String syncDataToServer(String requestOBJ, String Authorization, String t String syncTableName = syncUploadDataDigester.getTableName(); String schemaName = syncUploadDataDigester.getSchemaName(); - if (!isValidSchemaName(schemaName) || !isValidTableName(syncTableName)) { - logger.error("Invalid schema or table name provided: Schema='{}', Table='{}'.", schemaName, syncTableName); - return "Error: Invalid schema or table name."; - } + // if (!isValidSchemaName(schemaName) || !isValidTableName(syncTableName)) { + // logger.error("Invalid schema or table name provided: Schema='{}', Table='{}'.", schemaName, syncTableName); + // return "Error: Invalid schema or table name."; + // } // Handle specific tables first, if their logic is distinct @@ -192,10 +192,10 @@ private boolean syncTablesInGroup(String schemaName, String currentTableName, Sy logger.info("Attempting generic sync for table: {}", currentTableName); // Validate schemaName and currentTableName for safety before proceeding - if (!isValidSchemaName(schemaName) || !isValidTableName(currentTableName)) { - logger.error("Invalid schema or table name for group sync: Schema='{}', Table='{}'.", schemaName, currentTableName); - return false; // Fail fast if identifiers are invalid - } + // if (!isValidSchemaName(schemaName) || !isValidTableName(currentTableName)) { + // logger.error("Invalid schema or table name for group sync: Schema='{}', Table='{}'.", schemaName, currentTableName); + // return false; // Fail fast if identifiers are invalid + // } SyncUploadDataDigester tableSpecificDigester = new SyncUploadDataDigester(); tableSpecificDigester.setSchemaName(schemaName); @@ -217,10 +217,10 @@ private String update_M_BeneficiaryRegIdMapping_for_provisioned_benID(SyncUpload String schemaName = syncUploadDataDigester.getSchemaName(); String tableName = syncUploadDataDigester.getTableName(); - if (!isValidSchemaName(schemaName) || !isValidTableName(tableName)) { - logger.error("Invalid schema or table name provided for m_beneficiaryregidmapping update: Schema='{}', Table='{}'.", schemaName, tableName); - return "Error: Invalid schema or table name."; - } + // if (!isValidSchemaName(schemaName) || !isValidTableName(tableName)) { + // logger.error("Invalid schema or table name provided for m_beneficiaryregidmapping update: Schema='{}', Table='{}'.", schemaName, tableName); + // return "Error: Invalid schema or table name."; + // } List> dataToBesync = syncUploadDataDigester.getSyncData(); List syncData = new ArrayList<>(); @@ -268,10 +268,10 @@ public String update_I_BeneficiaryDetails_for_processed_in_batches(SyncUploadDat String schemaName = syncUploadDataDigester.getSchemaName(); String tableName = syncUploadDataDigester.getTableName(); - if (!isValidSchemaName(schemaName) || !isValidTableName(tableName)) { - logger.error("Invalid schema or table name provided for i_beneficiarydetails update: Schema='{}', Table='{}'.", schemaName, tableName); - return "Error: Invalid schema or table name."; - } + // if (!isValidSchemaName(schemaName) || !isValidTableName(tableName)) { + // logger.error("Invalid schema or table name provided for i_beneficiarydetails update: Schema='{}', Table='{}'.", schemaName, tableName); + // return "Error: Invalid schema or table name."; + // } List syncData = new ArrayList<>(); // This list will hold data for batch updates to 'Processed' @@ -353,10 +353,10 @@ public String update_I_BeneficiaryDetails_for_processed_in_batches(SyncUploadDat } private String getQueryFor_I_BeneficiaryDetails(String schemaName, String tableName) { - if (!isValidSchemaName(schemaName) || !isValidTableName(tableName)) { - logger.error("Invalid schema or table name for getQueryFor_I_BeneficiaryDetails: Schema='{}', Table='{}'.", schemaName, tableName); - throw new IllegalArgumentException("Invalid schema or table name provided."); - } + // if (!isValidSchemaName(schemaName) || !isValidTableName(tableName)) { + // logger.error("Invalid schema or table name for getQueryFor_I_BeneficiaryDetails: Schema='{}', Table='{}'.", schemaName, tableName); + // throw new IllegalArgumentException("Invalid schema or table name provided."); + // } return String.format("UPDATE %s.%s SET Processed = 'P', SyncedDate = now(), SyncedBy = ? WHERE BeneficiaryDetailsId = ? AND VanID = ?", schemaName, tableName); } @@ -370,15 +370,15 @@ private boolean performGenericTableSync(SyncUploadDataDigester syncUploadDataDig String vanAutoIncColumnName = syncUploadDataDigester.getVanAutoIncColumnName(); String serverColumns = syncUploadDataDigester.getServerColumns(); - if (!isValidSchemaName(schemaName) || !isValidTableName(syncTableName)) { - logger.error("Invalid schema or table name for generic sync: Schema='{}', Table='{}'.", schemaName, syncTableName); - return false; - } + // if (!isValidSchemaName(schemaName) || !isValidTableName(syncTableName)) { + // logger.error("Invalid schema or table name for generic sync: Schema='{}', Table='{}'.", schemaName, syncTableName); + // return false; + // } - if (!isValidColumnNames(serverColumns)) { - logger.error("Invalid server columns provided for generic sync: {}", serverColumns); - return false; - } + // if (!isValidColumnNames(serverColumns)) { + // logger.error("Invalid server columns provided for generic sync: {}", serverColumns); + // return false; + // } List> dataToBesync = syncUploadDataDigester.getSyncData(); @@ -538,14 +538,14 @@ private boolean performGenericTableSync(SyncUploadDataDigester syncUploadDataDig } private String getQueryToInsertDataToServerDB(String schemaName, String tableName, String serverColumns) { - if (!isValidSchemaName(schemaName) || !isValidTableName(tableName)) { - logger.error("Invalid schema or table name for getQueryToInsertDataToServerDB: Schema='{}', Table='{}'.", schemaName, tableName); - throw new IllegalArgumentException("Invalid schema or table name provided."); - } - if (!isValidColumnNames(serverColumns)) { - logger.error("Invalid server columns provided for getQueryToInsertDataToServerDB: {}", serverColumns); - throw new IllegalArgumentException("Invalid column names provided."); - } + // if (!isValidSchemaName(schemaName) || !isValidTableName(tableName)) { + // logger.error("Invalid schema or table name for getQueryToInsertDataToServerDB: Schema='{}', Table='{}'.", schemaName, tableName); + // throw new IllegalArgumentException("Invalid schema or table name provided."); + // } + // if (!isValidColumnNames(serverColumns)) { + // logger.error("Invalid server columns provided for getQueryToInsertDataToServerDB: {}", serverColumns); + // throw new IllegalArgumentException("Invalid column names provided."); + // } String[] columnsArr = serverColumns.split(","); @@ -562,24 +562,24 @@ private String getQueryToInsertDataToServerDB(String schemaName, String tableNam } public String getQueryToUpdateDataToServerDB(String schemaName, String serverColumns, String tableName) { - if (!isValidSchemaName(schemaName) || !isValidTableName(tableName)) { - logger.error("Invalid schema or table name for getQueryToUpdateDataToServerDB: Schema='{}', Table='{}'.", schemaName, tableName); - throw new IllegalArgumentException("Invalid schema or table name provided."); - } - if (!isValidColumnNames(serverColumns)) { - logger.error("Invalid server columns provided for getQueryToUpdateDataToServerDB: {}", serverColumns); - throw new IllegalArgumentException("Invalid column names provided."); - } + // if (!isValidSchemaName(schemaName) || !isValidTableName(tableName)) { + // logger.error("Invalid schema or table name for getQueryToUpdateDataToServerDB: Schema='{}', Table='{}'.", schemaName, tableName); + // throw new IllegalArgumentException("Invalid schema or table name provided."); + // } + // if (!isValidColumnNames(serverColumns)) { + // logger.error("Invalid server columns provided for getQueryToUpdateDataToServerDB: {}", serverColumns); + // throw new IllegalArgumentException("Invalid column names provided."); + // } String[] columnsArr = serverColumns.split(","); StringBuilder preparedStatementSetter = new StringBuilder(); for (int i = 0; i < columnsArr.length; i++) { String column = columnsArr[i].trim(); - if (!isValidColumnName(column)) { - logger.error("Invalid individual column name encountered: {}", column); - throw new IllegalArgumentException("Invalid individual column name provided: " + column); - } + // if (!isValidColumnName(column)) { + // logger.error("Invalid individual column name encountered: {}", column); + // throw new IllegalArgumentException("Invalid individual column name provided: " + column); + // } preparedStatementSetter.append(column); preparedStatementSetter.append(" = ?"); From 4c85e25b8da1ea3c1be485443dbe3292bfc42dd8 Mon Sep 17 00:00:00 2001 From: Vanitha S <116701245+vanitha1822@users.noreply.github.com> Date: Wed, 6 Aug 2025 19:14:03 +0530 Subject: [PATCH 15/47] fix: replace the old working code (#106) --- .../GetDataFromVanAndSyncToDBImpl.java | 379 +++++++----------- 1 file changed, 144 insertions(+), 235 deletions(-) diff --git a/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java b/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java index 5f67b89f..69be169f 100644 --- a/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java +++ b/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java @@ -27,8 +27,6 @@ import java.util.List; import java.util.Map; import java.util.HashMap; -import java.util.Set; -import java.util.HashSet; import org.slf4j.Logger; @@ -50,22 +48,8 @@ public class GetDataFromVanAndSyncToDBImpl implements GetDataFromVanAndSyncToDB private DataSyncRepositoryCentral dataSyncRepositoryCentral; private static final Map> TABLE_GROUPS = new HashMap<>(); - private static final Set VALID_SCHEMAS = new HashSet<>(Arrays.asList("public", "db_iemr")); // Add your actual schema names - private static final Set VALID_TABLES = new HashSet<>(Arrays.asList( - "m_beneficiaryregidmapping", "i_beneficiaryaccount","i_beneficiaryaddress","i_beneficiarycontacts","i_beneficiarydetails","i_beneficiaryfamilymapping","i_beneficiaryidentity","i_beneficiarymapping", - "t_benvisitdetail","t_phy_anthropometry","t_phy_vitals","t_benadherence","t_anccare","t_pnccare","t_ncdscreening","t_ncdcare","i_ben_flow_outreach","t_covid19","t_idrsdetails","t_physicalactivity", - "t_phy_generalexam","t_phy_headtotoe","t_sys_obstetric","t_sys_gastrointestinal","t_sys_cardiovascular","t_sys_respiratory","t_sys_centralnervous","t_sys_musculoskeletalsystem","t_sys_genitourinarysystem", - "t_ancdiagnosis","t_ncddiagnosis","t_pncdiagnosis","t_benchefcomplaint","t_benclinicalobservation","t_prescription","t_prescribeddrug","t_lab_testorder","t_benreferdetails", - "t_lab_testresult","t_physicalstockentry","t_patientissue","t_facilityconsumption","t_itemstockentry","t_itemstockexit", - "t_benmedhistory","t_femaleobstetrichistory","t_benmenstrualdetails","t_benpersonalhabit","t_childvaccinedetail1","t_childvaccinedetail2","t_childoptionalvaccinedetail","t_ancwomenvaccinedetail","t_childfeedinghistory","t_benallergyhistory","t_bencomorbiditycondition","t_benmedicationhistory","t_benfamilyhistory","t_perinatalhistory","t_developmenthistory", - "t_cancerfamilyhistory","t_cancerpersonalhistory","t_cancerdiethistory","t_cancerobstetrichistory","t_cancervitals","t_cancersignandsymptoms","t_cancerlymphnode","t_canceroralexamination","t_cancerbreastexamination","t_cancerabdominalexamination","t_cancergynecologicalexamination","t_cancerdiagnosis","t_cancerimageannotation", - "i_beneficiaryimage", - "t_stockadjustment","t_stocktransfer","t_patientreturn","t_indent","t_indentissue","t_indentorder","t_saitemmapping" - )); - static { - - TABLE_GROUPS.put(1, Arrays.asList("m_beneficiaryregidmapping", "i_beneficiaryaccount","i_beneficiaryaddress","i_beneficiarycontacts","i_beneficiarydetails","i_beneficiaryfamilymapping","i_beneficiaryidentity","i_beneficiarymapping")); + TABLE_GROUPS.put(1, Arrays.asList("m_beneficiaryregidmapping", "i_beneficiaryaccount","i_beneficiaryaddress","i_beneficiarycontacts","i_beneficiarydetails","i_beneficiaryfamilymapping","i_beneficiaryidentity","i_beneficiarymapping")); TABLE_GROUPS.put(2, Arrays.asList("t_benvisitdetail","t_phy_anthropometry","t_phy_vitals","t_benadherence","t_anccare","t_pnccare","t_ncdscreening","t_ncdcare","i_ben_flow_outreach","t_covid19","t_idrsdetails","t_physicalactivity")); @@ -87,6 +71,7 @@ public class GetDataFromVanAndSyncToDBImpl implements GetDataFromVanAndSyncToDB public String syncDataToServer(String requestOBJ, String Authorization, String token) throws Exception { logger.info("Starting syncDataToServer. Token: {}", token); + ObjectMapper mapper = new ObjectMapper(); SyncUploadDataDigester syncUploadDataDigester = mapper.readValue(requestOBJ, SyncUploadDataDigester.class); @@ -96,13 +81,6 @@ public String syncDataToServer(String requestOBJ, String Authorization, String t } String syncTableName = syncUploadDataDigester.getTableName(); - String schemaName = syncUploadDataDigester.getSchemaName(); - - // if (!isValidSchemaName(schemaName) || !isValidTableName(syncTableName)) { - // logger.error("Invalid schema or table name provided: Schema='{}', Table='{}'.", schemaName, syncTableName); - // return "Error: Invalid schema or table name."; - // } - // Handle specific tables first, if their logic is distinct if ("m_beneficiaryregidmapping".equalsIgnoreCase(syncTableName)) { @@ -113,8 +91,7 @@ public String syncDataToServer(String requestOBJ, String Authorization, String t logger.error("Sync failed for m_beneficiaryregidmapping: {}", result); return "Sync failed for m_beneficiaryregidmapping."; } - } - if ("i_beneficiarydetails".equalsIgnoreCase(syncTableName)) { + } else if ("i_beneficiarydetails".equalsIgnoreCase(syncTableName)) { String result = update_I_BeneficiaryDetails_for_processed_in_batches(syncUploadDataDigester); if ("data sync passed".equals(result)) { return "Sync successful for i_beneficiarydetails."; @@ -151,20 +128,22 @@ public String syncDataToServer(String requestOBJ, String Authorization, String t List tablesInGroup = entry.getValue(); logger.info("Starting sync for Group {}", groupId); for (String table : tablesInGroup) { - if (!isValidTableName(table)) { - logger.error("Invalid table name '{}' encountered in group {}. Skipping.", table, groupId); - syncSuccess = false; - errorMessage += "Invalid table name: " + table + " in Group " + groupId + ". "; - continue; // Skip this table - } - try { - + // Create a new digester for each table within the group, + // or adapt if the original digester contains data for multiple tables. + // For simplicity, assuming syncDataDigester needs to be tailored per table or group. + // If your requestOBJ contains data for only one table at a time, this loop might need adjustment + // to fetch data for each table in the group. + // For now, it will use the syncData from the original requestOBJ, which implies + // the original requestOBJ should represent data for a single table. + // A more robust solution would involve fetching data for each table dynamically. boolean currentTableSyncResult = syncTablesInGroup(syncUploadDataDigester.getSchemaName(), table, syncUploadDataDigester); if (!currentTableSyncResult) { syncSuccess = false; errorMessage += "Failed to sync table: " + table + " in Group " + groupId + ". "; logger.error("Sync failed for table '{}' in Group {}. Error: {}", table, groupId, errorMessage); + // Optionally, you can choose to break here or continue to sync other tables in the group/next group + // For now, let's continue to attempt other tables within the group. } else { logger.info("Successfully synced table: {} in Group {}", table, groupId); } @@ -172,31 +151,34 @@ public String syncDataToServer(String requestOBJ, String Authorization, String t syncSuccess = false; errorMessage += "Exception during sync for table: " + table + " in Group " + groupId + ": " + e.getMessage() + ". "; logger.error("Exception during sync for table '{}' in Group {}: {}", table, groupId, e.getMessage(), e); + // Continue to attempt other tables } } } } if (syncSuccess) { - logger.info("Overall data sync passed."); return "Overall data sync passed."; } else { - logger.info("Overall data sync failed. Details: " + errorMessage); return "Overall data sync failed. Details: " + errorMessage; } } } - + /** + * Helper method to sync tables belonging to a specific group. + * This method assumes that the `syncUploadDataDigester` will be populated + * with relevant data for the `currentTableName` before calling this. + * In a real-world scenario, you might fetch data for each table here. + */ private boolean syncTablesInGroup(String schemaName, String currentTableName, SyncUploadDataDigester originalDigester) { logger.info("Attempting generic sync for table: {}", currentTableName); - - // Validate schemaName and currentTableName for safety before proceeding - // if (!isValidSchemaName(schemaName) || !isValidTableName(currentTableName)) { - // logger.error("Invalid schema or table name for group sync: Schema='{}', Table='{}'.", schemaName, currentTableName); - // return false; // Fail fast if identifiers are invalid - // } + // This is a simplification. In a production system, you would likely need + // to retrieve the actual data for 'currentTableName' from the local DB + // based on the group sync approach. For this example, we'll assume the + // originalDigester's syncData is relevant or needs to be re-populated. + // Create a new digester instance or modify the existing one for the current table SyncUploadDataDigester tableSpecificDigester = new SyncUploadDataDigester(); tableSpecificDigester.setSchemaName(schemaName); tableSpecificDigester.setTableName(currentTableName); @@ -205,7 +187,12 @@ private boolean syncTablesInGroup(String schemaName, String currentTableName, Sy tableSpecificDigester.setVanAutoIncColumnName(originalDigester.getVanAutoIncColumnName()); tableSpecificDigester.setServerColumns(originalDigester.getServerColumns()); // Assuming serverColumns is generic or set per table - tableSpecificDigester.setSyncData(originalDigester.getSyncData()); // Placeholder: Replace with actual data fetching + // !!! IMPORTANT: You'll need to fetch the data for 'currentTableName' from your local DB here. + // The `originalDigester.getSyncData()` might not be correct for all tables in a group. + // For demonstration, I'm just using the original digester's data, which is likely incorrect + // if you're syncing multiple tables from a single request. + // You'll need a method like: dataSyncRepositoryLocal.getDataForTable(currentTableName, ...) + tableSpecificDigester.setSyncData(originalDigester.getSyncData()); // Placeholder: Replace with actual data fetching return performGenericTableSync(tableSpecificDigester); } @@ -213,19 +200,11 @@ private boolean syncTablesInGroup(String schemaName, String currentTableName, Sy private String update_M_BeneficiaryRegIdMapping_for_provisioned_benID(SyncUploadDataDigester syncUploadDataDigester) { logger.info("Processing update_M_BeneficiaryRegIdMapping_for_provisioned_benID for table: {}", syncUploadDataDigester.getTableName()); - - String schemaName = syncUploadDataDigester.getSchemaName(); - String tableName = syncUploadDataDigester.getTableName(); - - // if (!isValidSchemaName(schemaName) || !isValidTableName(tableName)) { - // logger.error("Invalid schema or table name provided for m_beneficiaryregidmapping update: Schema='{}', Table='{}'.", schemaName, tableName); - // return "Error: Invalid schema or table name."; - // } - List> dataToBesync = syncUploadDataDigester.getSyncData(); List syncData = new ArrayList<>(); - String query = String.format("UPDATE %s.%s SET Provisioned = true, SyncedDate = now(), SyncedBy = ? WHERE BenRegId = ? AND BeneficiaryID = ? AND VanID = ?", schemaName, tableName); + String query = getqueryFor_M_BeneficiaryRegIdMapping(syncUploadDataDigester.getSchemaName(), + syncUploadDataDigester.getTableName()); for (Map map : dataToBesync) { if (map.get("BenRegId") != null && map.get("BeneficiaryID") != null && map.get("VanID") != null) { @@ -242,8 +221,8 @@ private String update_M_BeneficiaryRegIdMapping_for_provisioned_benID(SyncUpload if (!syncData.isEmpty()) { try { - int[] i = dataSyncRepositoryCentral.syncDataToCentralDB(schemaName, - tableName, SERVER_COLUMNS_NOT_REQUIRED, query, syncData); + int[] i = dataSyncRepositoryCentral.syncDataToCentralDB(syncUploadDataDigester.getSchemaName(), + syncUploadDataDigester.getTableName(), SERVER_COLUMNS_NOT_REQUIRED, query, syncData); if (i.length == syncData.size()) { logger.info("Successfully updated {} records for m_beneficiaryregidmapping.", i.length); @@ -262,125 +241,76 @@ private String update_M_BeneficiaryRegIdMapping_for_provisioned_benID(SyncUpload } } - + private String getqueryFor_M_BeneficiaryRegIdMapping(String schemaName, String tableName) { + StringBuilder queryBuilder = new StringBuilder(" UPDATE "); + queryBuilder.append(schemaName).append(".").append(tableName); + queryBuilder.append(" SET "); + queryBuilder.append("Provisioned = true, SyncedDate = now(), syncedBy = ?"); + queryBuilder.append(" WHERE "); + queryBuilder.append(" BenRegId = ? "); + queryBuilder.append(" AND "); + queryBuilder.append(" BeneficiaryID = ? "); + queryBuilder.append(" AND "); + queryBuilder.append(" VanID = ? "); + return queryBuilder.toString(); + } + public String update_I_BeneficiaryDetails_for_processed_in_batches(SyncUploadDataDigester syncUploadDataDigester) { logger.info("Processing update_I_BeneficiaryDetails_for_processed_in_batches for table: {}", syncUploadDataDigester.getTableName()); - String schemaName = syncUploadDataDigester.getSchemaName(); - String tableName = syncUploadDataDigester.getTableName(); - - // if (!isValidSchemaName(schemaName) || !isValidTableName(tableName)) { - // logger.error("Invalid schema or table name provided for i_beneficiarydetails update: Schema='{}', Table='{}'.", schemaName, tableName); - // return "Error: Invalid schema or table name."; - // } - - List syncData = new ArrayList<>(); // This list will hold data for batch updates to 'Processed' - - String updateQuery = getQueryFor_I_BeneficiaryDetails(schemaName, tableName); - - int limit = 1000; - int offset = 0; - int totalProcessed = 0; - - String whereClauseForBatchFetch = " WHERE Processed <> 'P' AND VanID IS NOT NULL "; // This is for fetching, not for update - - while (true) { - List> batchToFetch; - try { - batchToFetch = dataSyncRepositoryCentral.getBatchForBenDetails( - syncUploadDataDigester, - whereClauseForBatchFetch, - limit, - offset); - } catch (Exception e) { - logger.error("Error fetching batch for i_beneficiarydetails: {}", e.getMessage(), e); - return "Error fetching data for i_beneficiarydetails: " + e.getMessage(); - } - - if (batchToFetch.isEmpty()) { - break; - } - - for (Map map : batchToFetch) { - if (map.get("BeneficiaryDetailsId") != null && map.get("VanID") != null) { - Object[] params = new Object[3]; - params[0] = syncUploadDataDigester.getSyncedBy(); - params[1] = String.valueOf(map.get("BeneficiaryDetailsId")); - params[2] = String.valueOf(map.get("VanID")); - syncData.add(params); - } else { - logger.warn("Skipping record in i_beneficiarydetails due to missing BeneficiaryDetailsId or VanID: {}", map); - } - } - - if (!syncData.isEmpty()) { - try { - int[] batchUpdateResults = dataSyncRepositoryCentral.syncDataToCentralDB( - schemaName, - tableName, - SERVER_COLUMNS_NOT_REQUIRED, - updateQuery, - syncData); - - int successfulUpdates = 0; - for (int result : batchUpdateResults) { - if (result >= 1) { - successfulUpdates++; - } - } - totalProcessed += successfulUpdates; - logger.info("Batch update for i_beneficiarydetails: {} records processed, {} successfully updated.", syncData.size(), successfulUpdates); - - syncData.clear(); - offset += limit; - - } catch (Exception e) { - logger.error("Exception during batch update for i_beneficiarydetails: {}", e.getMessage(), e); - return "Error during sync for i_beneficiarydetails: " + e.getMessage(); - } - } else { - logger.info("No valid records in the current batch for i_beneficiarydetails to update."); - offset += limit; - } + List syncData = new ArrayList<>(); + + String query = getQueryFor_I_BeneficiaryDetails(syncUploadDataDigester.getSchemaName(), + syncUploadDataDigester.getTableName()); + + int limit = 1000; + int offset = 0; + int totalProcessed = 0; + + String problematicWhereClause = " WHERE Processed <> 'P' AND VanID IS NOT NULL "; // Define it explicitly + + while (true) { + List> batch; + try { + // *** ADD THIS LINE *** + logger.info("DEBUG: Passing whereClause to getBatchForBenDetails: [{}]", problematicWhereClause); + + batch = dataSyncRepositoryCentral.getBatchForBenDetails( + syncUploadDataDigester, + problematicWhereClause, + limit, + offset); + } catch (Exception e) { + logger.error("Error fetching batch for i_beneficiarydetails: {}", e.getMessage(), e); + return "Error fetching data for i_beneficiarydetails: " + e.getMessage(); } - - if (totalProcessed > 0) { + + if (totalProcessed > 0 || syncData.isEmpty()) { // syncData.isEmpty() means no records to process, still a "success" logger.info("Finished processing i_beneficiarydetails. Total records processed: {}", totalProcessed); return "data sync passed"; } else { - logger.info("No records were processed for i_beneficiarydetails."); - return "No data processed for i_beneficiarydetails."; + logger.error("No records were processed for i_beneficiarydetails or an unknown error occurred."); + return "No data processed or sync failed for i_beneficiarydetails."; } } - + } private String getQueryFor_I_BeneficiaryDetails(String schemaName, String tableName) { - // if (!isValidSchemaName(schemaName) || !isValidTableName(tableName)) { - // logger.error("Invalid schema or table name for getQueryFor_I_BeneficiaryDetails: Schema='{}', Table='{}'.", schemaName, tableName); - // throw new IllegalArgumentException("Invalid schema or table name provided."); - // } - return String.format("UPDATE %s.%s SET Processed = 'P', SyncedDate = now(), SyncedBy = ? WHERE BeneficiaryDetailsId = ? AND VanID = ?", schemaName, tableName); + StringBuilder queryBuilder = new StringBuilder(" UPDATE "); + queryBuilder.append(schemaName).append(".").append(tableName); + queryBuilder.append(" SET "); + queryBuilder.append("Processed = 'P', SyncedDate = now(), SyncedBy = ? "); + queryBuilder.append(" WHERE "); + queryBuilder.append("BeneficiaryDetailsId = ? "); + queryBuilder.append(" AND "); + queryBuilder.append("VanID = ? "); + return queryBuilder.toString(); } - + /** + * Handles the generic synchronization logic for tables not covered by specific handlers. + */ private boolean performGenericTableSync(SyncUploadDataDigester syncUploadDataDigester) { logger.info("Performing generic sync for table: {}", syncUploadDataDigester.getTableName()); - - String schemaName = syncUploadDataDigester.getSchemaName(); - String syncTableName = syncUploadDataDigester.getTableName(); - String vanAutoIncColumnName = syncUploadDataDigester.getVanAutoIncColumnName(); - String serverColumns = syncUploadDataDigester.getServerColumns(); - - // if (!isValidSchemaName(schemaName) || !isValidTableName(syncTableName)) { - // logger.error("Invalid schema or table name for generic sync: Schema='{}', Table='{}'.", schemaName, syncTableName); - // return false; - // } - - // if (!isValidColumnNames(serverColumns)) { - // logger.error("Invalid server columns provided for generic sync: {}", serverColumns); - // return false; - // } - - List> dataToBesync = syncUploadDataDigester.getSyncData(); List syncDataListInsert = new ArrayList<>(); List syncDataListUpdate = new ArrayList<>(); @@ -390,6 +320,9 @@ private boolean performGenericTableSync(SyncUploadDataDigester syncUploadDataDig return true; // Nothing to sync, consider it a success } + String syncTableName = syncUploadDataDigester.getTableName(); + String vanAutoIncColumnName = syncUploadDataDigester.getVanAutoIncColumnName(); + String schemaName = syncUploadDataDigester.getSchemaName(); Integer facilityIDFromDigester = syncUploadDataDigester.getFacilityID(); for (Map map : dataToBesync) { @@ -397,10 +330,13 @@ private boolean performGenericTableSync(SyncUploadDataDigester syncUploadDataDig String vanID = String.valueOf(map.get("VanID")); int syncFacilityID = 0; + // Update SyncedBy and SyncedDate in the map itself before processing map.put("SyncedBy", syncUploadDataDigester.getSyncedBy()); map.put("SyncedDate", String.valueOf(LocalDateTime.now())); // Ensure column name matches DB + // Facility ID processing if (facilityIDFromDigester != null) { + // Determine the 'Processed' status based on facility ID for specific tables switch (syncTableName.toLowerCase()) { case "t_indent": case "t_indentorder": { @@ -464,7 +400,7 @@ private boolean performGenericTableSync(SyncUploadDataDigester syncUploadDataDig // Prepare Object array for insert/update Object[] objArr; - List serverColumnsList = Arrays.asList(serverColumns.split(",")); + List serverColumnsList = Arrays.asList(syncUploadDataDigester.getServerColumns().split(",")); List currentRecordValues = new ArrayList<>(); for (String column : serverColumnsList) { @@ -504,9 +440,9 @@ private boolean performGenericTableSync(SyncUploadDataDigester syncUploadDataDig boolean updateSuccess = true; if (!syncDataListInsert.isEmpty()) { - String queryInsert = getQueryToInsertDataToServerDB(schemaName, syncTableName, serverColumns); + String queryInsert = getQueryToInsertDataToServerDB(schemaName, syncTableName, syncUploadDataDigester.getServerColumns()); try { - int[] i = dataSyncRepositoryCentral.syncDataToCentralDB(schemaName, syncTableName, serverColumns, queryInsert, syncDataListInsert); + int[] i = dataSyncRepositoryCentral.syncDataToCentralDB(schemaName, syncTableName, syncUploadDataDigester.getServerColumns(), queryInsert, syncDataListInsert); if (i.length != syncDataListInsert.size()) { insertSuccess = false; logger.error("Partial insert for table {}. Expected {} inserts, got {}. Failed records: {}", syncTableName, syncDataListInsert.size(), i.length, getFailedRecords(i, syncDataListInsert)); @@ -520,7 +456,7 @@ private boolean performGenericTableSync(SyncUploadDataDigester syncUploadDataDig } if (!syncDataListUpdate.isEmpty()) { - String queryUpdate = getQueryToUpdateDataToServerDB(schemaName, serverColumns, syncTableName); + String queryUpdate = getQueryToUpdateDataToServerDB(schemaName, syncUploadDataDigester.getServerColumns(), syncTableName); try { int[] j = dataSyncRepositoryCentral.syncDataToCentralDB(schemaName, syncTableName, SERVER_COLUMNS_NOT_REQUIRED, queryUpdate, syncDataListUpdate); if (j.length != syncDataListUpdate.size()) { @@ -538,59 +474,53 @@ private boolean performGenericTableSync(SyncUploadDataDigester syncUploadDataDig } private String getQueryToInsertDataToServerDB(String schemaName, String tableName, String serverColumns) { - // if (!isValidSchemaName(schemaName) || !isValidTableName(tableName)) { - // logger.error("Invalid schema or table name for getQueryToInsertDataToServerDB: Schema='{}', Table='{}'.", schemaName, tableName); - // throw new IllegalArgumentException("Invalid schema or table name provided."); - // } - // if (!isValidColumnNames(serverColumns)) { - // logger.error("Invalid server columns provided for getQueryToInsertDataToServerDB: {}", serverColumns); - // throw new IllegalArgumentException("Invalid column names provided."); - // } + String[] columnsArr = null; + if (serverColumns != null) + columnsArr = serverColumns.split(","); - - String[] columnsArr = serverColumns.split(","); StringBuilder preparedStatementSetter = new StringBuilder(); - for (int i = 0; i < columnsArr.length; i++) { - preparedStatementSetter.append("?"); - if (i < columnsArr.length - 1) { - preparedStatementSetter.append(", "); + if (columnsArr != null && columnsArr.length > 0) { + for (int i = 0; i < columnsArr.length; i++) { + preparedStatementSetter.append("?"); + if (i < columnsArr.length - 1) { + preparedStatementSetter.append(", "); + } } } - return String.format("INSERT INTO %s.%s(%s) VALUES (%s)", schemaName, tableName, serverColumns, preparedStatementSetter.toString()); + StringBuilder queryBuilder = new StringBuilder("INSERT INTO "); + queryBuilder.append(schemaName).append(".").append(tableName); + queryBuilder.append("("); + queryBuilder.append(serverColumns); + queryBuilder.append(") VALUES ("); + queryBuilder.append(preparedStatementSetter); + queryBuilder.append(")"); + return queryBuilder.toString(); } public String getQueryToUpdateDataToServerDB(String schemaName, String serverColumns, String tableName) { - // if (!isValidSchemaName(schemaName) || !isValidTableName(tableName)) { - // logger.error("Invalid schema or table name for getQueryToUpdateDataToServerDB: Schema='{}', Table='{}'.", schemaName, tableName); - // throw new IllegalArgumentException("Invalid schema or table name provided."); - // } - // if (!isValidColumnNames(serverColumns)) { - // logger.error("Invalid server columns provided for getQueryToUpdateDataToServerDB: {}", serverColumns); - // throw new IllegalArgumentException("Invalid column names provided."); - // } - - String[] columnsArr = serverColumns.split(","); + String[] columnsArr = null; + if (serverColumns != null) + columnsArr = serverColumns.split(","); + StringBuilder preparedStatementSetter = new StringBuilder(); - for (int i = 0; i < columnsArr.length; i++) { - String column = columnsArr[i].trim(); - // if (!isValidColumnName(column)) { - // logger.error("Invalid individual column name encountered: {}", column); - // throw new IllegalArgumentException("Invalid individual column name provided: " + column); - // } - - preparedStatementSetter.append(column); - preparedStatementSetter.append(" = ?"); - if (i < columnsArr.length - 1) { - preparedStatementSetter.append(", "); + if (columnsArr != null && columnsArr.length > 0) { + for (int i = 0; i < columnsArr.length; i++) { + preparedStatementSetter.append(columnsArr[i].trim()); + preparedStatementSetter.append(" = ?"); + if (i < columnsArr.length - 1) { + preparedStatementSetter.append(", "); + } } } - StringBuilder queryBuilder = new StringBuilder(); - queryBuilder.append(String.format("UPDATE %s.%s SET %s WHERE VanSerialNo = ?", schemaName, tableName, preparedStatementSetter.toString())); - + StringBuilder queryBuilder = new StringBuilder(" UPDATE "); + queryBuilder.append(schemaName).append(".").append(tableName); + queryBuilder.append(" SET "); + queryBuilder.append(preparedStatementSetter); + queryBuilder.append(" WHERE VanSerialNo = ? "); if (Arrays.asList("t_patientissue", "t_physicalstockentry", "t_stockadjustment", "t_saitemmapping", "t_stocktransfer", "t_patientreturn", "t_facilityconsumption", "t_indent", @@ -603,41 +533,20 @@ public String getQueryToUpdateDataToServerDB(String schemaName, String serverCol return queryBuilder.toString(); } - private boolean isValidSchemaName(String schemaName) { - return VALID_SCHEMAS.contains(schemaName.toLowerCase()); - } - - private boolean isValidTableName(String tableName) { - return VALID_TABLES.contains(tableName.toLowerCase()); - } - - private boolean isValidColumnName(String columnName) { - return columnName != null && columnName.matches("^[a-zA-Z_][a-zA-Z0-9_]*$"); - } - - private boolean isValidColumnNames(String columnNames) { - if (columnNames == null || columnNames.trim().isEmpty()) { - return false; - } - String[] cols = columnNames.split(","); - for (String col : cols) { - if (!isValidColumnName(col.trim())) { - return false; - } - } - return true; - } - - + // Helper to get information about failed records (for logging purposes) private String getFailedRecords(int[] results, List data) { List failedRecordsInfo = new ArrayList<>(); for (int k = 0; k < results.length; k++) { - if (results[k] < 1) { - String idInfo = "N/A"; - if (data.get(k) != null && data.get(k).length > 0) { - idInfo = "Record data size: " + data.get(k).length; + // In Spring JDBC batchUpdate, a value of Statement.EXECUTE_FAILED or Statement.SUCCESS_NO_INFO + // usually indicates a failure or success without specific row count. + // A common return value for success is 1 (for one row updated/inserted). + if (results[k] < 1) { // Assuming 1 means success, and anything else (0, -2, etc.) means failure + // Attempt to get some identifiable info from the failed record + if (data.get(k).length > 0) { + failedRecordsInfo.add("Record at index " + k + " (VanSerialNo/ID: " + data.get(k)[data.get(k).length - 2] + ")"); + } else { + failedRecordsInfo.add("Record at index " + k + " (No identifiable info)"); } - failedRecordsInfo.add("Record at index " + k + " (Info: " + idInfo + ")"); } } return String.join("; ", failedRecordsInfo); From 9c97e6d9e27545f330ea94858bb4e6e8738f4610 Mon Sep 17 00:00:00 2001 From: Vanitha S <116701245+vanitha1822@users.noreply.github.com> Date: Fri, 8 Aug 2025 09:13:31 +0530 Subject: [PATCH 16/47] Fix the datasync upload issue (#107) * fix: add the schemas * fix: remove logger * fix: revert the old code for repository --- .../dataSyncActivity/DataSyncRepository.java | 7 +- .../UploadDataToServerImpl.java | 1 + .../DataSyncRepositoryCentral.java | 234 +++++++++--------- .../GetDataFromVanAndSyncToDBImpl.java | 24 +- 4 files changed, 134 insertions(+), 132 deletions(-) diff --git a/src/main/java/com/iemr/mmu/service/dataSyncActivity/DataSyncRepository.java b/src/main/java/com/iemr/mmu/service/dataSyncActivity/DataSyncRepository.java index 52fcf94a..b039a47f 100644 --- a/src/main/java/com/iemr/mmu/service/dataSyncActivity/DataSyncRepository.java +++ b/src/main/java/com/iemr/mmu/service/dataSyncActivity/DataSyncRepository.java @@ -64,7 +64,7 @@ public List> getDataForGivenSchemaAndTable(String schema, St if (table != null && table.equalsIgnoreCase("m_beneficiaryregidmapping")) { baseQuery = " SELECT " + columnNames + " FROM " + schema + "." + table - + " WHERE provisioned is true AND processed != 'P' AND vanID is not null "; + + " WHERE provisioned is true AND processed <> 'P' AND vanID is not null "; } else { if (table != null && (table.equalsIgnoreCase("t_patientissue") || table.equalsIgnoreCase("t_physicalstockentry") || table.equalsIgnoreCase("t_stockadjustment") @@ -75,15 +75,14 @@ public List> getDataForGivenSchemaAndTable(String schema, St || table.equalsIgnoreCase("t_itemstockexit"))) { baseQuery = " SELECT " + columnNames + " FROM " + schema + "." + table - + " WHERE processed != 'P' AND SyncFacilityID is not null "; + + " WHERE processed <> 'P' AND SyncFacilityID is not null "; } else { baseQuery = " SELECT " + columnNames + " FROM " + schema + "." + table - + " WHERE processed != 'P' AND vanID is not null "; + + " WHERE processed <> 'P' AND vanID is not null "; } } - resultSetList = jdbcTemplate.queryForList(baseQuery); return resultSetList; } diff --git a/src/main/java/com/iemr/mmu/service/dataSyncActivity/UploadDataToServerImpl.java b/src/main/java/com/iemr/mmu/service/dataSyncActivity/UploadDataToServerImpl.java index b65fe6e5..9476ecc7 100644 --- a/src/main/java/com/iemr/mmu/service/dataSyncActivity/UploadDataToServerImpl.java +++ b/src/main/java/com/iemr/mmu/service/dataSyncActivity/UploadDataToServerImpl.java @@ -299,6 +299,7 @@ public List getVanAndServerColumnList(Integer groupID) throws private List> getDataToSync(String schemaName, String tableName, String columnNames) throws Exception { + logger.info("Fetching data to sync for schema: {}, table: {}, columns: {}", schemaName, tableName, columnNames); List> resultSetList = dataSyncRepository.getDataForGivenSchemaAndTable(schemaName, tableName, columnNames); if (resultSetList != null) { diff --git a/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/DataSyncRepositoryCentral.java b/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/DataSyncRepositoryCentral.java index 175de980..bdba82d0 100644 --- a/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/DataSyncRepositoryCentral.java +++ b/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/DataSyncRepositoryCentral.java @@ -21,21 +21,19 @@ */ package com.iemr.mmu.service.dataSyncLayerCentral; -import java.sql.Timestamp; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import javax.sql.DataSource; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; -import com.iemr.mmu.data.syncActivity_syncLayer.SyncUploadDataDigester; +import javax.sql.DataSource; +import java.sql.Timestamp; +import java.sql.Statement; // Import Statement for batchUpdate result interpretation +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; @Service public class DataSyncRepositoryCentral { @@ -44,6 +42,7 @@ public class DataSyncRepositoryCentral { private JdbcTemplate jdbcTemplate; + // Lazily initialize jdbcTemplate to ensure DataSource is available private JdbcTemplate getJdbcTemplate() { if (this.jdbcTemplate == null) { this.jdbcTemplate = new JdbcTemplate(dataSource); @@ -51,170 +50,161 @@ private JdbcTemplate getJdbcTemplate() { return this.jdbcTemplate; } - private final Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName()); - - private static final Set VALID_SCHEMAS = Set.of("public", "db_iemr"); - - private static final Set VALID_TABLES = Set.of( - "m_beneficiaryregidmapping", "i_beneficiaryaccount", "i_beneficiaryaddress", "i_beneficiarycontacts", - "i_beneficiarydetails", "i_beneficiaryfamilymapping", "i_beneficiaryidentity", "i_beneficiarymapping", - "t_benvisitdetail", "t_phy_anthropometry", "t_phy_vitals", "t_benadherence", "t_anccare", "t_pnccare", - "t_ncdscreening", "t_ncdcare", "i_ben_flow_outreach", "t_covid19", "t_idrsdetails", "t_physicalactivity", - "t_phy_generalexam", "t_phy_headtotoe", "t_sys_obstetric", "t_sys_gastrointestinal", "t_sys_cardiovascular", - "t_sys_respiratory", "t_sys_centralnervous", "t_sys_musculoskeletalsystem", "t_sys_genitourinarysystem", - "t_ancdiagnosis", "t_ncddiagnosis", "t_pncdiagnosis", "t_benchefcomplaint", "t_benclinicalobservation", - "t_prescription", "t_prescribeddrug", "t_lab_testorder", "t_benreferdetails", - "t_lab_testresult", "t_physicalstockentry", "t_patientissue", "t_facilityconsumption", "t_itemstockentry", - "t_itemstockexit", "t_benmedhistory", "t_femaleobstetrichistory", "t_benmenstrualdetails", - "t_benpersonalhabit", "t_childvaccinedetail1", "t_childvaccinedetail2", "t_childoptionalvaccinedetail", - "t_ancwomenvaccinedetail", "t_childfeedinghistory", "t_benallergyhistory", "t_bencomorbiditycondition", - "t_benmedicationhistory", "t_benfamilyhistory", "t_perinatalhistory", "t_developmenthistory", - "t_cancerfamilyhistory", "t_cancerpersonalhistory", "t_cancerdiethistory", "t_cancerobstetrichistory", - "t_cancervitals", "t_cancersignandsymptoms", "t_cancerlymphnode", "t_canceroralexamination", - "t_cancerbreastexamination", "t_cancerabdominalexamination", "t_cancergynecologicalexamination", - "t_cancerdiagnosis", "t_cancerimageannotation", "i_beneficiaryimage", "t_stockadjustment", - "t_stocktransfer", "t_patientreturn", "t_indent", "t_indentissue", "t_indentorder", "t_saitemmapping" - ); - - private boolean isValidDatabaseIdentifierCharacter(String identifier) { - return identifier != null && identifier.matches("^[a-zA-Z_][a-zA-Z0-9_]*$"); - } - - private boolean isValidSchemaName(String schemaName) { - return VALID_SCHEMAS.contains(schemaName.toLowerCase()); - } - - private boolean isValidTableName(String tableName) { - return VALID_TABLES.contains(tableName.toLowerCase()); - } - - private boolean isValidColumnNamesList(String columnNames) { - if (columnNames == null || columnNames.trim().isEmpty()) { - return false; - } - for (String col : columnNames.split(",")) { - if (!isValidDatabaseIdentifierCharacter(col.trim())) { - return false; - } - } - return true; - } + private Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName()); + // Data Upload Repository public int checkRecordIsAlreadyPresentOrNot(String schemaName, String tableName, String vanSerialNo, String vanID, String vanAutoIncColumnName, int syncFacilityID) { jdbcTemplate = getJdbcTemplate(); - List params = new ArrayList<>(); - if (!isValidSchemaName(schemaName) || !isValidTableName(tableName) || - !isValidDatabaseIdentifierCharacter(vanAutoIncColumnName)) { - logger.error("Invalid identifiers: schema={}, table={}, column={}", schemaName, tableName, vanAutoIncColumnName); - throw new IllegalArgumentException("Invalid identifiers provided."); - } + List params = new ArrayList<>(); - StringBuilder queryBuilder = new StringBuilder("SELECT ") - .append(vanAutoIncColumnName).append(" FROM ") - .append(schemaName).append(".").append(tableName).append(" WHERE VanSerialNo = ?"); + StringBuilder queryBuilder = new StringBuilder("SELECT "); + queryBuilder.append(vanAutoIncColumnName); + queryBuilder.append(" FROM "); + queryBuilder.append(schemaName).append(".").append(tableName); + StringBuilder whereClause = new StringBuilder(); + whereClause.append(" WHERE "); + whereClause.append("VanSerialNo = ?"); params.add(vanSerialNo); - if (List.of("t_patientissue", "t_physicalstockentry", "t_stockadjustment", "t_saitemmapping", + if (Arrays.asList("t_patientissue", "t_physicalstockentry", "t_stockadjustment", "t_saitemmapping", "t_stocktransfer", "t_patientreturn", "t_facilityconsumption", "t_indent", - "t_indentorder", "t_indentissue", "t_itemstockentry", "t_itemstockexit").contains(tableName.toLowerCase()) && syncFacilityID > 0) { - queryBuilder.append(" AND SyncFacilityID = ?"); + "t_indentorder", "t_indentissue", "t_itemstockentry", "t_itemstockexit") + .contains(tableName.toLowerCase()) && syncFacilityID > 0) { + + whereClause.append(" AND "); + whereClause.append("SyncFacilityID = ?"); params.add(syncFacilityID); + } else { - queryBuilder.append(" AND VanID = ?"); + whereClause.append(" AND "); + whereClause.append("VanID = ?"); params.add(vanID); } + queryBuilder.append(whereClause); + String query = queryBuilder.toString(); + Object[] queryParams = params.toArray(); + + logger.debug("Checking record existence query: {} with params: {}", query, Arrays.toString(queryParams)); + System.out.println("Checking record existence query: " + query + " with params: " + Arrays.toString(queryParams)); + try { - List> resultSet = jdbcTemplate.queryForList(queryBuilder.toString(), params.toArray()); - return (resultSet != null && !resultSet.isEmpty()) ? 1 : 0; + List> resultSet = jdbcTemplate.queryForList(query, queryParams); + if (resultSet != null && !resultSet.isEmpty()) { + System.out.println("Record found for table " + tableName + ": VanSerialNo=" + vanSerialNo + ", VanID=" + vanID); + logger.debug("Record found for table {}: VanSerialNo={}, VanID={}", tableName, vanSerialNo, vanID); + return 1; + } else { + System.out.println("No record found for table " + tableName + ": VanSerialNo=" + vanSerialNo + ", VanID=" + vanID); + logger.debug("No record found for table {}: VanSerialNo={}, VanID={}", tableName, vanSerialNo, vanID); + return 0; + } + } catch (org.springframework.dao.EmptyResultDataAccessException e) { + System.out.println("No record found (EmptyResultDataAccessException) for table " + tableName + ": VanSerialNo=" + vanSerialNo + ", VanID=" + vanID); + logger.debug("No record found (EmptyResultDataAccessException) for table {}: VanSerialNo={}, VanID={}", tableName, vanSerialNo, vanID); + return 0; } catch (Exception e) { - logger.error("Error checking record presence: {}", e.getMessage(), e); - throw new RuntimeException("Failed to check record existence: " + e.getMessage(), e); + System.out.println("Database error during checkRecordIsAlreadyPresentOrNot for table " + tableName + ": VanSerialNo=" + vanSerialNo + ", VanID=" + vanID); + logger.error("Database error during checkRecordIsAlreadyPresentOrNot for table {}: VanSerialNo={}, VanID={}. Error: {}", tableName, vanSerialNo, vanID, e.getMessage(), e); + throw new RuntimeException("Failed to check record existence: " + e.getMessage(), e); // Re-throw or handle as appropriate } } + // Method for synchronization of data to central DB public int[] syncDataToCentralDB(String schema, String tableName, String serverColumns, String query, List syncDataList) { jdbcTemplate = getJdbcTemplate(); + logger.info("Executing batch operation for table: {}. Query type: {}. Number of records: {}", tableName, query.startsWith("INSERT") ? "INSERT" : "UPDATE", syncDataList.size()); + logger.debug("Query: {}", query); +System.out.println("Executing batch operation for table: " + tableName + ". Query type: " + (query.startsWith("INSERT") ? "INSERT" : "UPDATE") + ". Number of records: " + syncDataList.size()); try { - return jdbcTemplate.batchUpdate(query, syncDataList); + // Start batch insert/update + int[] i = jdbcTemplate.batchUpdate(query, syncDataList); + System.out.println("Batch operation completed for table " + tableName + ". Results: " + Arrays.toString(i)); + logger.info("Batch operation completed for table {}. Results: {}", tableName, Arrays.toString(i)); + return i; } catch (Exception e) { - logger.error("Batch sync failed for table {}: {}", tableName, e.getMessage(), e); - throw new RuntimeException("Batch sync failed: " + e.getMessage(), e); + logger.error("Exception during batch update for table {}: {}", tableName, e.getMessage(), e); + System.out.println("Exception during batch update for table " + tableName + ": " + e.getMessage()); + // Log the error with detailed information + // Re-throw the exception to be handled by the service layer, so specific errors can be captured. + throw new RuntimeException("Batch sync failed for table " + tableName + ": " + e.getMessage(), e); } } + // End of Data Upload Repository + public List> getMasterDataFromTable(String schema, String table, String columnNames, - String masterType, Timestamp lastDownloadDate, Integer vanID, Integer psmID) { + String masterType, Timestamp lastDownloadDate, Integer vanID, Integer psmID) throws Exception { jdbcTemplate = getJdbcTemplate(); + List> resultSetList = new ArrayList<>(); + StringBuilder baseQueryBuilder = new StringBuilder(" SELECT ").append(columnNames).append(" FROM ").append(schema).append(".").append(table); List params = new ArrayList<>(); - if (!isValidSchemaName(schema) || !isValidTableName(table) || !isValidColumnNamesList(columnNames)) { - throw new IllegalArgumentException("Invalid schema, table, or column names."); - } - - StringBuilder queryBuilder = new StringBuilder("SELECT ").append(columnNames) - .append(" FROM ").append(schema).append(".").append(table); - if (masterType != null) { if (lastDownloadDate != null) { - queryBuilder.append(" WHERE LastModDate >= ?"); + baseQueryBuilder.append(" WHERE LastModDate >= ? "); params.add(lastDownloadDate); - if ("V".equalsIgnoreCase(masterType)) { - queryBuilder.append(" AND VanID = ?"); + if (masterType.equalsIgnoreCase("V")) { + baseQueryBuilder.append(" AND VanID = ? "); params.add(vanID); - } else if ("P".equalsIgnoreCase(masterType)) { - queryBuilder.append(" AND ProviderServiceMapID = ?"); + } else if (masterType.equalsIgnoreCase("P")) { + baseQueryBuilder.append(" AND ProviderServiceMapID = ? "); params.add(psmID); } } else { - queryBuilder.append(" WHERE "); - if ("V".equalsIgnoreCase(masterType)) { - queryBuilder.append("VanID = ?"); + if (masterType.equalsIgnoreCase("V")) { + baseQueryBuilder.append(" WHERE VanID = ? "); params.add(vanID); - } else if ("P".equalsIgnoreCase(masterType)) { - queryBuilder.append("ProviderServiceMapID = ?"); + } else if (masterType.equalsIgnoreCase("P")) { + baseQueryBuilder.append(" WHERE ProviderServiceMapID = ? "); params.add(psmID); } } } + String finalQuery = baseQueryBuilder.toString(); + logger.info("Select query central: {}", finalQuery); + logger.info("Last Downloaded Date: {}", lastDownloadDate); + logger.info("Query Params: {}", params); + System.out.println("Select query central: " + finalQuery); + System.out.println("Last Downloaded Date: " + lastDownloadDate); + System.out.println("Query Params: " + params); + try { - // Safe dynamic SQL: All dynamic parts (table names, columns, etc.) are validated or hardcoded. - // Parameter values are bound safely using prepared statement placeholders (?). - return jdbcTemplate.queryForList(queryBuilder.toString(), params.toArray()); + if (params.isEmpty()) { + resultSetList = jdbcTemplate.queryForList(finalQuery); + } else { + resultSetList = jdbcTemplate.queryForList(finalQuery, params.toArray()); + } } catch (Exception e) { - logger.error("Error fetching master data: {}", e.getMessage(), e); + System.out.println("Error fetching master data from table " + table + ": " + e.getMessage()); + logger.error("Error fetching master data from table {}: {}", table, e.getMessage(), e); throw new RuntimeException("Failed to fetch master data: " + e.getMessage(), e); } +System.out.println("Result set Details size: " + resultSetList.size()); + logger.info("Result set Details size: {}", resultSetList.size()); + return resultSetList; } - public List> getBatchForBenDetails(SyncUploadDataDigester digester, + public List> getBatchForBenDetails(String schema, String table, String columnNames, String whereClause, int limit, int offset) { - jdbcTemplate = getJdbcTemplate(); - -String schema = digester.getSchemaName(); - String table = digester.getTableName(); - String columnNames = digester.getServerColumns(); - - - if (!isValidSchemaName(schema) || !isValidTableName(table) || !isValidColumnNamesList(columnNames)) { - throw new IllegalArgumentException("Invalid schema, table, or column names."); - } - // Safe dynamic SQL: Schema, table, and column names are validated against predefined whitelists. - // Only trusted values are used in the query string. - // limit and offset are passed as parameters to prevent SQL injection. - String query = String.format("SELECT %s FROM %s.%s %s LIMIT ? OFFSET ?", columnNames, schema, table, whereClause); //NOSONAR - - try { - return jdbcTemplate.queryForList(query, limit, offset); - } catch (Exception e) { - logger.error("Error fetching batch details: {}", e.getMessage(), e); - throw new RuntimeException("Failed to fetch batch data: " + e.getMessage(), e); - } + jdbcTemplate = getJdbcTemplate(); + String query = "SELECT " + columnNames + " FROM " + schema + "." + table + whereClause + " LIMIT ? OFFSET ?"; + System.out.println("Fetching batch for beneficiary details. Query: " + query + ", Limit: " + limit + ", Offset: " + offset); + logger.debug("Fetching batch for beneficiary details. Query: {}, Limit: {}, Offset: {}", query, limit, offset); + try { + return jdbcTemplate.queryForList(query, limit, offset); + } catch (Exception e) { + logger.error("Error fetching batch for beneficiary details from table {}: {}", table, e.getMessage(), e); + System.out.println("Error fetching batch for beneficiary details from table " + table + ": " + e.getMessage()); + throw new RuntimeException("Failed to fetch batch data: " + e.getMessage(), e); } -} + } + + // End of Data Download Repository +} \ No newline at end of file diff --git a/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java b/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java index 69be169f..4a97725b 100644 --- a/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java +++ b/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java @@ -49,6 +49,17 @@ public class GetDataFromVanAndSyncToDBImpl implements GetDataFromVanAndSyncToDB private static final Map> TABLE_GROUPS = new HashMap<>(); static { + // Group 1: Master data or less frequently changing data + TABLE_GROUPS.put(1, Arrays.asList("m_beneficiaryregidmapping", "m_another_master_table")); + + // Group 2: Transactional data that might involve facility ID + TABLE_GROUPS.put(2, Arrays.asList("t_indent", "t_indentorder", "t_indentissue", "t_stocktransfer", "t_itemstockentry")); + + // Group 3: High volume transactional data + TABLE_GROUPS.put(3, Arrays.asList("i_beneficiarydetails", "t_patientissue", "t_physicalstockentry", + "t_stockadjustment", "t_saitemmapping", "t_patientreturn", + "t_facilityconsumption", "t_itemstockexit")); + // Add more groups as needed, up to 9 TABLE_GROUPS.put(1, Arrays.asList("m_beneficiaryregidmapping", "i_beneficiaryaccount","i_beneficiaryaddress","i_beneficiarycontacts","i_beneficiarydetails","i_beneficiaryfamilymapping","i_beneficiaryidentity","i_beneficiarymapping")); TABLE_GROUPS.put(2, Arrays.asList("t_benvisitdetail","t_phy_anthropometry","t_phy_vitals","t_benadherence","t_anccare","t_pnccare","t_ncdscreening","t_ncdcare","i_ben_flow_outreach","t_covid19","t_idrsdetails","t_physicalactivity")); @@ -67,11 +78,10 @@ public class GetDataFromVanAndSyncToDBImpl implements GetDataFromVanAndSyncToDB TABLE_GROUPS.put(9, Arrays.asList("t_itemstockentry","t_itemstockexit","t_patientissue","t_physicalstockentry","t_stockadjustment","t_stocktransfer","t_patientreturn","t_facilityconsumption","t_indent","t_indentissue","t_indentorder","t_saitemmapping")); - } + } public String syncDataToServer(String requestOBJ, String Authorization, String token) throws Exception { logger.info("Starting syncDataToServer. Token: {}", token); - ObjectMapper mapper = new ObjectMapper(); SyncUploadDataDigester syncUploadDataDigester = mapper.readValue(requestOBJ, SyncUploadDataDigester.class); @@ -91,7 +101,8 @@ public String syncDataToServer(String requestOBJ, String Authorization, String t logger.error("Sync failed for m_beneficiaryregidmapping: {}", result); return "Sync failed for m_beneficiaryregidmapping."; } - } else if ("i_beneficiarydetails".equalsIgnoreCase(syncTableName)) { + } + if ("i_beneficiarydetails".equalsIgnoreCase(syncTableName)) { String result = update_I_BeneficiaryDetails_for_processed_in_batches(syncUploadDataDigester); if ("data sync passed".equals(result)) { return "Sync successful for i_beneficiarydetails."; @@ -271,12 +282,13 @@ public String update_I_BeneficiaryDetails_for_processed_in_batches(SyncUploadDat while (true) { List> batch; try { - // *** ADD THIS LINE *** logger.info("DEBUG: Passing whereClause to getBatchForBenDetails: [{}]", problematicWhereClause); batch = dataSyncRepositoryCentral.getBatchForBenDetails( - syncUploadDataDigester, - problematicWhereClause, + syncUploadDataDigester.getSchemaName(), + syncUploadDataDigester.getTableName(), + syncUploadDataDigester.getServerColumns(), + problematicWhereClause, // Use the variable limit, offset); } catch (Exception e) { From 43df9cf6563abc6ed1c5702e9a062e5386480a28 Mon Sep 17 00:00:00 2001 From: Vanitha S <116701245+vanitha1822@users.noreply.github.com> Date: Sun, 10 Aug 2025 19:05:10 +0530 Subject: [PATCH 17/47] Fixing the datasync from local to central (#110) * fix: datasync from local to central * fix: fix the token --- .../MMUDataSyncVanToServer.java | 6 +- .../dataSyncActivity/DataSyncRepository.java | 33 ++- .../UploadDataToServerImpl.java | 53 +--- .../DataSyncRepositoryCentral.java | 238 ++++++++------- .../GetDataFromVanAndSyncToDBImpl.java | 280 +++++++++++------- .../mmu/utils/JwtUserIdValidationFilter.java | 15 +- .../com/iemr/mmu/utils/RestTemplateUtil.java | 16 +- 7 files changed, 337 insertions(+), 304 deletions(-) diff --git a/src/main/java/com/iemr/mmu/controller/dataSyncLayerCentral/MMUDataSyncVanToServer.java b/src/main/java/com/iemr/mmu/controller/dataSyncLayerCentral/MMUDataSyncVanToServer.java index eeb54e9f..524094e5 100644 --- a/src/main/java/com/iemr/mmu/controller/dataSyncLayerCentral/MMUDataSyncVanToServer.java +++ b/src/main/java/com/iemr/mmu/controller/dataSyncLayerCentral/MMUDataSyncVanToServer.java @@ -63,12 +63,8 @@ public String dataSyncToServer(@RequestBody String requestOBJ, @RequestHeader(value = "Authorization") String Authorization, HttpServletRequest request) { OutputResponse response = new OutputResponse(); - logger.info("test: vanto server auth="+Authorization); try { - String jwtToken = CookieUtil.getJwtTokenFromCookie(request); - logger.info("test: vanto server token="+jwtToken); - - String s = getDataFromVanAndSyncToDBImpl.syncDataToServer(requestOBJ, Authorization, jwtToken); + String s = getDataFromVanAndSyncToDBImpl.syncDataToServer(requestOBJ, Authorization); if (s != null) response.setResponse(s); else diff --git a/src/main/java/com/iemr/mmu/service/dataSyncActivity/DataSyncRepository.java b/src/main/java/com/iemr/mmu/service/dataSyncActivity/DataSyncRepository.java index b039a47f..9b020a4e 100644 --- a/src/main/java/com/iemr/mmu/service/dataSyncActivity/DataSyncRepository.java +++ b/src/main/java/com/iemr/mmu/service/dataSyncActivity/DataSyncRepository.java @@ -28,7 +28,10 @@ import javax.sql.DataSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.annotation.CreatedDate; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; @@ -50,6 +53,8 @@ public class DataSyncRepository { @Autowired private SyncUtilityClassRepo syncutilityClassRepo; + private Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName()); + private JdbcTemplate getJdbcTemplate() { return new JdbcTemplate(dataSource); @@ -64,7 +69,7 @@ public List> getDataForGivenSchemaAndTable(String schema, St if (table != null && table.equalsIgnoreCase("m_beneficiaryregidmapping")) { baseQuery = " SELECT " + columnNames + " FROM " + schema + "." + table - + " WHERE provisioned is true AND processed <> 'P' AND vanID is not null "; + + " WHERE provisioned is true AND processed != 'P' AND vanID is not null "; } else { if (table != null && (table.equalsIgnoreCase("t_patientissue") || table.equalsIgnoreCase("t_physicalstockentry") || table.equalsIgnoreCase("t_stockadjustment") @@ -75,30 +80,36 @@ public List> getDataForGivenSchemaAndTable(String schema, St || table.equalsIgnoreCase("t_itemstockexit"))) { baseQuery = " SELECT " + columnNames + " FROM " + schema + "." + table - + " WHERE processed <> 'P' AND SyncFacilityID is not null "; + + " WHERE processed != 'P' AND SyncFacilityID is not null "; } else { baseQuery = " SELECT " + columnNames + " FROM " + schema + "." + table - + " WHERE processed <> 'P' AND vanID is not null "; + + " WHERE processed != 'P' AND vanID is not null "; } } + resultSetList = jdbcTemplate.queryForList(baseQuery); return resultSetList; } - - public int updateProcessedFlagInVan(String schemaName, String tableName, StringBuilder vanSerialNos, String autoIncreamentColumn, String user) throws Exception { jdbcTemplate = getJdbcTemplate(); - String query = " UPDATE " + schemaName + "." + tableName - + " SET processed = 'P' , SyncedDate = ?, Syncedby = ? WHERE " + autoIncreamentColumn - + " IN (" + vanSerialNos + ")"; + String query = ""; - Timestamp syncedDate = new Timestamp(System.currentTimeMillis()); - int updatedRows = jdbcTemplate.update(query, syncedDate, user); + if (tableName != null && tableName.toLowerCase().equals("i_ben_flow_outreach")) { + query = "UPDATE " + schemaName + "." + tableName + + " SET created_date = ? , processed = 'P', SyncedDate = ?, Syncedby = ? " + + "WHERE " + autoIncreamentColumn + " IN (" + vanSerialNos + ")"; + } else { + query = "UPDATE " + schemaName + "." + tableName + + " SET CreatedDate = ? , processed = 'P', SyncedDate = ?, Syncedby = ? " + + "WHERE " + autoIncreamentColumn + " IN (" + vanSerialNos + ")"; + } + Timestamp syncedDate = new Timestamp(System.currentTimeMillis()); + int updatedRows = jdbcTemplate.update(query, syncedDate, syncedDate, user); return updatedRows; } @@ -119,4 +130,4 @@ public int[] updateLatestMasterInLocal(String query, List syncDataList // ---------------------------------- End of Download Repository -} +} \ No newline at end of file diff --git a/src/main/java/com/iemr/mmu/service/dataSyncActivity/UploadDataToServerImpl.java b/src/main/java/com/iemr/mmu/service/dataSyncActivity/UploadDataToServerImpl.java index 9476ecc7..2c24dc2c 100644 --- a/src/main/java/com/iemr/mmu/service/dataSyncActivity/UploadDataToServerImpl.java +++ b/src/main/java/com/iemr/mmu/service/dataSyncActivity/UploadDataToServerImpl.java @@ -243,32 +243,8 @@ private void setResponseStatus(Map groupIdStatus, int groupId, S groupIdStatus.put("groupId", String.valueOf(groupId)); groupIdStatus.put("status", serverAcknowledgement); responseStatus.add(groupIdStatus); - logger.info("Response from data sync: {}", responseStatus); } -// private boolean setResponseStatus(Map groupIdStatus, int groupId, String serverAcknowledgement, -// List> responseStatus, boolean isProgress) { -// if (serverAcknowledgement != null) { -// groupIdStatus.put("groupId", String.valueOf(groupId)); -// groupIdStatus.put("status", serverAcknowledgement); -// responseStatus.add(groupIdStatus); -// logger.info("Response from data sync", responseStatus); -// } else if (isProgress) { -// groupIdStatus.put("groupId", String.valueOf(groupId)); -// groupIdStatus.put("status", "pending"); -// responseStatus.add(groupIdStatus); -// logger.info("Response from data sync", responseStatus); -// } else { -// isProgress = true; -// groupIdStatus.put("groupId", String.valueOf(groupId)); -// groupIdStatus.put("status", "failed"); -// responseStatus.add(groupIdStatus); -// logger.info("Response from data sync", responseStatus); -// } -// return isProgress; -// -// } - /** * * @param syncTableDetailsIDs @@ -299,7 +275,6 @@ public List getVanAndServerColumnList(Integer groupID) throws private List> getDataToSync(String schemaName, String tableName, String columnNames) throws Exception { - logger.info("Fetching data to sync for schema: {}, table: {}, columns: {}", schemaName, tableName, columnNames); List> resultSetList = dataSyncRepository.getDataForGivenSchemaAndTable(schemaName, tableName, columnNames); if (resultSetList != null) { @@ -343,14 +318,11 @@ private List> getBatchOfAskedSizeDataToSync(List> dataToBesync, String user, String Authorization, String token) throws Exception { - logger.debug( - "Entering syncDataToServer with vanID: {}, schemaName: '{}', tableName: '{}', vanAutoIncColumnName: '{}', serverColumns: '{}', user: '{}'", - vanID, schemaName, tableName, vanAutoIncColumnName, serverColumns, user); + RestTemplate restTemplate = new RestTemplate(); Integer facilityID = masterVanRepo.getFacilityID(vanID); - logger.debug("Fetched facilityID for vanID {}: {}", vanID, facilityID); // serialize null GsonBuilder gsonBuilder = new GsonBuilder(); @@ -368,33 +340,18 @@ public String syncDataToServer(int vanID, String schemaName, String tableName, S dataMap.put("facilityID", facilityID); String requestOBJ = gson.toJson(dataMap); - - HttpEntity request = RestTemplateUtil.createRequestEntity(requestOBJ, Authorization,token); - logger.info("Before Data sync upload Url" + dataSyncUploadUrl); + HttpEntity request = RestTemplateUtil.createRequestEntity(requestOBJ, Authorization,"datasync"); ResponseEntity response = restTemplate.exchange(dataSyncUploadUrl, HttpMethod.POST, request, String.class); - logger.info("Received response from data sync URL: {}", response); - logger.info("Received response from data sync URL: {}", dataSyncUploadUrl); - - logger.info("After Data sync upload Url" + dataSyncUploadUrl); - /** - * if data successfully synced then getVanSerialNo of synced data to update - * processed flag - */ + int i = 0; if (response != null && response.hasBody()) { JSONObject obj = new JSONObject(response.getBody()); if (obj != null && obj.has("statusCode") && obj.getInt("statusCode") == 200) { StringBuilder vanSerialNos = getVanSerialNoListForSyncedData(vanAutoIncColumnName, dataToBesync); - logger.info( - "Updating processed flag for schemaName: {}, tableName: {}, vanSerialNos: {}, vanAutoIncColumnName: {}, user: {}", - schemaName, tableName, vanSerialNos.toString(), vanAutoIncColumnName, user); - // update table for processed flag = "P" - logger.info(schemaName + "|" + tableName + "|" + vanSerialNos.toString() + "|" + vanAutoIncColumnName - + "|" + user); + i = dataSyncRepository.updateProcessedFlagInVan(schemaName, tableName, vanSerialNos, vanAutoIncColumnName, user); - logger.debug("Updated processed flag in database. Records affected: {}", i); } } if (i > 0) @@ -435,4 +392,4 @@ public String getDataSyncGroupDetails() { return null; } -} +} \ No newline at end of file diff --git a/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/DataSyncRepositoryCentral.java b/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/DataSyncRepositoryCentral.java index bdba82d0..a5d8422d 100644 --- a/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/DataSyncRepositoryCentral.java +++ b/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/DataSyncRepositoryCentral.java @@ -21,19 +21,21 @@ */ package com.iemr.mmu.service.dataSyncLayerCentral; +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.sql.DataSource; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Service; -import javax.sql.DataSource; -import java.sql.Timestamp; -import java.sql.Statement; // Import Statement for batchUpdate result interpretation -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; +import com.iemr.mmu.data.syncActivity_syncLayer.SyncUploadDataDigester; @Service public class DataSyncRepositoryCentral { @@ -42,7 +44,6 @@ public class DataSyncRepositoryCentral { private JdbcTemplate jdbcTemplate; - // Lazily initialize jdbcTemplate to ensure DataSource is available private JdbcTemplate getJdbcTemplate() { if (this.jdbcTemplate == null) { this.jdbcTemplate = new JdbcTemplate(dataSource); @@ -50,161 +51,176 @@ private JdbcTemplate getJdbcTemplate() { return this.jdbcTemplate; } - private Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName()); + private final Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName()); + + private static final Set VALID_SCHEMAS = Set.of("public", "db_iemr", "db_identity","apl_db_iemr","apl_db_identity","db_iemr_sync","db_identity_sync"); + + private static final Set VALID_TABLES = Set.of( + "m_beneficiaryregidmapping", "i_beneficiaryaccount", "i_beneficiaryaddress", "i_beneficiarycontacts", + "i_beneficiarydetails", "i_beneficiaryfamilymapping", "i_beneficiaryidentity", "i_beneficiarymapping", + "t_benvisitdetail", "t_phy_anthropometry", "t_phy_vitals", "t_benadherence", "t_anccare", "t_pnccare", + "t_ncdscreening", "t_ncdcare", "i_ben_flow_outreach", "t_covid19", "t_idrsdetails", "t_physicalactivity", + "t_phy_generalexam", "t_phy_headtotoe", "t_sys_obstetric", "t_sys_gastrointestinal", "t_sys_cardiovascular", + "t_sys_respiratory", "t_sys_centralnervous", "t_sys_musculoskeletalsystem", "t_sys_genitourinarysystem", + "t_ancdiagnosis", "t_ncddiagnosis", "t_pncdiagnosis", "t_benchefcomplaint", "t_benclinicalobservation", + "t_prescription", "t_prescribeddrug", "t_lab_testorder", "t_benreferdetails", + "t_lab_testresult", "t_physicalstockentry", "t_patientissue", "t_facilityconsumption", "t_itemstockentry", + "t_itemstockexit", "t_benmedhistory", "t_femaleobstetrichistory", "t_benmenstrualdetails", + "t_benpersonalhabit", "t_childvaccinedetail1", "t_childvaccinedetail2", "t_childoptionalvaccinedetail", + "t_ancwomenvaccinedetail", "t_childfeedinghistory", "t_benallergyhistory", "t_bencomorbiditycondition", + "t_benmedicationhistory", "t_benfamilyhistory", "t_perinatalhistory", "t_developmenthistory", + "t_cancerfamilyhistory", "t_cancerpersonalhistory", "t_cancerdiethistory", "t_cancerobstetrichistory", + "t_cancervitals", "t_cancersignandsymptoms", "t_cancerlymphnode", "t_canceroralexamination", + "t_cancerbreastexamination", "t_cancerabdominalexamination", "t_cancergynecologicalexamination", + "t_cancerdiagnosis", "t_cancerimageannotation", "i_beneficiaryimage", "t_stockadjustment", + "t_stocktransfer", "t_patientreturn", "t_indent", "t_indentissue", "t_indentorder", "t_saitemmapping"); + + private boolean isValidDatabaseIdentifierCharacter(String identifier) { + return identifier != null && identifier.matches("^[a-zA-Z_][a-zA-Z0-9_]*$"); + } + + private boolean isValidSchemaName(String schemaName) { + return VALID_SCHEMAS.contains(schemaName.toLowerCase()); + } + + private boolean isValidTableName(String tableName) { + return VALID_TABLES.contains(tableName.toLowerCase()); + } + + private boolean isValidColumnNamesList(String columnNames) { + if (columnNames == null || columnNames.trim().isEmpty()) { + return false; + } + for (String col : columnNames.split(",")) { + if (!isValidDatabaseIdentifierCharacter(col.trim())) { + return false; + } + } + return true; + } - // Data Upload Repository public int checkRecordIsAlreadyPresentOrNot(String schemaName, String tableName, String vanSerialNo, String vanID, - String vanAutoIncColumnName, int syncFacilityID) { + String vanAutoIncColumnName, int syncFacilityID) { jdbcTemplate = getJdbcTemplate(); - List params = new ArrayList<>(); - StringBuilder queryBuilder = new StringBuilder("SELECT "); - queryBuilder.append(vanAutoIncColumnName); - queryBuilder.append(" FROM "); - queryBuilder.append(schemaName).append(".").append(tableName); + if (!isValidSchemaName(schemaName) || !isValidTableName(tableName) || + !isValidDatabaseIdentifierCharacter(vanAutoIncColumnName)) { + logger.error("Invalid identifiers: schema={}, table={}, column={}", schemaName, tableName, + vanAutoIncColumnName); + throw new IllegalArgumentException("Invalid identifiers provided."); + } + + StringBuilder queryBuilder = new StringBuilder("SELECT ") + .append(vanAutoIncColumnName).append(" FROM ") + .append(schemaName).append(".").append(tableName).append(" WHERE VanSerialNo = ?"); - StringBuilder whereClause = new StringBuilder(); - whereClause.append(" WHERE "); - whereClause.append("VanSerialNo = ?"); params.add(vanSerialNo); - if (Arrays.asList("t_patientissue", "t_physicalstockentry", "t_stockadjustment", "t_saitemmapping", + if (List.of("t_patientissue", "t_physicalstockentry", "t_stockadjustment", "t_saitemmapping", "t_stocktransfer", "t_patientreturn", "t_facilityconsumption", "t_indent", "t_indentorder", "t_indentissue", "t_itemstockentry", "t_itemstockexit") .contains(tableName.toLowerCase()) && syncFacilityID > 0) { - - whereClause.append(" AND "); - whereClause.append("SyncFacilityID = ?"); + queryBuilder.append(" AND SyncFacilityID = ?"); params.add(syncFacilityID); - } else { - whereClause.append(" AND "); - whereClause.append("VanID = ?"); + queryBuilder.append(" AND VanID = ?"); params.add(vanID); } - queryBuilder.append(whereClause); - String query = queryBuilder.toString(); - Object[] queryParams = params.toArray(); - - logger.debug("Checking record existence query: {} with params: {}", query, Arrays.toString(queryParams)); - System.out.println("Checking record existence query: " + query + " with params: " + Arrays.toString(queryParams)); - try { - List> resultSet = jdbcTemplate.queryForList(query, queryParams); - if (resultSet != null && !resultSet.isEmpty()) { - System.out.println("Record found for table " + tableName + ": VanSerialNo=" + vanSerialNo + ", VanID=" + vanID); - logger.debug("Record found for table {}: VanSerialNo={}, VanID={}", tableName, vanSerialNo, vanID); - return 1; - } else { - System.out.println("No record found for table " + tableName + ": VanSerialNo=" + vanSerialNo + ", VanID=" + vanID); - logger.debug("No record found for table {}: VanSerialNo={}, VanID={}", tableName, vanSerialNo, vanID); - return 0; - } - } catch (org.springframework.dao.EmptyResultDataAccessException e) { - System.out.println("No record found (EmptyResultDataAccessException) for table " + tableName + ": VanSerialNo=" + vanSerialNo + ", VanID=" + vanID); - logger.debug("No record found (EmptyResultDataAccessException) for table {}: VanSerialNo={}, VanID={}", tableName, vanSerialNo, vanID); - return 0; + List> resultSet = jdbcTemplate.queryForList(queryBuilder.toString(), params.toArray()); + return (resultSet != null && !resultSet.isEmpty()) ? 1 : 0; } catch (Exception e) { - System.out.println("Database error during checkRecordIsAlreadyPresentOrNot for table " + tableName + ": VanSerialNo=" + vanSerialNo + ", VanID=" + vanID); - logger.error("Database error during checkRecordIsAlreadyPresentOrNot for table {}: VanSerialNo={}, VanID={}. Error: {}", tableName, vanSerialNo, vanID, e.getMessage(), e); - throw new RuntimeException("Failed to check record existence: " + e.getMessage(), e); // Re-throw or handle as appropriate + logger.error("Error checking record presence: {}", e.getMessage(), e); + throw new RuntimeException("Failed to check record existence: " + e.getMessage(), e); } } - // Method for synchronization of data to central DB public int[] syncDataToCentralDB(String schema, String tableName, String serverColumns, String query, - List syncDataList) { + List syncDataList) { jdbcTemplate = getJdbcTemplate(); - logger.info("Executing batch operation for table: {}. Query type: {}. Number of records: {}", tableName, query.startsWith("INSERT") ? "INSERT" : "UPDATE", syncDataList.size()); - logger.debug("Query: {}", query); -System.out.println("Executing batch operation for table: " + tableName + ". Query type: " + (query.startsWith("INSERT") ? "INSERT" : "UPDATE") + ". Number of records: " + syncDataList.size()); try { - // Start batch insert/update - int[] i = jdbcTemplate.batchUpdate(query, syncDataList); - System.out.println("Batch operation completed for table " + tableName + ". Results: " + Arrays.toString(i)); - logger.info("Batch operation completed for table {}. Results: {}", tableName, Arrays.toString(i)); - return i; + + return jdbcTemplate.batchUpdate(query, syncDataList); } catch (Exception e) { - logger.error("Exception during batch update for table {}: {}", tableName, e.getMessage(), e); - System.out.println("Exception during batch update for table " + tableName + ": " + e.getMessage()); - // Log the error with detailed information - // Re-throw the exception to be handled by the service layer, so specific errors can be captured. - throw new RuntimeException("Batch sync failed for table " + tableName + ": " + e.getMessage(), e); + logger.error("Batch sync failed for table {}: {}", tableName, e.getMessage(), e); + throw new RuntimeException("Batch sync failed: " + e.getMessage(), e); } } - // End of Data Upload Repository - public List> getMasterDataFromTable(String schema, String table, String columnNames, - String masterType, Timestamp lastDownloadDate, Integer vanID, Integer psmID) throws Exception { + String masterType, Timestamp lastDownloadDate, Integer vanID, Integer psmID) { jdbcTemplate = getJdbcTemplate(); - List> resultSetList = new ArrayList<>(); - StringBuilder baseQueryBuilder = new StringBuilder(" SELECT ").append(columnNames).append(" FROM ").append(schema).append(".").append(table); List params = new ArrayList<>(); + if (!isValidSchemaName(schema) || !isValidTableName(table) || !isValidColumnNamesList(columnNames)) { + throw new IllegalArgumentException("Invalid schema, table, or column names."); + } + + StringBuilder queryBuilder = new StringBuilder("SELECT ").append(columnNames) + .append(" FROM ").append(schema).append(".").append(table); + if (masterType != null) { if (lastDownloadDate != null) { - baseQueryBuilder.append(" WHERE LastModDate >= ? "); + queryBuilder.append(" WHERE LastModDate >= ?"); params.add(lastDownloadDate); - if (masterType.equalsIgnoreCase("V")) { - baseQueryBuilder.append(" AND VanID = ? "); + if ("V".equalsIgnoreCase(masterType)) { + queryBuilder.append(" AND VanID = ?"); params.add(vanID); - } else if (masterType.equalsIgnoreCase("P")) { - baseQueryBuilder.append(" AND ProviderServiceMapID = ? "); + } else if ("P".equalsIgnoreCase(masterType)) { + queryBuilder.append(" AND ProviderServiceMapID = ?"); params.add(psmID); } } else { - if (masterType.equalsIgnoreCase("V")) { - baseQueryBuilder.append(" WHERE VanID = ? "); + queryBuilder.append(" WHERE "); + if ("V".equalsIgnoreCase(masterType)) { + queryBuilder.append("VanID = ?"); params.add(vanID); - } else if (masterType.equalsIgnoreCase("P")) { - baseQueryBuilder.append(" WHERE ProviderServiceMapID = ? "); + } else if ("P".equalsIgnoreCase(masterType)) { + queryBuilder.append("ProviderServiceMapID = ?"); params.add(psmID); } } } - String finalQuery = baseQueryBuilder.toString(); - logger.info("Select query central: {}", finalQuery); - logger.info("Last Downloaded Date: {}", lastDownloadDate); - logger.info("Query Params: {}", params); - System.out.println("Select query central: " + finalQuery); - System.out.println("Last Downloaded Date: " + lastDownloadDate); - System.out.println("Query Params: " + params); - try { - if (params.isEmpty()) { - resultSetList = jdbcTemplate.queryForList(finalQuery); - } else { - resultSetList = jdbcTemplate.queryForList(finalQuery, params.toArray()); - } + // Safe dynamic SQL: All dynamic parts (table names, columns, etc.) are + // validated or hardcoded. + // Parameter values are bound safely using prepared statement placeholders (?). + + return jdbcTemplate.queryForList(queryBuilder.toString(), params.toArray()); } catch (Exception e) { - System.out.println("Error fetching master data from table " + table + ": " + e.getMessage()); - logger.error("Error fetching master data from table {}: {}", table, e.getMessage(), e); + logger.error("Error fetching master data: {}", e.getMessage(), e); throw new RuntimeException("Failed to fetch master data: " + e.getMessage(), e); } -System.out.println("Result set Details size: " + resultSetList.size()); - logger.info("Result set Details size: {}", resultSetList.size()); - return resultSetList; } - public List> getBatchForBenDetails(String schema, String table, String columnNames, - String whereClause, int limit, int offset) { + public List> getBatchForBenDetails(SyncUploadDataDigester digester, + String whereClause, int limit, int offset) { jdbcTemplate = getJdbcTemplate(); - String query = "SELECT " + columnNames + " FROM " + schema + "." + table + whereClause + " LIMIT ? OFFSET ?"; - System.out.println("Fetching batch for beneficiary details. Query: " + query + ", Limit: " + limit + ", Offset: " + offset); - logger.debug("Fetching batch for beneficiary details. Query: {}, Limit: {}, Offset: {}", query, limit, offset); - try { - return jdbcTemplate.queryForList(query, limit, offset); - } catch (Exception e) { - logger.error("Error fetching batch for beneficiary details from table {}: {}", table, e.getMessage(), e); - System.out.println("Error fetching batch for beneficiary details from table " + table + ": " + e.getMessage()); - throw new RuntimeException("Failed to fetch batch data: " + e.getMessage(), e); - } - } - // End of Data Download Repository + String schema = digester.getSchemaName(); + String table = digester.getTableName(); + String columnNames = digester.getServerColumns(); + + if (!isValidSchemaName(schema) || !isValidTableName(table) || !isValidColumnNamesList(columnNames)) { + throw new IllegalArgumentException("Invalid schema, table, or column names."); + } + // Safe dynamic SQL: Schema, table, and column names are validated against + // predefined whitelists. + // Only trusted values are used in the query string. + // limit and offset are passed as parameters to prevent SQL injection. + String query = String.format("SELECT %s FROM %s.%s %s LIMIT ? OFFSET ?", columnNames, schema, table, + whereClause); // NOSONAR + + try { + + return jdbcTemplate.queryForList(query, limit, offset); + } catch (Exception e) { + logger.error("Error fetching batch details: {}", e.getMessage(), e); + throw new RuntimeException("Failed to fetch batch data: " + e.getMessage(), e); + } + } } \ No newline at end of file diff --git a/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java b/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java index 4a97725b..cd33c2b5 100644 --- a/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java +++ b/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java @@ -24,10 +24,10 @@ import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Arrays; +import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.HashMap; - +import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -37,7 +37,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.iemr.mmu.data.syncActivity_syncLayer.SyncUploadDataDigester; - @Service public class GetDataFromVanAndSyncToDBImpl implements GetDataFromVanAndSyncToDB { @@ -47,44 +46,57 @@ public class GetDataFromVanAndSyncToDBImpl implements GetDataFromVanAndSyncToDB @Autowired private DataSyncRepositoryCentral dataSyncRepositoryCentral; + private static final Map> TABLE_GROUPS = new HashMap<>(); static { - // Group 1: Master data or less frequently changing data - TABLE_GROUPS.put(1, Arrays.asList("m_beneficiaryregidmapping", "m_another_master_table")); - - // Group 2: Transactional data that might involve facility ID - TABLE_GROUPS.put(2, Arrays.asList("t_indent", "t_indentorder", "t_indentissue", "t_stocktransfer", "t_itemstockentry")); + TABLE_GROUPS.put(1, + Arrays.asList("m_beneficiaryregidmapping", "i_beneficiaryaccount", "i_beneficiaryaddress", + "i_beneficiarycontacts", "i_beneficiarydetails", "i_beneficiaryfamilymapping", + "i_beneficiaryidentity", "i_beneficiarymapping")); + + TABLE_GROUPS.put(2, + Arrays.asList("t_benvisitdetail", "t_phy_anthropometry", "t_phy_vitals", "t_benadherence", "t_anccare", + "t_pnccare", "t_ncdscreening", "t_ncdcare", "i_ben_flow_outreach", "t_covid19", "t_idrsdetails", + "t_physicalactivity")); + + TABLE_GROUPS.put(3, + Arrays.asList("t_phy_generalexam", "t_phy_headtotoe", "t_sys_obstetric", "t_sys_gastrointestinal", + "t_sys_cardiovascular", "t_sys_respiratory", "t_sys_centralnervous", + "t_sys_musculoskeletalsystem", "t_sys_genitourinarysystem")); + + TABLE_GROUPS.put(4, + Arrays.asList("t_ancdiagnosis", "t_ncddiagnosis", "t_pncdiagnosis", "t_benchefcomplaint", + "t_benclinicalobservation", "t_prescription", "t_prescribeddrug", "t_lab_testorder", + "t_benreferdetails")); + + TABLE_GROUPS.put(5, Arrays.asList("t_lab_testresult", "t_physicalstockentry", "t_patientissue", + "t_facilityconsumption", "t_itemstockentry", "t_itemstockexit")); + + TABLE_GROUPS.put(6, Arrays.asList("t_benmedhistory", "t_femaleobstetrichistory", "t_benmenstrualdetails", + "t_benpersonalhabit", "t_childvaccinedetail1", "t_childvaccinedetail2", "t_childoptionalvaccinedetail", + "t_ancwomenvaccinedetail", "t_childfeedinghistory", "t_benallergyhistory", "t_bencomorbiditycondition", + "t_benmedicationhistory", "t_benfamilyhistory", "t_perinatalhistory", "t_developmenthistory")); + + TABLE_GROUPS.put(7, + Arrays.asList("t_cancerfamilyhistory", "t_cancerpersonalhistory", "t_cancerdiethistory", + "t_cancerobstetrichistory", "t_cancervitals", "t_cancersignandsymptoms", "t_cancerlymphnode", + "t_canceroralexamination", "t_cancerbreastexamination", "t_cancerabdominalexamination", + "t_cancergynecologicalexamination", "t_cancerdiagnosis", "t_cancerimageannotation")); - // Group 3: High volume transactional data - TABLE_GROUPS.put(3, Arrays.asList("i_beneficiarydetails", "t_patientissue", "t_physicalstockentry", - "t_stockadjustment", "t_saitemmapping", "t_patientreturn", - "t_facilityconsumption", "t_itemstockexit")); - // Add more groups as needed, up to 9 - TABLE_GROUPS.put(1, Arrays.asList("m_beneficiaryregidmapping", "i_beneficiaryaccount","i_beneficiaryaddress","i_beneficiarycontacts","i_beneficiarydetails","i_beneficiaryfamilymapping","i_beneficiaryidentity","i_beneficiarymapping")); - - TABLE_GROUPS.put(2, Arrays.asList("t_benvisitdetail","t_phy_anthropometry","t_phy_vitals","t_benadherence","t_anccare","t_pnccare","t_ncdscreening","t_ncdcare","i_ben_flow_outreach","t_covid19","t_idrsdetails","t_physicalactivity")); - - TABLE_GROUPS.put(3, Arrays.asList("t_phy_generalexam","t_phy_headtotoe","t_sys_obstetric","t_sys_gastrointestinal","t_sys_cardiovascular","t_sys_respiratory","t_sys_centralnervous","t_sys_musculoskeletalsystem","t_sys_genitourinarysystem")); - - TABLE_GROUPS.put(4, Arrays.asList("t_ancdiagnosis","t_ncddiagnosis","t_pncdiagnosis","t_benchefcomplaint","t_benclinicalobservation","t_prescription","t_prescribeddrug","t_lab_testorder","t_benreferdetails")); - - TABLE_GROUPS.put(5, Arrays.asList("t_lab_testresult","t_physicalstockentry","t_patientissue","t_facilityconsumption","t_itemstockentry","t_itemstockexit")); + TABLE_GROUPS.put(8, Arrays.asList("i_beneficiaryimage")); - TABLE_GROUPS.put(6, Arrays.asList("t_benmedhistory","t_femaleobstetrichistory","t_benmenstrualdetails","t_benpersonalhabit","t_childvaccinedetail1","t_childvaccinedetail2","t_childoptionalvaccinedetail","t_ancwomenvaccinedetail","t_childfeedinghistory","t_benallergyhistory","t_bencomorbiditycondition","t_benmedicationhistory","t_benfamilyhistory","t_perinatalhistory","t_developmenthistory")); + TABLE_GROUPS.put(9, + Arrays.asList("t_itemstockentry", "t_itemstockexit", "t_patientissue", "t_physicalstockentry", + "t_stockadjustment", "t_stocktransfer", "t_patientreturn", "t_facilityconsumption", "t_indent", + "t_indentissue", "t_indentorder", "t_saitemmapping")); - TABLE_GROUPS.put(7, Arrays.asList("t_cancerfamilyhistory","t_cancerpersonalhistory","t_cancerdiethistory","t_cancerobstetrichistory","t_cancervitals","t_cancersignandsymptoms","t_cancerlymphnode","t_canceroralexamination","t_cancerbreastexamination","t_cancerabdominalexamination","t_cancergynecologicalexamination","t_cancerdiagnosis","t_cancerimageannotation")); + } - TABLE_GROUPS.put(8, Arrays.asList("i_beneficiaryimage")); - - TABLE_GROUPS.put(9, Arrays.asList("t_itemstockentry","t_itemstockexit","t_patientissue","t_physicalstockentry","t_stockadjustment","t_stocktransfer","t_patientreturn","t_facilityconsumption","t_indent","t_indentissue","t_indentorder","t_saitemmapping")); - - } + public String syncDataToServer(String requestOBJ, String Authorization) throws Exception { - public String syncDataToServer(String requestOBJ, String Authorization, String token) throws Exception { - logger.info("Starting syncDataToServer. Token: {}", token); ObjectMapper mapper = new ObjectMapper(); SyncUploadDataDigester syncUploadDataDigester = mapper.readValue(requestOBJ, SyncUploadDataDigester.class); - +List> dataToBesync = syncUploadDataDigester.getSyncData(); if (syncUploadDataDigester == null || syncUploadDataDigester.getTableName() == null) { logger.error("Invalid SyncUploadDataDigester object or tableName is null."); return "Error: Invalid sync request."; @@ -101,8 +113,7 @@ public String syncDataToServer(String requestOBJ, String Authorization, String t logger.error("Sync failed for m_beneficiaryregidmapping: {}", result); return "Sync failed for m_beneficiaryregidmapping."; } - } - if ("i_beneficiarydetails".equalsIgnoreCase(syncTableName)) { + } else if ("i_beneficiarydetails".equalsIgnoreCase(syncTableName)) { String result = update_I_BeneficiaryDetails_for_processed_in_batches(syncUploadDataDigester); if ("data sync passed".equals(result)) { return "Sync successful for i_beneficiarydetails."; @@ -111,28 +122,35 @@ public String syncDataToServer(String requestOBJ, String Authorization, String t return "Sync failed for i_beneficiarydetails."; } } else { - // Determine the group for the current table or iterate through all if no specific table is given + // Determine the group for the current table or iterate through all if no + // specific table is given boolean syncSuccess = true; String errorMessage = ""; - // If a specific table is provided in the request, try to find its group and sync only that table. + // If a specific table is provided in the request, try to find its group and + // sync only that table. // Otherwise, iterate through all defined groups. if (syncTableName != null && !syncTableName.isEmpty()) { boolean foundInGroup = false; - for (Map.Entry> entry : TABLE_GROUPS.entrySet()) { - if (entry.getValue().contains(syncTableName.toLowerCase())) { - logger.info("Attempting to sync table '{}' from Group {}", syncTableName, entry.getKey()); - syncSuccess = syncTablesInGroup(syncUploadDataDigester.getSchemaName(), syncTableName, syncUploadDataDigester); + + for (Map map : dataToBesync) { + // if (entry.getValue().contains(syncTableName.toLowerCase())) { + if(map.get("tableName") != null + && map.get("tableName").toString().equalsIgnoreCase(syncTableName)) { + syncSuccess = syncTablesInGroup(syncUploadDataDigester.getSchemaName(), syncTableName, + syncUploadDataDigester); foundInGroup = true; break; } } if (!foundInGroup) { - logger.warn("Table '{}' not found in any predefined groups. Proceeding with generic sync logic.", syncTableName); + logger.warn("Table '{}' not found in any predefined groups. Proceeding with generic sync logic.", + syncTableName); syncSuccess = performGenericTableSync(syncUploadDataDigester); } } else { - // If no specific table is in the request (e.g., a general sync trigger), iterate through groups + // If no specific table is in the request (e.g., a general sync trigger), + // iterate through groups logger.info("No specific table provided. Attempting to sync all tables group by group."); for (Map.Entry> entry : TABLE_GROUPS.entrySet()) { Integer groupId = entry.getKey(); @@ -142,26 +160,34 @@ public String syncDataToServer(String requestOBJ, String Authorization, String t try { // Create a new digester for each table within the group, // or adapt if the original digester contains data for multiple tables. - // For simplicity, assuming syncDataDigester needs to be tailored per table or group. - // If your requestOBJ contains data for only one table at a time, this loop might need adjustment + // For simplicity, assuming syncDataDigester needs to be tailored per table or + // group. + // If your requestOBJ contains data for only one table at a time, this loop + // might need adjustment // to fetch data for each table in the group. // For now, it will use the syncData from the original requestOBJ, which implies // the original requestOBJ should represent data for a single table. - // A more robust solution would involve fetching data for each table dynamically. - boolean currentTableSyncResult = syncTablesInGroup(syncUploadDataDigester.getSchemaName(), table, syncUploadDataDigester); + // A more robust solution would involve fetching data for each table + // dynamically. + boolean currentTableSyncResult = syncTablesInGroup(syncUploadDataDigester.getSchemaName(), + table, syncUploadDataDigester); if (!currentTableSyncResult) { syncSuccess = false; errorMessage += "Failed to sync table: " + table + " in Group " + groupId + ". "; - logger.error("Sync failed for table '{}' in Group {}. Error: {}", table, groupId, errorMessage); - // Optionally, you can choose to break here or continue to sync other tables in the group/next group + logger.error("Sync failed for table '{}' in Group {}. Error: {}", table, groupId, + errorMessage); + // Optionally, you can choose to break here or continue to sync other tables in + // the group/next group // For now, let's continue to attempt other tables within the group. } else { logger.info("Successfully synced table: {} in Group {}", table, groupId); } } catch (Exception e) { syncSuccess = false; - errorMessage += "Exception during sync for table: " + table + " in Group " + groupId + ": " + e.getMessage() + ". "; - logger.error("Exception during sync for table '{}' in Group {}: {}", table, groupId, e.getMessage(), e); + errorMessage += "Exception during sync for table: " + table + " in Group " + groupId + ": " + + e.getMessage() + ". "; + logger.error("Exception during sync for table '{}' in Group {}: {}", table, groupId, + e.getMessage(), e); // Continue to attempt other tables } } @@ -182,35 +208,35 @@ public String syncDataToServer(String requestOBJ, String Authorization, String t * with relevant data for the `currentTableName` before calling this. * In a real-world scenario, you might fetch data for each table here. */ - private boolean syncTablesInGroup(String schemaName, String currentTableName, SyncUploadDataDigester originalDigester) { + private boolean syncTablesInGroup(String schemaName, String currentTableName, + SyncUploadDataDigester originalDigester) { logger.info("Attempting generic sync for table: {}", currentTableName); // This is a simplification. In a production system, you would likely need // to retrieve the actual data for 'currentTableName' from the local DB // based on the group sync approach. For this example, we'll assume the // originalDigester's syncData is relevant or needs to be re-populated. - // Create a new digester instance or modify the existing one for the current table + // Create a new digester instance or modify the existing one for the current + // table SyncUploadDataDigester tableSpecificDigester = new SyncUploadDataDigester(); tableSpecificDigester.setSchemaName(schemaName); tableSpecificDigester.setTableName(currentTableName); tableSpecificDigester.setSyncedBy(originalDigester.getSyncedBy()); tableSpecificDigester.setFacilityID(originalDigester.getFacilityID()); tableSpecificDigester.setVanAutoIncColumnName(originalDigester.getVanAutoIncColumnName()); - tableSpecificDigester.setServerColumns(originalDigester.getServerColumns()); // Assuming serverColumns is generic or set per table + tableSpecificDigester.setServerColumns(originalDigester.getServerColumns()); // Assuming serverColumns is + // generic or set per table // !!! IMPORTANT: You'll need to fetch the data for 'currentTableName' from your local DB here. // The `originalDigester.getSyncData()` might not be correct for all tables in a group. // For demonstration, I'm just using the original digester's data, which is likely incorrect - // if you're syncing multiple tables from a single request. - // You'll need a method like: dataSyncRepositoryLocal.getDataForTable(currentTableName, ...) - tableSpecificDigester.setSyncData(originalDigester.getSyncData()); // Placeholder: Replace with actual data fetching - + tableSpecificDigester.setSyncData(originalDigester.getSyncData()); return performGenericTableSync(tableSpecificDigester); } - - private String update_M_BeneficiaryRegIdMapping_for_provisioned_benID(SyncUploadDataDigester syncUploadDataDigester) { - logger.info("Processing update_M_BeneficiaryRegIdMapping_for_provisioned_benID for table: {}", syncUploadDataDigester.getTableName()); + private String update_M_BeneficiaryRegIdMapping_for_provisioned_benID( + SyncUploadDataDigester syncUploadDataDigester) { + List> dataToBesync = syncUploadDataDigester.getSyncData(); List syncData = new ArrayList<>(); @@ -226,20 +252,24 @@ private String update_M_BeneficiaryRegIdMapping_for_provisioned_benID(SyncUpload objArr[3] = String.valueOf(map.get("VanID")); syncData.add(objArr); } else { - logger.warn("Skipping record in m_beneficiaryregidmapping due to missing BenRegId, BeneficiaryID, or VanID: {}", map); + logger.warn( + "Skipping record in m_beneficiaryregidmapping due to missing BenRegId, BeneficiaryID, or VanID: {}", + map); } } if (!syncData.isEmpty()) { try { int[] i = dataSyncRepositoryCentral.syncDataToCentralDB(syncUploadDataDigester.getSchemaName(), - syncUploadDataDigester.getTableName(), SERVER_COLUMNS_NOT_REQUIRED, query, syncData); + syncUploadDataDigester.getTableName(), syncUploadDataDigester.getServerColumns(), query, syncData); if (i.length == syncData.size()) { logger.info("Successfully updated {} records for m_beneficiaryregidmapping.", i.length); return "data sync passed"; } else { - logger.error("Partial update for m_beneficiaryregidmapping. Expected {} updates, got {}. Failed records: {}", syncData.size(), i.length, getFailedRecords(i, syncData)); + logger.error( + "Partial update for m_beneficiaryregidmapping. Expected {} updates, got {}. Failed records: {}", + syncData.size(), i.length, getFailedRecords(i, syncData)); return "Partial data sync for m_beneficiaryregidmapping."; } } catch (Exception e) { @@ -263,48 +293,47 @@ private String getqueryFor_M_BeneficiaryRegIdMapping(String schemaName, String t queryBuilder.append(" BeneficiaryID = ? "); queryBuilder.append(" AND "); queryBuilder.append(" VanID = ? "); + return queryBuilder.toString(); } public String update_I_BeneficiaryDetails_for_processed_in_batches(SyncUploadDataDigester syncUploadDataDigester) { - logger.info("Processing update_I_BeneficiaryDetails_for_processed_in_batches for table: {}", syncUploadDataDigester.getTableName()); - List syncData = new ArrayList<>(); + List syncData = new ArrayList<>(); - String query = getQueryFor_I_BeneficiaryDetails(syncUploadDataDigester.getSchemaName(), - syncUploadDataDigester.getTableName()); + String query = getQueryFor_I_BeneficiaryDetails(syncUploadDataDigester.getSchemaName(), + syncUploadDataDigester.getTableName()); - int limit = 1000; - int offset = 0; - int totalProcessed = 0; + int limit = 1000; + int offset = 0; + int totalProcessed = 0; - String problematicWhereClause = " WHERE Processed <> 'P' AND VanID IS NOT NULL "; // Define it explicitly + String problematicWhereClause = " WHERE Processed <> 'P' AND VanID IS NOT NULL "; // Define it explicitly while (true) { List> batch; try { - logger.info("DEBUG: Passing whereClause to getBatchForBenDetails: [{}]", problematicWhereClause); - - batch = dataSyncRepositoryCentral.getBatchForBenDetails( - syncUploadDataDigester.getSchemaName(), - syncUploadDataDigester.getTableName(), - syncUploadDataDigester.getServerColumns(), - problematicWhereClause, // Use the variable - limit, - offset); - } catch (Exception e) { - logger.error("Error fetching batch for i_beneficiarydetails: {}", e.getMessage(), e); - return "Error fetching data for i_beneficiarydetails: " + e.getMessage(); - } - - if (totalProcessed > 0 || syncData.isEmpty()) { // syncData.isEmpty() means no records to process, still a "success" - logger.info("Finished processing i_beneficiarydetails. Total records processed: {}", totalProcessed); - return "data sync passed"; - } else { - logger.error("No records were processed for i_beneficiarydetails or an unknown error occurred."); - return "No data processed or sync failed for i_beneficiarydetails."; + + batch = dataSyncRepositoryCentral.getBatchForBenDetails( + syncUploadDataDigester, + problematicWhereClause, + limit, + offset); + } catch (Exception e) { + logger.error("Error fetching batch for i_beneficiarydetails: {}", e.getMessage(), e); + return "Error fetching data for i_beneficiarydetails: " + e.getMessage(); + } + + if (totalProcessed > 0 || syncData.isEmpty()) { // syncData.isEmpty() means no records to process, still a + // "success" + logger.info("Finished processing i_beneficiarydetails. Total records processed: {}", totalProcessed); + return "data sync passed"; + } else { + logger.error("No records were processed for i_beneficiarydetails or an unknown error occurred."); + return "No data processed or sync failed for i_beneficiarydetails."; + } } } - } + private String getQueryFor_I_BeneficiaryDetails(String schemaName, String tableName) { StringBuilder queryBuilder = new StringBuilder(" UPDATE "); queryBuilder.append(schemaName).append(".").append(tableName); @@ -317,12 +346,11 @@ private String getQueryFor_I_BeneficiaryDetails(String schemaName, String tableN return queryBuilder.toString(); } - /** - * Handles the generic synchronization logic for tables not covered by specific handlers. + * Handles the generic synchronization logic for tables not covered by specific + * handlers. */ private boolean performGenericTableSync(SyncUploadDataDigester syncUploadDataDigester) { - logger.info("Performing generic sync for table: {}", syncUploadDataDigester.getTableName()); List> dataToBesync = syncUploadDataDigester.getSyncData(); List syncDataListInsert = new ArrayList<>(); List syncDataListUpdate = new ArrayList<>(); @@ -342,10 +370,16 @@ private boolean performGenericTableSync(SyncUploadDataDigester syncUploadDataDig String vanID = String.valueOf(map.get("VanID")); int syncFacilityID = 0; - // Update SyncedBy and SyncedDate in the map itself before processing + // Update SyncedBy and SyncedDate in the xmap itself before processing map.put("SyncedBy", syncUploadDataDigester.getSyncedBy()); map.put("SyncedDate", String.valueOf(LocalDateTime.now())); // Ensure column name matches DB - + if (map.get("CreatedDate") == null || map.get("created_date") == null) { + logger.info("CreatedDate was null for table: " + syncTableName + ", inserting current time"); + if(map.get("CreatedDate") == null) + map.put("CreatedDate", String.valueOf(LocalDateTime.now())); + if(map.get("created_date") == null) + map.put("created_date", String.valueOf(LocalDateTime.now())); + } // Facility ID processing if (facilityIDFromDigester != null) { // Determine the 'Processed' status based on facility ID for specific tables @@ -370,7 +404,8 @@ private boolean performGenericTableSync(SyncUploadDataDigester syncUploadDataDig break; } case "t_stocktransfer": { - if (map.containsKey("TransferToFacilityID") && map.get("TransferToFacilityID") instanceof Double) { + if (map.containsKey("TransferToFacilityID") + && map.get("TransferToFacilityID") instanceof Double) { Double transferToFacilityID = (Double) map.get("TransferToFacilityID"); if (transferToFacilityID.intValue() == facilityIDFromDigester) { map.put("Processed", "P"); @@ -388,7 +423,8 @@ private boolean performGenericTableSync(SyncUploadDataDigester syncUploadDataDig break; } default: - // No specific facility ID logic for other tables, maintain existing 'Processed' status or default + // No specific facility ID logic for other tables, maintain existing 'Processed' + // status or default break; } } @@ -400,13 +436,13 @@ private boolean performGenericTableSync(SyncUploadDataDigester syncUploadDataDig syncFacilityID = ((Double) map.get("SyncFacilityID")).intValue(); } - int recordCheck; try { recordCheck = dataSyncRepositoryCentral.checkRecordIsAlreadyPresentOrNot( schemaName, syncTableName, vanSerialNo, vanID, vanAutoIncColumnName, syncFacilityID); } catch (Exception e) { - logger.error("Error checking record existence for table {}: VanSerialNo={}, VanID={}. Error: {}", syncTableName, vanSerialNo, vanID, e.getMessage(), e); + logger.error("Error checking record existence for table {}: VanSerialNo={}, VanID={}. Error: {}", + syncTableName, vanSerialNo, vanID, e.getMessage(), e); return false; // Critical error, stop sync for this table } @@ -417,7 +453,8 @@ private boolean performGenericTableSync(SyncUploadDataDigester syncUploadDataDig for (String column : serverColumnsList) { Object value = map.get(column.trim()); - // Handle boolean conversion if necessary, though String.valueOf should generally work for prepared statements + // Handle boolean conversion if necessary, though String.valueOf should + // generally work for prepared statements if (value instanceof Boolean) { currentRecordValues.add(value); } else if (value != null) { @@ -453,11 +490,15 @@ private boolean performGenericTableSync(SyncUploadDataDigester syncUploadDataDig if (!syncDataListInsert.isEmpty()) { String queryInsert = getQueryToInsertDataToServerDB(schemaName, syncTableName, syncUploadDataDigester.getServerColumns()); + try { - int[] i = dataSyncRepositoryCentral.syncDataToCentralDB(schemaName, syncTableName, syncUploadDataDigester.getServerColumns(), queryInsert, syncDataListInsert); + int[] i = dataSyncRepositoryCentral.syncDataToCentralDB(schemaName, syncTableName, + syncUploadDataDigester.getServerColumns(), queryInsert, syncDataListInsert); if (i.length != syncDataListInsert.size()) { insertSuccess = false; - logger.error("Partial insert for table {}. Expected {} inserts, got {}. Failed records: {}", syncTableName, syncDataListInsert.size(), i.length, getFailedRecords(i, syncDataListInsert)); + logger.error("Partial insert for table {}. Expected {} inserts, got {}. Failed records: {}", + syncTableName, syncDataListInsert.size(), i.length, + getFailedRecords(i, syncDataListInsert)); } else { logger.info("Successfully inserted {} records into table {}.", i.length, syncTableName); } @@ -469,11 +510,15 @@ private boolean performGenericTableSync(SyncUploadDataDigester syncUploadDataDig if (!syncDataListUpdate.isEmpty()) { String queryUpdate = getQueryToUpdateDataToServerDB(schemaName, syncUploadDataDigester.getServerColumns(), syncTableName); + // Ensure the update query is correct and matches the expected format try { - int[] j = dataSyncRepositoryCentral.syncDataToCentralDB(schemaName, syncTableName, SERVER_COLUMNS_NOT_REQUIRED, queryUpdate, syncDataListUpdate); + int[] j = dataSyncRepositoryCentral.syncDataToCentralDB(schemaName, syncTableName, + SERVER_COLUMNS_NOT_REQUIRED, queryUpdate, syncDataListUpdate); if (j.length != syncDataListUpdate.size()) { updateSuccess = false; - logger.error("Partial update for table {}. Expected {} updates, got {}. Failed records: {}", syncTableName, syncDataListUpdate.size(), j.length, getFailedRecords(j, syncDataListUpdate)); + logger.error("Partial update for table {}. Expected {} updates, got {}. Failed records: {}", + syncTableName, syncDataListUpdate.size(), j.length, + getFailedRecords(j, syncDataListUpdate)); } else { logger.info("Successfully updated {} records in table {}.", j.length, syncTableName); } @@ -518,16 +563,24 @@ public String getQueryToUpdateDataToServerDB(String schemaName, String serverCol StringBuilder preparedStatementSetter = new StringBuilder(); - if (columnsArr != null && columnsArr.length > 0) { + if (columnsArr != null && columnsArr.length > 0) { for (int i = 0; i < columnsArr.length; i++) { - preparedStatementSetter.append(columnsArr[i].trim()); - preparedStatementSetter.append(" = ?"); + String columnName = columnsArr[i].trim(); // ← NEW LINE + + // Special handling for CreatedDate - use COALESCE to prevent NULL + if (columnName.equalsIgnoreCase("CreatedDate")) { // ← NEW BLOCK + preparedStatementSetter.append(columnName); + preparedStatementSetter.append(" = COALESCE(?, CURRENT_TIMESTAMP)"); + } else { + preparedStatementSetter.append(columnName); + preparedStatementSetter.append(" = ?"); + } + if (i < columnsArr.length - 1) { preparedStatementSetter.append(", "); } } } - StringBuilder queryBuilder = new StringBuilder(" UPDATE "); queryBuilder.append(schemaName).append(".").append(tableName); queryBuilder.append(" SET "); @@ -549,18 +602,21 @@ public String getQueryToUpdateDataToServerDB(String schemaName, String serverCol private String getFailedRecords(int[] results, List data) { List failedRecordsInfo = new ArrayList<>(); for (int k = 0; k < results.length; k++) { - // In Spring JDBC batchUpdate, a value of Statement.EXECUTE_FAILED or Statement.SUCCESS_NO_INFO + // In Spring JDBC batchUpdate, a value of Statement.EXECUTE_FAILED or + // Statement.SUCCESS_NO_INFO // usually indicates a failure or success without specific row count. // A common return value for success is 1 (for one row updated/inserted). if (results[k] < 1) { // Assuming 1 means success, and anything else (0, -2, etc.) means failure // Attempt to get some identifiable info from the failed record if (data.get(k).length > 0) { - failedRecordsInfo.add("Record at index " + k + " (VanSerialNo/ID: " + data.get(k)[data.get(k).length - 2] + ")"); + failedRecordsInfo.add( + "Record at index " + k + " (VanSerialNo/ID: " + data.get(k)[data.get(k).length - 2] + ")"); } else { failedRecordsInfo.add("Record at index " + k + " (No identifiable info)"); } } } + logger.info("Failed records info: {}", failedRecordsInfo); return String.join("; ", failedRecordsInfo); } } \ No newline at end of file diff --git a/src/main/java/com/iemr/mmu/utils/JwtUserIdValidationFilter.java b/src/main/java/com/iemr/mmu/utils/JwtUserIdValidationFilter.java index 1dba0e78..fbeab7ad 100644 --- a/src/main/java/com/iemr/mmu/utils/JwtUserIdValidationFilter.java +++ b/src/main/java/com/iemr/mmu/utils/JwtUserIdValidationFilter.java @@ -38,13 +38,10 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo String origin = request.getHeader("Origin"); - logger.debug("Incoming Origin: {}", origin); - logger.debug("Allowed Origins Configured: {}", allowedOrigins); - if (origin != null && isOriginAllowed(origin)) { response.setHeader("Access-Control-Allow-Origin", origin); response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS"); - response.setHeader("Access-Control-Allow-Headers", "Authorization, Content-Type, Accept, Jwttoken"); + response.setHeader("Access-Control-Allow-Headers", "Authorization, Content-Type, Accept, Jwttoken,serverAuthorization, ServerAuthorization, serverauthorization, Serverauthorization"); response.setHeader("Vary", "Origin"); response.setHeader("Access-Control-Allow-Credentials", "true"); } else { @@ -59,7 +56,6 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo String path = request.getRequestURI(); String contextPath = request.getContextPath(); - logger.info("JwtUserIdValidationFilter invoked for path: " + path); // Log cookies for debugging Cookie[] cookies = request.getCookies(); @@ -76,7 +72,6 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo // Log headers for debugging String jwtTokenFromHeader = request.getHeader("Jwttoken"); - logger.info("JWT token from header: "); // Skip login and public endpoints if (path.equals(contextPath + "/user/userAuthenticate") @@ -104,7 +99,6 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo return; } } else if (jwtFromHeader != null) { - logger.info("Validating JWT token from header"); if (jwtAuthenticationUtil.validateUserIdAndJwtToken(jwtFromHeader)) { AuthorizationHeaderRequestWrapper authorizationHeaderRequestWrapper = new AuthorizationHeaderRequestWrapper( request, ""); @@ -113,7 +107,6 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo } } else { String userAgent = request.getHeader("User-Agent"); - logger.info("User-Agent: " + userAgent); if (userAgent != null && isMobileClient(userAgent) && authHeader != null) { try { UserAgentContext.setUserAgent(userAgent); @@ -123,6 +116,7 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo } return; } + } logger.warn("No valid authentication token found"); @@ -156,7 +150,8 @@ private boolean isMobileClient(String userAgent) { if (userAgent == null) return false; userAgent = userAgent.toLowerCase(); - return userAgent.contains("okhttp"); // iOS (custom clients) + logger.info("User-Agent: " + userAgent); + return userAgent.contains("okhttp") || userAgent.contains("java/"); // iOS (custom clients) } private String getJwtTokenFromCookies(HttpServletRequest request) { @@ -179,4 +174,4 @@ private void clearUserIdCookie(HttpServletResponse response) { cookie.setMaxAge(0); // Invalidate the cookie response.addCookie(cookie); } -} +} \ No newline at end of file diff --git a/src/main/java/com/iemr/mmu/utils/RestTemplateUtil.java b/src/main/java/com/iemr/mmu/utils/RestTemplateUtil.java index d1ea0efd..33556d22 100644 --- a/src/main/java/com/iemr/mmu/utils/RestTemplateUtil.java +++ b/src/main/java/com/iemr/mmu/utils/RestTemplateUtil.java @@ -39,11 +39,16 @@ public static HttpEntity createRequestEntity(Object body, String authori MultiValueMap headers = new LinkedMultiValueMap<>(); headers.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE + ";charset=utf-8"); - - if (authorization != null && !authorization.isEmpty()) { +logger.info("token: {}", jwtToken); + if (authorization != null && !authorization.isEmpty() && !jwtToken.equalsIgnoreCase("datasync")) { headers.add(HttpHeaders.AUTHORIZATION, "Bearer " + authorization); } + if(authorization != null && !authorization.isEmpty() && jwtToken.equalsIgnoreCase("datasync")) + { + headers.add(HttpHeaders.AUTHORIZATION, authorization); + } + if (jwtToken == null || jwtToken.isEmpty()) { ServletRequestAttributes attrs = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); @@ -55,14 +60,11 @@ public static HttpEntity createRequestEntity(Object body, String authori logger.error("Error while getting JWT token from cookie: {}", e.getMessage()); } } - } + } - - if (jwtToken != null && !jwtToken.isEmpty()) { + if (jwtToken != null && !jwtToken.isEmpty() && !jwtToken.equalsIgnoreCase("datasync")) { headers.add(HttpHeaders.COOKIE, "Jwttoken=" + jwtToken); } - - return new HttpEntity<>(body, headers); } } \ No newline at end of file From 2828fe6b68035e4f0b7c1a9937312cc622cc91f5 Mon Sep 17 00:00:00 2001 From: Vanitha S <116701245+vanitha1822@users.noreply.github.com> Date: Mon, 11 Aug 2025 09:54:47 +0530 Subject: [PATCH 18/47] fix: remove the token for server authorization (#111) --- .../service/dataSyncActivity/DownloadDataFromServerImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/iemr/mmu/service/dataSyncActivity/DownloadDataFromServerImpl.java b/src/main/java/com/iemr/mmu/service/dataSyncActivity/DownloadDataFromServerImpl.java index 252c9ce7..afb42a4b 100644 --- a/src/main/java/com/iemr/mmu/service/dataSyncActivity/DownloadDataFromServerImpl.java +++ b/src/main/java/com/iemr/mmu/service/dataSyncActivity/DownloadDataFromServerImpl.java @@ -186,7 +186,7 @@ private int downloadDataFromServer(SyncDownloadMaster syncDownloadMaster,String // initializing RestTemplate RestTemplate restTemplate = new RestTemplate(); // Provide the required second argument, e.g., an empty string or appropriate authorization token - HttpEntity request = RestTemplateUtil.createRequestEntity(syncDownloadMaster, ServerAuthorization, jwtToken); + HttpEntity request = RestTemplateUtil.createRequestEntity(syncDownloadMaster, ServerAuthorization, "datasync"); // Call rest-template to call API to download master data for given table ResponseEntity response = restTemplate.exchange(dataSyncDownloadUrl, HttpMethod.POST, request, String.class); From 604bd641da7f80d28bab6a9b7b167aab36ed3753 Mon Sep 17 00:00:00 2001 From: Vanitha S <116701245+vanitha1822@users.noreply.github.com> Date: Thu, 14 Aug 2025 10:42:43 +0530 Subject: [PATCH 19/47] Fix the datasync Demographics Issue (#112) * fix: remove condition for i_beneficiarydetails * fix: add logs * fix: add logs * fix: remove db_iemr * fix: add log for show column names too * fix: add date-format condition * fix: change valid column name * fix: change valid column name * fix: change valid column name * fix: change valid column name * fix: update insert query * fix: update cleaned column list * fix: date conversion * fix: conversion date-time * fix: add date conversion * fix: logs added * fix: new logger * fix: revert the date condition * fix: revert insert code * fix: revert insert code * fix: date format issue * fix: logs add * fix: log for group and group lsit * fix: clean the code --------- Co-authored-by: vishwab1 --- .../location/DistrictBlockMasterRepo.java | 2 +- .../dataSyncActivity/DataSyncRepository.java | 21 +- .../UploadDataToServerImpl.java | 17 +- .../DataSyncRepositoryCentral.java | 28 +- .../GetDataFromVanAndSyncToDBImpl.java | 454 ++++++++---------- 5 files changed, 242 insertions(+), 280 deletions(-) diff --git a/src/main/java/com/iemr/mmu/repo/location/DistrictBlockMasterRepo.java b/src/main/java/com/iemr/mmu/repo/location/DistrictBlockMasterRepo.java index db6a9d40..97452c65 100644 --- a/src/main/java/com/iemr/mmu/repo/location/DistrictBlockMasterRepo.java +++ b/src/main/java/com/iemr/mmu/repo/location/DistrictBlockMasterRepo.java @@ -36,7 +36,7 @@ public interface DistrictBlockMasterRepo extends CrudRepository getDistrictBlockMaster(@Param("districtID") Integer districtID); - @Query(value = " SELECT distinct StateID, StateName,WorkingDistrictID,WorkingDistrictName,blockid,blockname,villageid,villagename FROM db_iemr.v_userservicerolemapping WHERE UserID = :userId and UserServciceRoleDeleted is false",nativeQuery = true) + @Query(value = " SELECT distinct StateID, StateName,WorkingDistrictID,WorkingDistrictName,blockid,blockname,villageid,villagename FROM v_userservicerolemapping WHERE UserID = :userId and UserServciceRoleDeleted is false",nativeQuery = true) public List getUserservicerolemapping(@Param("userId") Integer userId); } diff --git a/src/main/java/com/iemr/mmu/service/dataSyncActivity/DataSyncRepository.java b/src/main/java/com/iemr/mmu/service/dataSyncActivity/DataSyncRepository.java index 9b020a4e..f7a55d4a 100644 --- a/src/main/java/com/iemr/mmu/service/dataSyncActivity/DataSyncRepository.java +++ b/src/main/java/com/iemr/mmu/service/dataSyncActivity/DataSyncRepository.java @@ -88,7 +88,12 @@ public List> getDataForGivenSchemaAndTable(String schema, St } } - + + logger.info("Select Query started:"); + logger.info("Table Name: {}", table); + + logger.info("Select Query: {}", baseQuery); + resultSetList = jdbcTemplate.queryForList(baseQuery); return resultSetList; } @@ -98,14 +103,16 @@ public int updateProcessedFlagInVan(String schemaName, String tableName, StringB jdbcTemplate = getJdbcTemplate(); String query = ""; + logger.info("Updating processed flag in table: " + tableName + " for vanSerialNos: " + vanSerialNos); + if (tableName != null && tableName.toLowerCase().equals("i_ben_flow_outreach")) { - query = "UPDATE " + schemaName + "." + tableName - + " SET created_date = ? , processed = 'P', SyncedDate = ?, Syncedby = ? " - + "WHERE " + autoIncreamentColumn + " IN (" + vanSerialNos + ")"; + query = "UPDATE " + schemaName + "." + tableName + + " SET created_date = ? , processed = 'P', SyncedDate = ?, Syncedby = ? " + + "WHERE " + autoIncreamentColumn + " IN (" + vanSerialNos + ")"; } else { - query = "UPDATE " + schemaName + "." + tableName - + " SET CreatedDate = ? , processed = 'P', SyncedDate = ?, Syncedby = ? " - + "WHERE " + autoIncreamentColumn + " IN (" + vanSerialNos + ")"; + query = "UPDATE " + schemaName + "." + tableName + + " SET CreatedDate = ? , processed = 'P', SyncedDate = ?, Syncedby = ? " + + "WHERE " + autoIncreamentColumn + " IN (" + vanSerialNos + ")"; } Timestamp syncedDate = new Timestamp(System.currentTimeMillis()); diff --git a/src/main/java/com/iemr/mmu/service/dataSyncActivity/UploadDataToServerImpl.java b/src/main/java/com/iemr/mmu/service/dataSyncActivity/UploadDataToServerImpl.java index 2c24dc2c..51d8a32b 100644 --- a/src/main/java/com/iemr/mmu/service/dataSyncActivity/UploadDataToServerImpl.java +++ b/src/main/java/com/iemr/mmu/service/dataSyncActivity/UploadDataToServerImpl.java @@ -115,7 +115,7 @@ public String getDataToSyncToServer(int vanID, String user, String Authorization public String syncIntercepter(int vanID, String user, String Authorization, String token) throws Exception { // sync activity trigger - + String serverAcknowledgement = startDataSync(vanID, user, Authorization, token); return serverAcknowledgement; @@ -226,7 +226,7 @@ private String startDataSync(int vanID, String user, String Authorization, Strin Map response = new HashMap<>(); response.put("response", "Data sync failed"); response.put("groupsProgress", responseStatus); - objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(response); + objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(response); return objectMapper.writerWithDefaultPrettyPrinter() .writeValueAsString(Collections.singletonMap("data", response)); } else { @@ -275,6 +275,7 @@ public List getVanAndServerColumnList(Integer groupID) throws private List> getDataToSync(String schemaName, String tableName, String columnNames) throws Exception { + logger.info("Fetching data to sync for schema: {}, table: {}, columns: {}", schemaName, tableName, columnNames); List> resultSetList = dataSyncRepository.getDataForGivenSchemaAndTable(schemaName, tableName, columnNames); if (resultSetList != null) { @@ -316,11 +317,11 @@ private List> getBatchOfAskedSizeDataToSync(List> dataToBesync, String user, String Authorization, String token) + String serverColumns, List> dataToBesync, String user, String Authorization, + String token) throws Exception { - + RestTemplate restTemplate = new RestTemplate(); - Integer facilityID = masterVanRepo.getFacilityID(vanID); @@ -340,10 +341,10 @@ public String syncDataToServer(int vanID, String schemaName, String tableName, S dataMap.put("facilityID", facilityID); String requestOBJ = gson.toJson(dataMap); - HttpEntity request = RestTemplateUtil.createRequestEntity(requestOBJ, Authorization,"datasync"); + HttpEntity request = RestTemplateUtil.createRequestEntity(requestOBJ, Authorization, "datasync"); ResponseEntity response = restTemplate.exchange(dataSyncUploadUrl, HttpMethod.POST, request, String.class); - + int i = 0; if (response != null && response.hasBody()) { JSONObject obj = new JSONObject(response.getBody()); @@ -392,4 +393,4 @@ public String getDataSyncGroupDetails() { return null; } -} \ No newline at end of file +} diff --git a/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/DataSyncRepositoryCentral.java b/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/DataSyncRepositoryCentral.java index a5d8422d..6dba4611 100644 --- a/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/DataSyncRepositoryCentral.java +++ b/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/DataSyncRepositoryCentral.java @@ -88,19 +88,33 @@ private boolean isValidTableName(String tableName) { } private boolean isValidColumnNamesList(String columnNames) { - if (columnNames == null || columnNames.trim().isEmpty()) { - return false; - } - for (String col : columnNames.split(",")) { - if (!isValidDatabaseIdentifierCharacter(col.trim())) { - return false; + if (columnNames == null || columnNames.trim().isEmpty()) { + return false; + } + logger.info("Validating column names: {}", columnNames); + for (String col : columnNames.split(",")) { + String trimmed = col.trim(); + + // Handle date_format(...) style + if (trimmed.toLowerCase().startsWith("date_format(")) { + int openParenIndex = trimmed.indexOf("("); + int commaIndex = trimmed.indexOf(",", openParenIndex); + if (commaIndex > 0) { + trimmed = trimmed.substring(openParenIndex + 1, commaIndex).trim(); } } - return true; + + if (!isValidDatabaseIdentifierCharacter(trimmed)) { + return false; + } } + return true; +} + public int checkRecordIsAlreadyPresentOrNot(String schemaName, String tableName, String vanSerialNo, String vanID, String vanAutoIncColumnName, int syncFacilityID) { + jdbcTemplate = getJdbcTemplate(); List params = new ArrayList<>(); diff --git a/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java b/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java index cd33c2b5..fcc68fd3 100644 --- a/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java +++ b/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java @@ -27,7 +27,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -46,7 +45,6 @@ public class GetDataFromVanAndSyncToDBImpl implements GetDataFromVanAndSyncToDB @Autowired private DataSyncRepositoryCentral dataSyncRepositoryCentral; - private static final Map> TABLE_GROUPS = new HashMap<>(); static { TABLE_GROUPS.put(1, @@ -96,14 +94,15 @@ public String syncDataToServer(String requestOBJ, String Authorization) throws E ObjectMapper mapper = new ObjectMapper(); SyncUploadDataDigester syncUploadDataDigester = mapper.readValue(requestOBJ, SyncUploadDataDigester.class); -List> dataToBesync = syncUploadDataDigester.getSyncData(); + List> dataToBesync = syncUploadDataDigester.getSyncData(); + logger.info("Data to be synced: {}", dataToBesync); if (syncUploadDataDigester == null || syncUploadDataDigester.getTableName() == null) { logger.error("Invalid SyncUploadDataDigester object or tableName is null."); return "Error: Invalid sync request."; } String syncTableName = syncUploadDataDigester.getTableName(); - + logger.info("Syncing data for table: {}", syncTableName); // Handle specific tables first, if their logic is distinct if ("m_beneficiaryregidmapping".equalsIgnoreCase(syncTableName)) { String result = update_M_BeneficiaryRegIdMapping_for_provisioned_benID(syncUploadDataDigester); @@ -113,29 +112,15 @@ public String syncDataToServer(String requestOBJ, String Authorization) throws E logger.error("Sync failed for m_beneficiaryregidmapping: {}", result); return "Sync failed for m_beneficiaryregidmapping."; } - } else if ("i_beneficiarydetails".equalsIgnoreCase(syncTableName)) { - String result = update_I_BeneficiaryDetails_for_processed_in_batches(syncUploadDataDigester); - if ("data sync passed".equals(result)) { - return "Sync successful for i_beneficiarydetails."; - } else { - logger.error("Sync failed for i_beneficiarydetails: {}", result); - return "Sync failed for i_beneficiarydetails."; - } - } else { - // Determine the group for the current table or iterate through all if no - // specific table is given + } + else { boolean syncSuccess = true; String errorMessage = ""; - - // If a specific table is provided in the request, try to find its group and - // sync only that table. - // Otherwise, iterate through all defined groups. if (syncTableName != null && !syncTableName.isEmpty()) { boolean foundInGroup = false; - - for (Map map : dataToBesync) { - // if (entry.getValue().contains(syncTableName.toLowerCase())) { - if(map.get("tableName") != null + + for (Map map : dataToBesync) { + if (map.get("tableName") != null && map.get("tableName").toString().equalsIgnoreCase(syncTableName)) { syncSuccess = syncTablesInGroup(syncUploadDataDigester.getSchemaName(), syncTableName, syncUploadDataDigester); @@ -149,26 +134,13 @@ public String syncDataToServer(String requestOBJ, String Authorization) throws E syncSuccess = performGenericTableSync(syncUploadDataDigester); } } else { - // If no specific table is in the request (e.g., a general sync trigger), - // iterate through groups - logger.info("No specific table provided. Attempting to sync all tables group by group."); + for (Map.Entry> entry : TABLE_GROUPS.entrySet()) { Integer groupId = entry.getKey(); List tablesInGroup = entry.getValue(); - logger.info("Starting sync for Group {}", groupId); for (String table : tablesInGroup) { try { - // Create a new digester for each table within the group, - // or adapt if the original digester contains data for multiple tables. - // For simplicity, assuming syncDataDigester needs to be tailored per table or - // group. - // If your requestOBJ contains data for only one table at a time, this loop - // might need adjustment - // to fetch data for each table in the group. - // For now, it will use the syncData from the original requestOBJ, which implies - // the original requestOBJ should represent data for a single table. - // A more robust solution would involve fetching data for each table - // dynamically. + boolean currentTableSyncResult = syncTablesInGroup(syncUploadDataDigester.getSchemaName(), table, syncUploadDataDigester); if (!currentTableSyncResult) { @@ -176,9 +148,7 @@ public String syncDataToServer(String requestOBJ, String Authorization) throws E errorMessage += "Failed to sync table: " + table + " in Group " + groupId + ". "; logger.error("Sync failed for table '{}' in Group {}. Error: {}", table, groupId, errorMessage); - // Optionally, you can choose to break here or continue to sync other tables in - // the group/next group - // For now, let's continue to attempt other tables within the group. + } else { logger.info("Successfully synced table: {} in Group {}", table, groupId); } @@ -188,7 +158,6 @@ public String syncDataToServer(String requestOBJ, String Authorization) throws E + e.getMessage() + ". "; logger.error("Exception during sync for table '{}' in Group {}: {}", table, groupId, e.getMessage(), e); - // Continue to attempt other tables } } } @@ -202,41 +171,22 @@ public String syncDataToServer(String requestOBJ, String Authorization) throws E } } - /** - * Helper method to sync tables belonging to a specific group. - * This method assumes that the `syncUploadDataDigester` will be populated - * with relevant data for the `currentTableName` before calling this. - * In a real-world scenario, you might fetch data for each table here. - */ private boolean syncTablesInGroup(String schemaName, String currentTableName, SyncUploadDataDigester originalDigester) { - logger.info("Attempting generic sync for table: {}", currentTableName); - // This is a simplification. In a production system, you would likely need - // to retrieve the actual data for 'currentTableName' from the local DB - // based on the group sync approach. For this example, we'll assume the - // originalDigester's syncData is relevant or needs to be re-populated. - - // Create a new digester instance or modify the existing one for the current - // table SyncUploadDataDigester tableSpecificDigester = new SyncUploadDataDigester(); tableSpecificDigester.setSchemaName(schemaName); tableSpecificDigester.setTableName(currentTableName); tableSpecificDigester.setSyncedBy(originalDigester.getSyncedBy()); tableSpecificDigester.setFacilityID(originalDigester.getFacilityID()); tableSpecificDigester.setVanAutoIncColumnName(originalDigester.getVanAutoIncColumnName()); - tableSpecificDigester.setServerColumns(originalDigester.getServerColumns()); // Assuming serverColumns is - // generic or set per table - - // !!! IMPORTANT: You'll need to fetch the data for 'currentTableName' from your local DB here. - // The `originalDigester.getSyncData()` might not be correct for all tables in a group. - // For demonstration, I'm just using the original digester's data, which is likely incorrect + tableSpecificDigester.setServerColumns(originalDigester.getServerColumns()); tableSpecificDigester.setSyncData(originalDigester.getSyncData()); return performGenericTableSync(tableSpecificDigester); } private String update_M_BeneficiaryRegIdMapping_for_provisioned_benID( SyncUploadDataDigester syncUploadDataDigester) { - + List> dataToBesync = syncUploadDataDigester.getSyncData(); List syncData = new ArrayList<>(); @@ -261,7 +211,8 @@ private String update_M_BeneficiaryRegIdMapping_for_provisioned_benID( if (!syncData.isEmpty()) { try { int[] i = dataSyncRepositoryCentral.syncDataToCentralDB(syncUploadDataDigester.getSchemaName(), - syncUploadDataDigester.getTableName(), syncUploadDataDigester.getServerColumns(), query, syncData); + syncUploadDataDigester.getTableName(), syncUploadDataDigester.getServerColumns(), query, + syncData); if (i.length == syncData.size()) { logger.info("Successfully updated {} records for m_beneficiaryregidmapping.", i.length); @@ -309,10 +260,10 @@ public String update_I_BeneficiaryDetails_for_processed_in_batches(SyncUploadDat String problematicWhereClause = " WHERE Processed <> 'P' AND VanID IS NOT NULL "; // Define it explicitly - while (true) { - List> batch; - try { - + while (true) { + List> batch; + try { + batch = dataSyncRepositoryCentral.getBatchForBenDetails( syncUploadDataDigester, problematicWhereClause, @@ -350,210 +301,215 @@ private String getQueryFor_I_BeneficiaryDetails(String schemaName, String tableN * Handles the generic synchronization logic for tables not covered by specific * handlers. */ - private boolean performGenericTableSync(SyncUploadDataDigester syncUploadDataDigester) { - List> dataToBesync = syncUploadDataDigester.getSyncData(); - List syncDataListInsert = new ArrayList<>(); - List syncDataListUpdate = new ArrayList<>(); - if (dataToBesync == null || dataToBesync.isEmpty()) { - logger.info("No data to sync for table: {}", syncUploadDataDigester.getTableName()); - return true; // Nothing to sync, consider it a success - } + private boolean performGenericTableSync(SyncUploadDataDigester syncUploadDataDigester) { + List> dataToBesync = syncUploadDataDigester.getSyncData(); + List syncDataListInsert = new ArrayList<>(); + List syncDataListUpdate = new ArrayList<>(); - String syncTableName = syncUploadDataDigester.getTableName(); - String vanAutoIncColumnName = syncUploadDataDigester.getVanAutoIncColumnName(); - String schemaName = syncUploadDataDigester.getSchemaName(); - Integer facilityIDFromDigester = syncUploadDataDigester.getFacilityID(); + if (dataToBesync == null || dataToBesync.isEmpty()) { + logger.info("No data to sync for table: {}", syncUploadDataDigester.getTableName()); + return true; // Nothing to sync, consider it a success + } - for (Map map : dataToBesync) { - String vanSerialNo = String.valueOf(map.get(vanAutoIncColumnName)); - String vanID = String.valueOf(map.get("VanID")); - int syncFacilityID = 0; - - // Update SyncedBy and SyncedDate in the xmap itself before processing - map.put("SyncedBy", syncUploadDataDigester.getSyncedBy()); - map.put("SyncedDate", String.valueOf(LocalDateTime.now())); // Ensure column name matches DB - if (map.get("CreatedDate") == null || map.get("created_date") == null) { - logger.info("CreatedDate was null for table: " + syncTableName + ", inserting current time"); - if(map.get("CreatedDate") == null) - map.put("CreatedDate", String.valueOf(LocalDateTime.now())); - if(map.get("created_date") == null) - map.put("created_date", String.valueOf(LocalDateTime.now())); + String syncTableName = syncUploadDataDigester.getTableName(); + String vanAutoIncColumnName = syncUploadDataDigester.getVanAutoIncColumnName(); + String schemaName = syncUploadDataDigester.getSchemaName(); + Integer facilityIDFromDigester = syncUploadDataDigester.getFacilityID(); + String serverColumns = syncUploadDataDigester.getServerColumns(); + + List serverColumnsList = Arrays.asList(serverColumns.split(",")); + + for (Map map : dataToBesync) { + // Create a new map with clean column names as keys + Map cleanRecord = new HashMap<>(); + for (String key : map.keySet()) { + String cleanKey = key; + // Handle keys with SQL functions like date_format + if (key.startsWith("date_format(") && key.endsWith(")")) { + int start = key.indexOf("(") + 1; + int end = key.indexOf(","); + if (end > start) { + cleanKey = key.substring(start, end).trim(); + } else { + // Fallback if format is unexpected + cleanKey = key.substring(start, key.indexOf(")")).trim(); } - // Facility ID processing - if (facilityIDFromDigester != null) { - // Determine the 'Processed' status based on facility ID for specific tables - switch (syncTableName.toLowerCase()) { - case "t_indent": - case "t_indentorder": { - if (map.containsKey("FromFacilityID") && map.get("FromFacilityID") instanceof Double) { - Double fromFacilityID = (Double) map.get("FromFacilityID"); - if (fromFacilityID.intValue() == facilityIDFromDigester) { - map.put("Processed", "P"); - } + } + cleanRecord.put(cleanKey.trim(), map.get(key)); + } + + String vanSerialNo = String.valueOf(cleanRecord.get(vanAutoIncColumnName)); + String vanID = String.valueOf(cleanRecord.get("VanID")); + int syncFacilityID = 0; + + // Update SyncedBy and SyncedDate in the xmap itself before processing + cleanRecord.put("SyncedBy", syncUploadDataDigester.getSyncedBy()); + cleanRecord.put("SyncedDate", String.valueOf(LocalDateTime.now())); + + if (facilityIDFromDigester != null) { + // Determine the 'Processed' status based on facility ID for specific tables + switch (syncTableName.toLowerCase()) { + case "t_indent": + case "t_indentorder": { + if (cleanRecord.containsKey("FromFacilityID") && cleanRecord.get("FromFacilityID") instanceof Number) { + Number fromFacilityID = (Number) cleanRecord.get("FromFacilityID"); + if (fromFacilityID.intValue() == facilityIDFromDigester) { + cleanRecord.put("Processed", "P"); } - break; } - case "t_indentissue": { - if (map.containsKey("ToFacilityID") && map.get("ToFacilityID") instanceof Double) { - Double toFacilityID = (Double) map.get("ToFacilityID"); - if (toFacilityID.intValue() == facilityIDFromDigester) { - map.put("Processed", "P"); - } + break; + } + case "t_indentissue": { + if (cleanRecord.containsKey("ToFacilityID") && cleanRecord.get("ToFacilityID") instanceof Number) { + Number toFacilityID = (Number) cleanRecord.get("ToFacilityID"); + if (toFacilityID.intValue() == facilityIDFromDigester) { + cleanRecord.put("Processed", "P"); } - break; } - case "t_stocktransfer": { - if (map.containsKey("TransferToFacilityID") - && map.get("TransferToFacilityID") instanceof Double) { - Double transferToFacilityID = (Double) map.get("TransferToFacilityID"); - if (transferToFacilityID.intValue() == facilityIDFromDigester) { - map.put("Processed", "P"); - } + break; + } + case "t_stocktransfer": { + if (cleanRecord.containsKey("TransferToFacilityID") + && cleanRecord.get("TransferToFacilityID") instanceof Number) { + Number transferToFacilityID = (Number) cleanRecord.get("TransferToFacilityID"); + if (transferToFacilityID.intValue() == facilityIDFromDigester) { + cleanRecord.put("Processed", "P"); } - break; } - case "t_itemstockentry": { - if (map.containsKey("FacilityID") && map.get("FacilityID") instanceof Double) { - Double mapFacilityID = (Double) map.get("FacilityID"); - if (mapFacilityID.intValue() == facilityIDFromDigester) { - map.put("Processed", "P"); - } + break; + } + case "t_itemstockentry": { + if (cleanRecord.containsKey("FacilityID") && cleanRecord.get("FacilityID") instanceof Number) { + Number mapFacilityID = (Number) cleanRecord.get("FacilityID"); + if (mapFacilityID.intValue() == facilityIDFromDigester) { + cleanRecord.put("Processed", "P"); } - break; } - default: - // No specific facility ID logic for other tables, maintain existing 'Processed' - // status or default - break; + break; } + default: + // No specific facility ID logic for other tables + break; } + } - // Extract SyncFacilityID for checkRecordIsAlreadyPresentOrNot - if (map.containsKey("SyncFacilityID") && map.get("SyncFacilityID") instanceof Integer) { - syncFacilityID = (Integer) map.get("SyncFacilityID"); - } else if (map.containsKey("SyncFacilityID") && map.get("SyncFacilityID") instanceof Double) { - syncFacilityID = ((Double) map.get("SyncFacilityID")).intValue(); - } + // Extract SyncFacilityID for checkRecordIsAlreadyPresentOrNot + if (cleanRecord.containsKey("SyncFacilityID") && cleanRecord.get("SyncFacilityID") instanceof Number) { + syncFacilityID = ((Number) cleanRecord.get("SyncFacilityID")).intValue(); + } - int recordCheck; - try { - recordCheck = dataSyncRepositoryCentral.checkRecordIsAlreadyPresentOrNot( - schemaName, syncTableName, vanSerialNo, vanID, vanAutoIncColumnName, syncFacilityID); - } catch (Exception e) { - logger.error("Error checking record existence for table {}: VanSerialNo={}, VanID={}. Error: {}", - syncTableName, vanSerialNo, vanID, e.getMessage(), e); - return false; // Critical error, stop sync for this table - } + int recordCheck; + try { + recordCheck = dataSyncRepositoryCentral.checkRecordIsAlreadyPresentOrNot( + schemaName, syncTableName, vanSerialNo, vanID, vanAutoIncColumnName, syncFacilityID); + } catch (Exception e) { + logger.error("Error checking record existence for table {}: VanSerialNo={}, VanID={}. Error: {}", + syncTableName, vanSerialNo, vanID, e.getMessage(), e); + return false; // Critical error, stop sync for this table + } - // Prepare Object array for insert/update - Object[] objArr; - List serverColumnsList = Arrays.asList(syncUploadDataDigester.getServerColumns().split(",")); - List currentRecordValues = new ArrayList<>(); - - for (String column : serverColumnsList) { - Object value = map.get(column.trim()); - // Handle boolean conversion if necessary, though String.valueOf should - // generally work for prepared statements - if (value instanceof Boolean) { - currentRecordValues.add(value); - } else if (value != null) { - currentRecordValues.add(String.valueOf(value)); - } else { - currentRecordValues.add(null); - } + // Prepare Object array for insert/update + List currentRecordValues = new ArrayList<>(); + for (String column : serverColumnsList) { + Object value = cleanRecord.get(column.trim()); + if (value instanceof Boolean) { + currentRecordValues.add(value); + } else if (value != null) { + currentRecordValues.add(String.valueOf(value)); + } else { + currentRecordValues.add(null); } + } - objArr = currentRecordValues.toArray(); - - if (recordCheck == 0) { - syncDataListInsert.add(objArr); + Object[] objArr = currentRecordValues.toArray(); + if (recordCheck == 0) { + syncDataListInsert.add(objArr); + } else { + // For update, append the WHERE clause parameters at the end of the array + List updateParams = new ArrayList<>(Arrays.asList(objArr)); + updateParams.add(String.valueOf(vanSerialNo)); + + if (Arrays.asList("t_patientissue", "t_physicalstockentry", "t_stockadjustment", "t_saitemmapping", + "t_stocktransfer", "t_patientreturn", "t_facilityconsumption", "t_indent", + "t_indentorder", "t_indentissue", "t_itemstockentry", "t_itemstockexit") + .contains(syncTableName.toLowerCase()) && cleanRecord.containsKey("SyncFacilityID")) { + updateParams.add(String.valueOf(cleanRecord.get("SyncFacilityID"))); } else { - // For update, append the WHERE clause parameters at the end of the array - List updateParams = new ArrayList<>(Arrays.asList(objArr)); - updateParams.add(String.valueOf(vanSerialNo)); - - if (Arrays.asList("t_patientissue", "t_physicalstockentry", "t_stockadjustment", "t_saitemmapping", - "t_stocktransfer", "t_patientreturn", "t_facilityconsumption", "t_indent", - "t_indentorder", "t_indentissue", "t_itemstockentry", "t_itemstockexit") - .contains(syncTableName.toLowerCase()) && map.containsKey("SyncFacilityID")) { - updateParams.add(String.valueOf(map.get("SyncFacilityID"))); - } else { - updateParams.add(String.valueOf(vanID)); - } - syncDataListUpdate.add(updateParams.toArray()); + updateParams.add(String.valueOf(vanID)); } + syncDataListUpdate.add(updateParams.toArray()); } + } - boolean insertSuccess = true; - boolean updateSuccess = true; + boolean insertSuccess = true; + boolean updateSuccess = true; - if (!syncDataListInsert.isEmpty()) { - String queryInsert = getQueryToInsertDataToServerDB(schemaName, syncTableName, syncUploadDataDigester.getServerColumns()); - - try { - int[] i = dataSyncRepositoryCentral.syncDataToCentralDB(schemaName, syncTableName, - syncUploadDataDigester.getServerColumns(), queryInsert, syncDataListInsert); - if (i.length != syncDataListInsert.size()) { - insertSuccess = false; - logger.error("Partial insert for table {}. Expected {} inserts, got {}. Failed records: {}", - syncTableName, syncDataListInsert.size(), i.length, - getFailedRecords(i, syncDataListInsert)); - } else { - logger.info("Successfully inserted {} records into table {}.", i.length, syncTableName); - } - } catch (Exception e) { + if (!syncDataListInsert.isEmpty()) { + String queryInsert = getQueryToInsertDataToServerDB(schemaName, syncTableName, serverColumns); + + try { + int[] i = dataSyncRepositoryCentral.syncDataToCentralDB(schemaName, syncTableName, + serverColumns, queryInsert, syncDataListInsert); + if (i.length != syncDataListInsert.size()) { insertSuccess = false; - logger.error("Exception during insert for table {}: {}", syncTableName, e.getMessage(), e); + logger.error("Partial insert for table {}. Expected {} inserts, got {}. Failed records: {}", + syncTableName, syncDataListInsert.size(), i.length, + getFailedRecords(i, syncDataListInsert)); + } else { + logger.info("Successfully inserted {} records into table {}.", i.length, syncTableName); } + } catch (Exception e) { + insertSuccess = false; + logger.error("Exception during insert for table {}: {}", syncTableName, e.getMessage(), e); } + } - if (!syncDataListUpdate.isEmpty()) { - String queryUpdate = getQueryToUpdateDataToServerDB(schemaName, syncUploadDataDigester.getServerColumns(), syncTableName); - // Ensure the update query is correct and matches the expected format - try { - int[] j = dataSyncRepositoryCentral.syncDataToCentralDB(schemaName, syncTableName, - SERVER_COLUMNS_NOT_REQUIRED, queryUpdate, syncDataListUpdate); - if (j.length != syncDataListUpdate.size()) { - updateSuccess = false; - logger.error("Partial update for table {}. Expected {} updates, got {}. Failed records: {}", - syncTableName, syncDataListUpdate.size(), j.length, - getFailedRecords(j, syncDataListUpdate)); - } else { - logger.info("Successfully updated {} records in table {}.", j.length, syncTableName); - } - } catch (Exception e) { + if (!syncDataListUpdate.isEmpty()) { + String queryUpdate = getQueryToUpdateDataToServerDB(schemaName, serverColumns, syncTableName); + try { + int[] j = dataSyncRepositoryCentral.syncDataToCentralDB(schemaName, syncTableName, + SERVER_COLUMNS_NOT_REQUIRED, queryUpdate, syncDataListUpdate); + if (j.length != syncDataListUpdate.size()) { updateSuccess = false; - logger.error("Exception during update for table {}: {}", syncTableName, e.getMessage(), e); + logger.error("Partial update for table {}. Expected {} updates, got {}. Failed records: {}", + syncTableName, syncDataListUpdate.size(), j.length, + getFailedRecords(j, syncDataListUpdate)); + } else { + logger.info("Successfully updated {} records in table {}.", j.length, syncTableName); } + } catch (Exception e) { + updateSuccess = false; + logger.error("Exception during update for table {}: {}", syncTableName, e.getMessage(), e); } - return insertSuccess && updateSuccess; + } + return insertSuccess && updateSuccess; +} + private String getQueryToInsertDataToServerDB(String schemaName, String + tableName, String serverColumns) { + String[] columnsArr = null; + if (serverColumns != null) + columnsArr = serverColumns.split(","); + + StringBuilder preparedStatementSetter = new StringBuilder(); + + if (columnsArr != null && columnsArr.length > 0) { + for (int i = 0; i < columnsArr.length; i++) { + preparedStatementSetter.append("?"); + if (i < columnsArr.length - 1) { + preparedStatementSetter.append(", "); + } + } } - private String getQueryToInsertDataToServerDB(String schemaName, String tableName, String serverColumns) { - String[] columnsArr = null; - if (serverColumns != null) - columnsArr = serverColumns.split(","); - - StringBuilder preparedStatementSetter = new StringBuilder(); - - if (columnsArr != null && columnsArr.length > 0) { - for (int i = 0; i < columnsArr.length; i++) { - preparedStatementSetter.append("?"); - if (i < columnsArr.length - 1) { - preparedStatementSetter.append(", "); - } - } - } - - StringBuilder queryBuilder = new StringBuilder("INSERT INTO "); - queryBuilder.append(schemaName).append(".").append(tableName); - queryBuilder.append("("); - queryBuilder.append(serverColumns); - queryBuilder.append(") VALUES ("); - queryBuilder.append(preparedStatementSetter); - queryBuilder.append(")"); - return queryBuilder.toString(); + StringBuilder queryBuilder = new StringBuilder("INSERT INTO "); + queryBuilder.append(schemaName).append(".").append(tableName); + queryBuilder.append("("); + queryBuilder.append(serverColumns); + queryBuilder.append(") VALUES ("); + queryBuilder.append(preparedStatementSetter); + queryBuilder.append(")"); + return queryBuilder.toString(); } public String getQueryToUpdateDataToServerDB(String schemaName, String serverColumns, String tableName) { @@ -563,24 +519,6 @@ public String getQueryToUpdateDataToServerDB(String schemaName, String serverCol StringBuilder preparedStatementSetter = new StringBuilder(); - if (columnsArr != null && columnsArr.length > 0) { - for (int i = 0; i < columnsArr.length; i++) { - String columnName = columnsArr[i].trim(); // ← NEW LINE - - // Special handling for CreatedDate - use COALESCE to prevent NULL - if (columnName.equalsIgnoreCase("CreatedDate")) { // ← NEW BLOCK - preparedStatementSetter.append(columnName); - preparedStatementSetter.append(" = COALESCE(?, CURRENT_TIMESTAMP)"); - } else { - preparedStatementSetter.append(columnName); - preparedStatementSetter.append(" = ?"); - } - - if (i < columnsArr.length - 1) { - preparedStatementSetter.append(", "); - } - } - } StringBuilder queryBuilder = new StringBuilder(" UPDATE "); queryBuilder.append(schemaName).append(".").append(tableName); queryBuilder.append(" SET "); @@ -619,4 +557,6 @@ private String getFailedRecords(int[] results, List data) { logger.info("Failed records info: {}", failedRecordsInfo); return String.join("; ", failedRecordsInfo); } + + } \ No newline at end of file From 62a5a18b9d1f2a73c7d5ee47e08a3a54e3cdd0b9 Mon Sep 17 00:00:00 2001 From: Vanitha S <116701245+vanitha1822@users.noreply.github.com> Date: Tue, 19 Aug 2025 22:19:09 +0530 Subject: [PATCH 20/47] Fix the token issue for Ben-gen id generation (#114) * fix: update server authorization for bengen * fix: update server authorization for bengen --- .../service/dataSyncActivity/DownloadDataFromServerImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/iemr/mmu/service/dataSyncActivity/DownloadDataFromServerImpl.java b/src/main/java/com/iemr/mmu/service/dataSyncActivity/DownloadDataFromServerImpl.java index afb42a4b..dd389c38 100644 --- a/src/main/java/com/iemr/mmu/service/dataSyncActivity/DownloadDataFromServerImpl.java +++ b/src/main/java/com/iemr/mmu/service/dataSyncActivity/DownloadDataFromServerImpl.java @@ -333,7 +333,7 @@ public int callCentralAPIToGenerateBenIDAndimportToLocal(String requestOBJ, Stri int i = 0; // Rest template RestTemplate restTemplate = new RestTemplate(); - HttpEntity request = RestTemplateUtil.createRequestEntity(requestOBJ, Authorization,token); + HttpEntity request = RestTemplateUtil.createRequestEntity(requestOBJ, ServerAuthorization,"datasync"); // Call rest-template to call central API to generate UNIQUE ID at central ResponseEntity response = restTemplate.exchange(benGenUrlCentral, HttpMethod.POST, request, String.class); @@ -342,7 +342,7 @@ public int callCentralAPIToGenerateBenIDAndimportToLocal(String requestOBJ, Stri JSONObject obj = new JSONObject(response.getBody()); if (obj != null && obj.has("data") && obj.has("statusCode") && obj.getInt("statusCode") == 200) { // Consume the response from API and call local identity api to save data - HttpEntity request1 = RestTemplateUtil.createRequestEntity(obj.get("data").toString(), Authorization, token); + HttpEntity request1 = RestTemplateUtil.createRequestEntity(obj.get("data").toString(), ServerAuthorization, "datasync"); i = 1; // Call rest-template to call central API to generate UNIQUE ID at central ResponseEntity response1 = restTemplate.exchange(benImportUrlLocal, HttpMethod.POST, request1, From d592f6a5884f9f412414b3f535b18b9d004b6599 Mon Sep 17 00:00:00 2001 From: Vanitha S <116701245+vanitha1822@users.noreply.github.com> Date: Wed, 20 Aug 2025 10:59:03 +0530 Subject: [PATCH 21/47] fix: replace authorization for local api call (#116) --- .../service/dataSyncActivity/DownloadDataFromServerImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/iemr/mmu/service/dataSyncActivity/DownloadDataFromServerImpl.java b/src/main/java/com/iemr/mmu/service/dataSyncActivity/DownloadDataFromServerImpl.java index dd389c38..13070e18 100644 --- a/src/main/java/com/iemr/mmu/service/dataSyncActivity/DownloadDataFromServerImpl.java +++ b/src/main/java/com/iemr/mmu/service/dataSyncActivity/DownloadDataFromServerImpl.java @@ -342,7 +342,7 @@ public int callCentralAPIToGenerateBenIDAndimportToLocal(String requestOBJ, Stri JSONObject obj = new JSONObject(response.getBody()); if (obj != null && obj.has("data") && obj.has("statusCode") && obj.getInt("statusCode") == 200) { // Consume the response from API and call local identity api to save data - HttpEntity request1 = RestTemplateUtil.createRequestEntity(obj.get("data").toString(), ServerAuthorization, "datasync"); + HttpEntity request1 = RestTemplateUtil.createRequestEntity(obj.get("data").toString(), Authorization, "datasync"); i = 1; // Call rest-template to call central API to generate UNIQUE ID at central ResponseEntity response1 = restTemplate.exchange(benImportUrlLocal, HttpMethod.POST, request1, From 26bf74c1fb1455a7f36aeae89a6bb1bdb61ffd62 Mon Sep 17 00:00:00 2001 From: Vanitha S <116701245+vanitha1822@users.noreply.github.com> Date: Wed, 20 Aug 2025 15:33:47 +0530 Subject: [PATCH 22/47] fix: add logs (#117) --- .../service/dataSyncActivity/DownloadDataFromServerImpl.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/iemr/mmu/service/dataSyncActivity/DownloadDataFromServerImpl.java b/src/main/java/com/iemr/mmu/service/dataSyncActivity/DownloadDataFromServerImpl.java index 13070e18..dbaadbad 100644 --- a/src/main/java/com/iemr/mmu/service/dataSyncActivity/DownloadDataFromServerImpl.java +++ b/src/main/java/com/iemr/mmu/service/dataSyncActivity/DownloadDataFromServerImpl.java @@ -337,11 +337,13 @@ public int callCentralAPIToGenerateBenIDAndimportToLocal(String requestOBJ, Stri // Call rest-template to call central API to generate UNIQUE ID at central ResponseEntity response = restTemplate.exchange(benGenUrlCentral, HttpMethod.POST, request, String.class); - +logger.info("Respponse from central API: " + response); +logger.info("Import url="+benImportUrlLocal); if (response != null && response.hasBody()) { JSONObject obj = new JSONObject(response.getBody()); if (obj != null && obj.has("data") && obj.has("statusCode") && obj.getInt("statusCode") == 200) { // Consume the response from API and call local identity api to save data + HttpEntity request1 = RestTemplateUtil.createRequestEntity(obj.get("data").toString(), Authorization, "datasync"); i = 1; // Call rest-template to call central API to generate UNIQUE ID at central From 9f7fb1cc69c89bf63b41dc3fbc426f303a370a61 Mon Sep 17 00:00:00 2001 From: Vanitha S <116701245+vanitha1822@users.noreply.github.com> Date: Fri, 22 Aug 2025 11:14:32 +0530 Subject: [PATCH 23/47] Fix the BenGen ID Issue (#118) * fix: add logs to check the identity-api * fix: add logs * fix: add logs --- .../dataSyncActivity/StartSyncActivity.java | 5 +++-- .../DownloadDataFromServerImpl.java | 21 ++++++++++++------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/iemr/mmu/controller/dataSyncActivity/StartSyncActivity.java b/src/main/java/com/iemr/mmu/controller/dataSyncActivity/StartSyncActivity.java index 5f08fa9d..1e43ed66 100644 --- a/src/main/java/com/iemr/mmu/controller/dataSyncActivity/StartSyncActivity.java +++ b/src/main/java/com/iemr/mmu/controller/dataSyncActivity/StartSyncActivity.java @@ -25,7 +25,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; - import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -37,8 +36,8 @@ import com.iemr.mmu.service.dataSyncActivity.DownloadDataFromServerImpl; import com.iemr.mmu.service.dataSyncActivity.DownloadDataFromServerTransactionalImpl; import com.iemr.mmu.service.dataSyncActivity.UploadDataToServerImpl; -import com.iemr.mmu.utils.response.OutputResponse; import com.iemr.mmu.utils.CookieUtil; +import com.iemr.mmu.utils.response.OutputResponse; import io.swagger.v3.oas.annotations.Operation; import jakarta.servlet.http.HttpServletRequest; @@ -181,6 +180,8 @@ public String callCentralAPIToGenerateBenIDAndimportToLocal(@RequestBody String OutputResponse response = new OutputResponse(); try { String jwtToken = CookieUtil.getJwtTokenFromCookie(request); + logger.info("Authorization from controller="+ authorization); + int i = downloadDataFromServerImpl.callCentralAPIToGenerateBenIDAndimportToLocal(requestOBJ, authorization, serverAuthorization, jwtToken); if (i == 0) { diff --git a/src/main/java/com/iemr/mmu/service/dataSyncActivity/DownloadDataFromServerImpl.java b/src/main/java/com/iemr/mmu/service/dataSyncActivity/DownloadDataFromServerImpl.java index dbaadbad..6e7b1c91 100644 --- a/src/main/java/com/iemr/mmu/service/dataSyncActivity/DownloadDataFromServerImpl.java +++ b/src/main/java/com/iemr/mmu/service/dataSyncActivity/DownloadDataFromServerImpl.java @@ -330,25 +330,29 @@ public Map getDownloadStatus() { public int callCentralAPIToGenerateBenIDAndimportToLocal(String requestOBJ, String Authorization, String ServerAuthorization, String token) throws Exception { - int i = 0; + int i = 0, i1 = 0; + try{ // Rest template RestTemplate restTemplate = new RestTemplate(); HttpEntity request = RestTemplateUtil.createRequestEntity(requestOBJ, ServerAuthorization,"datasync"); // Call rest-template to call central API to generate UNIQUE ID at central ResponseEntity response = restTemplate.exchange(benGenUrlCentral, HttpMethod.POST, request, String.class); -logger.info("Respponse from central API: " + response); -logger.info("Import url="+benImportUrlLocal); + logger.info("Authorization before calling local api="+Authorization); + logger.info("Import url="+benImportUrlLocal); if (response != null && response.hasBody()) { JSONObject obj = new JSONObject(response.getBody()); if (obj != null && obj.has("data") && obj.has("statusCode") && obj.getInt("statusCode") == 200) { // Consume the response from API and call local identity api to save data - HttpEntity request1 = RestTemplateUtil.createRequestEntity(obj.get("data").toString(), Authorization, "datasync"); + logger.info("Authorization: " + Authorization); + logger.info("ServerAuthorization: " + ServerAuthorization); + HttpEntity request1 = RestTemplateUtil.createRequestEntity(obj.get("data").toString(), Authorization, token); i = 1; - // Call rest-template to call central API to generate UNIQUE ID at central + logger.info("Request to benImporturllocal: " + request1); ResponseEntity response1 = restTemplate.exchange(benImportUrlLocal, HttpMethod.POST, request1, String.class); + logger.info("Response from benImportUrlLocal: " + response1); if (response1 != null && response1.hasBody()) { JSONObject obj1 = new JSONObject(response1.getBody()); if (obj1 != null && obj1.has("data") && obj1.has("statusCode") @@ -357,9 +361,12 @@ public int callCentralAPIToGenerateBenIDAndimportToLocal(String requestOBJ, Stri } } - } + } } - + } catch (Exception e) { + logger.error("Error while generating catch UNIQUE_ID at central server: " + e.getMessage()); + throw new Exception("Error while generating catch UNIQUE_ID at central server: " + e.getMessage()); + } return i; } } From 18e89ea6793faf5248771746bf678a31ab10dc8d Mon Sep 17 00:00:00 2001 From: Vanitha S <116701245+vanitha1822@users.noreply.github.com> Date: Wed, 24 Sep 2025 22:48:52 +0530 Subject: [PATCH 24/47] Fix the DataSync with SyncFailureReason (#121) * Fix the issue in retrieving the Casesheet Print Data for Cancer Screening (#96) * fix: change the return type to object to get the details * fix: remove commented lines * fix: add the column for NumberperWeek to store and fetch the data (#94) * Update version in pom.xml to 3.4.0 * chore: add Lombok @Data to BenClinicalObservations (#97) * fix: add file path in cancer gynecological examination (#98) * Fix the data sync issue (#93) * fix: Data Sync batch processing for large data * fix: use parameterized query * fix: revert the updated query * fix: add token if it is missing while calling restTemplate * fix: update the properties * fix: sync group wise * fix: enable logger in pom.xml * fix: coderabbit comments * fix: remove logger and replace the license * fix: remove the logs * fix: resolve code scanning alert * fix: resolve code scanning alert * fix: resolve code scanning alert * fix: resolve code scanning alert * fix: add comment for code violation * fix: use syncuploaddataDigester class to load the deatils * fix: add syncuploaddigestor in implementation file too * fix: sonarcube comments * fix: add functionality to save the file ID's uploaded from doctor screen (#99) * story: amm-1668 task - 1754 * story: amm-1754 updated response including father name and phone no of the beneficiary (#102) * fix: amm-1754 changing the query to get the expected response similar to hwc * fix: amm-1754 compilation error fix * fix: amm-1754 argument issue fix * fix: amm-1754 argument issue fix * fix: amm-1754 argument issue fix * Save the files uploaded from Doctor Screen (#100) * fix: add file path in cancer gynecological examination * fix: save the files uploaded from the doctor portal * fix: get file names in the response of gynecological examination * fix: cherry-pick the commits from develop * fix: cherry-pick commits from develop * Fix the Download Masters issue (#103) * fix: resolve the conflicts * fix: fix the issue in download masters table * fix: remove the validation (#105) * fix: replace the old working code (#106) * Fix the datasync upload issue (#107) * fix: add the schemas * fix: remove logger * fix: revert the old code for repository * Fixing the datasync from local to central (#110) * fix: datasync from local to central * fix: fix the token * fix: remove the token for server authorization (#111) * Fix the datasync Demographics Issue (#112) * fix: remove condition for i_beneficiarydetails * fix: add logs * fix: add logs * fix: remove db_iemr * fix: add log for show column names too * fix: add date-format condition * fix: change valid column name * fix: change valid column name * fix: change valid column name * fix: change valid column name * fix: update insert query * fix: update cleaned column list * fix: date conversion * fix: conversion date-time * fix: add date conversion * fix: logs added * fix: new logger * fix: revert the date condition * fix: revert insert code * fix: revert insert code * fix: date format issue * fix: logs add * fix: log for group and group lsit * fix: clean the code --------- Co-authored-by: vishwab1 * Fix the token issue for Ben-gen id generation (#114) * fix: update server authorization for bengen * fix: update server authorization for bengen * fix: replace authorization for local api call (#116) * fix: add logs (#117) * Fix the BenGen ID Issue (#118) * fix: add logs to check the identity-api * fix: add logs * fix: add logs * fix: add logs * fix: add logs for checking * fix: update the prepare statement * fix: add log * fix: add log * fix: add logs * fix: add Sync Result * fix: add logs * fix: add syncResults * fix: add syncResults * fix: update processed flag * fix: update the response * fix: update the exception block * fix: upload fix * fix: address duplication issue * fix: datasync issue * fix: remove reason and add dataaccess exception * fix: revert the server exception * fix: remove unwanted code * fix: exception message * fix: fix the error message * fix: update the version --------- Co-authored-by: Amoghavarsh <93114621+5Amogh@users.noreply.github.com> Co-authored-by: 5Amogh Co-authored-by: vishwab1 --- pom.xml | 2 +- .../CancerGynecologicalExamination.java | 1 - .../dataSyncActivity/DataSyncRepository.java | 14 +- .../service/dataSyncActivity/SyncResult.java | 46 ++ .../UploadDataToServerImpl.java | 529 ++++++++++------ .../GetDataFromVanAndSyncToDBImpl.java | 573 ++++++++++++------ 6 files changed, 775 insertions(+), 390 deletions(-) create mode 100644 src/main/java/com/iemr/mmu/service/dataSyncActivity/SyncResult.java diff --git a/pom.xml b/pom.xml index b0e8639c..aa3c19c9 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 com.iemr.mmu mmu-api - 3.4.0 + 3.4.1 war MMU-API diff --git a/src/main/java/com/iemr/mmu/data/doctor/CancerGynecologicalExamination.java b/src/main/java/com/iemr/mmu/data/doctor/CancerGynecologicalExamination.java index 4e96ba30..dc916f29 100644 --- a/src/main/java/com/iemr/mmu/data/doctor/CancerGynecologicalExamination.java +++ b/src/main/java/com/iemr/mmu/data/doctor/CancerGynecologicalExamination.java @@ -39,7 +39,6 @@ import com.google.gson.annotations.Expose; import lombok.Data; -import lombok.Data; @Entity @Data diff --git a/src/main/java/com/iemr/mmu/service/dataSyncActivity/DataSyncRepository.java b/src/main/java/com/iemr/mmu/service/dataSyncActivity/DataSyncRepository.java index f7a55d4a..bc927104 100644 --- a/src/main/java/com/iemr/mmu/service/dataSyncActivity/DataSyncRepository.java +++ b/src/main/java/com/iemr/mmu/service/dataSyncActivity/DataSyncRepository.java @@ -98,8 +98,8 @@ public List> getDataForGivenSchemaAndTable(String schema, St return resultSetList; } - public int updateProcessedFlagInVan(String schemaName, String tableName, StringBuilder vanSerialNos, - String autoIncreamentColumn, String user) throws Exception { + public int updateProcessedFlagInVan(String schemaName, String tableName, List vanSerialNos, + String autoIncreamentColumn, String user, String status, String reason) throws Exception { jdbcTemplate = getJdbcTemplate(); String query = ""; @@ -107,16 +107,16 @@ public int updateProcessedFlagInVan(String schemaName, String tableName, StringB if (tableName != null && tableName.toLowerCase().equals("i_ben_flow_outreach")) { query = "UPDATE " + schemaName + "." + tableName - + " SET created_date = ? , processed = 'P', SyncedDate = ?, Syncedby = ? " - + "WHERE " + autoIncreamentColumn + " IN (" + vanSerialNos + ")"; + + " SET created_date = ? , processed = ?, SyncedDate = ?, Syncedby = ? , SyncFailureReason = ? " + + "WHERE " + autoIncreamentColumn + " IN (" + String.join(",", vanSerialNos) + ")"; } else { query = "UPDATE " + schemaName + "." + tableName - + " SET CreatedDate = ? , processed = 'P', SyncedDate = ?, Syncedby = ? " - + "WHERE " + autoIncreamentColumn + " IN (" + vanSerialNos + ")"; + + " SET CreatedDate = ? , processed = ?, SyncedDate = ?, Syncedby = ? , SyncFailureReason = ? " + + "WHERE " + autoIncreamentColumn + " IN (" + String.join(",", vanSerialNos) + ")"; } Timestamp syncedDate = new Timestamp(System.currentTimeMillis()); - int updatedRows = jdbcTemplate.update(query, syncedDate, syncedDate, user); + int updatedRows = jdbcTemplate.update(query, syncedDate, status, syncedDate, user, reason); return updatedRows; } diff --git a/src/main/java/com/iemr/mmu/service/dataSyncActivity/SyncResult.java b/src/main/java/com/iemr/mmu/service/dataSyncActivity/SyncResult.java new file mode 100644 index 00000000..b51a536d --- /dev/null +++ b/src/main/java/com/iemr/mmu/service/dataSyncActivity/SyncResult.java @@ -0,0 +1,46 @@ +/* +* AMRIT – Accessible Medical Records via Integrated Technology +* Integrated EHR (Electronic Health Records) Solution +* +* Copyright (C) "Piramal Swasthya Management and Research Institute" +* +* This file is part of AMRIT. +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see https://www.gnu.org/licenses/. +*/ +package com.iemr.mmu.service.dataSyncActivity; + +import lombok.Data; + +@Data +public class SyncResult { + private String schemaName; + private String tableName; + private String vanSerialNo; + private String syncedBy; + private boolean success; + private String reason; // Failure reason if any + + // Constructor + public SyncResult(String schemaName, String tableName, String vanSerialNo, String syncedBy, boolean success, String reason) { + this.schemaName = schemaName; + this.tableName = tableName; + this.vanSerialNo = vanSerialNo; + this.syncedBy = syncedBy; + this.success = success; + this.reason = reason; + } + + // Getters & setters omitted for brevity +} diff --git a/src/main/java/com/iemr/mmu/service/dataSyncActivity/UploadDataToServerImpl.java b/src/main/java/com/iemr/mmu/service/dataSyncActivity/UploadDataToServerImpl.java index 51d8a32b..266d3d28 100644 --- a/src/main/java/com/iemr/mmu/service/dataSyncActivity/UploadDataToServerImpl.java +++ b/src/main/java/com/iemr/mmu/service/dataSyncActivity/UploadDataToServerImpl.java @@ -27,6 +27,7 @@ import java.util.List; import java.util.Map; +import org.json.JSONArray; import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -88,22 +89,15 @@ public class UploadDataToServerImpl implements UploadDataToServer { @Autowired private CookieUtil cookieUtil; - // batch size for data upload - // private static final int BATCH_SIZE = 30; - /** * * @param groupName * @param Authorization * @return */ - // @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = { - // Exception.class }) public String getDataToSyncToServer(int vanID, String user, String Authorization, String token) throws Exception { - String syncData = null; syncData = syncIntercepter(vanID, user, Authorization, token); - return syncData; } @@ -113,148 +107,281 @@ public String getDataToSyncToServer(int vanID, String user, String Authorization * @return */ public String syncIntercepter(int vanID, String user, String Authorization, String token) throws Exception { - // sync activity trigger - String serverAcknowledgement = startDataSync(vanID, user, Authorization, token); - return serverAcknowledgement; } /** + * Enhanced startDataSync method with table-level and group-level tracking * * @param syncTableDetailsIDs * @param Authorization * @return */ - private String startDataSync(int vanID, String user, String Authorization, String token) throws Exception { String serverAcknowledgement = null; - List> responseStatus = new ArrayList<>(); - boolean isProgress = false; + List> responseStatus = new ArrayList<>(); boolean hasSyncFailed = false; ObjectMapper objectMapper = new ObjectMapper(); + // fetch group masters List dataSyncGroupList = dataSyncGroupsRepo.findByDeleted(false); logger.debug("Fetched DataSyncGroups: {}", objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(dataSyncGroupList)); + for (DataSyncGroups dataSyncGroups : dataSyncGroupList) { int groupId = dataSyncGroups.getSyncTableGroupID(); + String groupName = dataSyncGroups.getSyncTableGroupName(); // Get group name if available + List syncUtilityClassList = getVanAndServerColumns(groupId); logger.debug("Fetched SyncUtilityClass for groupId {}: {}", groupId, objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(syncUtilityClassList)); - List> syncData; - List> syncDataBatch; - Map groupIdStatus = new HashMap<>(); - for (SyncUtilityClass obj : syncUtilityClassList) { - // if (!isProgress) { - // get data from DB to sync to server - syncData = getDataToSync(obj.getSchemaName(), obj.getTableName(), obj.getVanColumnName()); - logger.debug("Fetched syncData for schema {} and table {}: {}", obj.getSchemaName(), obj.getTableName(), - objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(syncData)); - // System.out.println(new Gson().toJson(syncData)); - if (syncData != null && syncData.size() > 0) { - int dataSize = syncData.size(); - int startIndex = 0; - int fullBatchCount = dataSize / BATCH_SIZE; - int remainder = dataSize % BATCH_SIZE; - - logger.info("Starting batch sync for schema: {}, table: {} with {} full batches and {} remainder", - obj.getSchemaName(), obj.getTableName(), fullBatchCount, remainder); - - - for (int i = 0; i < fullBatchCount; i++) { - syncDataBatch = getBatchOfAskedSizeDataToSync(syncData, startIndex, - BATCH_SIZE); - serverAcknowledgement = syncDataToServer(vanID, obj.getSchemaName(), obj.getTableName(), - obj.getVanAutoIncColumnName(), obj.getServerColumnName(), syncDataBatch, user, - Authorization, token); - logger.debug("Server acknowledgement for batch {}: {}", i, serverAcknowledgement); - - if (serverAcknowledgement == null || !serverAcknowledgement.contains("success")) { - logger.error("Sync failed for batch {} in schema: {}, table: {}", i, obj.getSchemaName(), - obj.getTableName()); - hasSyncFailed = true; - setResponseStatus(groupIdStatus, groupId, "failed", responseStatus); - break; - } - - startIndex += BATCH_SIZE; - } - - if (!hasSyncFailed && remainder > 0) { - syncDataBatch = getBatchOfAskedSizeDataToSync(syncData, startIndex, - remainder); - serverAcknowledgement = syncDataToServer(vanID, obj.getSchemaName(), obj.getTableName(), - obj.getVanAutoIncColumnName(), obj.getServerColumnName(), syncDataBatch, user, - Authorization, token); - - if (serverAcknowledgement == null || !serverAcknowledgement.contains("success")) { - logger.error("Sync failed for remaining data in schema: {}, table: {}", obj.getSchemaName(), - obj.getTableName()); - hasSyncFailed = true; - setResponseStatus(groupIdStatus, groupId, "failed", responseStatus); - break; - } - } - if (!hasSyncFailed) { - logger.info("Data sync completed for schema: {}, table: {}", obj.getSchemaName(), - obj.getTableName()); - setResponseStatus(groupIdStatus, groupId, "completed", responseStatus); - } - } else { - logger.info("No data to sync for schema {} and table {}", obj.getSchemaName(), obj.getTableName()); - setResponseStatus(groupIdStatus, groupId, "completed", responseStatus); - } + // Track table-level results for this group + List> tableDetailsList = new ArrayList<>(); + boolean groupHasFailures = false; + + for (SyncUtilityClass obj : syncUtilityClassList) { + String tableKey = obj.getSchemaName() + "." + obj.getTableName(); + boolean tableHasError = false; + + // get data from DB to sync to server + List> syncData = getDataToSync(obj.getSchemaName(), obj.getTableName(), + obj.getVanColumnName()); + logger.debug("Fetched syncData for schema {} and table {}: {}", obj.getSchemaName(), obj.getTableName(), + objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(syncData)); + + if (syncData != null && syncData.size() > 0) { + int dataSize = syncData.size(); + int startIndex = 0; + int fullBatchCount = dataSize / BATCH_SIZE; + int remainder = dataSize % BATCH_SIZE; + + // Track table-level success/failure counts + int totalRecords = dataSize; + int successfulRecords = 0; + int failedRecords = 0; + List tableFailureReasons = new ArrayList<>(); + + logger.info("Starting batch sync for schema: {}, table: {} with {} full batches and {} remainder", + obj.getSchemaName(), obj.getTableName(), fullBatchCount, remainder); + + // Process full batches + for (int i = 0; i < fullBatchCount && !tableHasError; i++) { + List> syncDataBatch = getBatchOfAskedSizeDataToSync(syncData, startIndex, + BATCH_SIZE); + + // Updated to handle Map return type + Map syncResult = syncDataToServer(vanID, obj.getSchemaName(), obj.getTableName(), + obj.getVanAutoIncColumnName(), obj.getServerColumnName(), syncDataBatch, user, + Authorization, token); + + if (syncResult == null) { + logger.error("Sync failed for batch {} in schema: {}, table: {}", i, obj.getSchemaName(), + obj.getTableName()); + tableHasError = true; + failedRecords += syncDataBatch.size(); + groupHasFailures = true; + break; + } + + String status = (String) syncResult.get("status"); + int batchSuccessCount = (Integer) syncResult.get("successCount"); + int batchFailCount = (Integer) syncResult.get("failCount"); + @SuppressWarnings("unchecked") + List batchFailureReasons = (List) syncResult.get("failureReasons"); + + successfulRecords += batchSuccessCount; + failedRecords += batchFailCount; + + if (batchFailureReasons != null && !batchFailureReasons.isEmpty()) { + tableFailureReasons.addAll(batchFailureReasons); + groupHasFailures = true; + } + + if (status.equals("Sync failed")) { + tableHasError = true; + break; + } + + startIndex += BATCH_SIZE; + } + + if (!tableHasError && remainder > 0) { + List> syncDataBatch = getBatchOfAskedSizeDataToSync(syncData, startIndex, + remainder); + + Map syncResult = syncDataToServer(vanID, obj.getSchemaName(), obj.getTableName(), + obj.getVanAutoIncColumnName(), obj.getServerColumnName(), syncDataBatch, user, + Authorization, token); + + if (syncResult == null) { + logger.error("Sync failed for remaining data in schema: {}, table: {}", obj.getSchemaName(), + obj.getTableName()); + failedRecords += syncDataBatch.size(); + groupHasFailures = true; + } else { + String status = (String) syncResult.get("status"); + int batchSuccessCount = (Integer) syncResult.get("successCount"); + int batchFailCount = (Integer) syncResult.get("failCount"); + @SuppressWarnings("unchecked") + List batchFailureReasons = (List) syncResult.get("failureReasons"); + + successfulRecords += batchSuccessCount; + failedRecords += batchFailCount; + + if (batchFailureReasons != null && !batchFailureReasons.isEmpty()) { + tableFailureReasons.addAll(batchFailureReasons); + groupHasFailures = true; + } + + if (status.equals("Sync failed")) { + groupHasFailures = true; + } + } + } + + // Determine table status based on success/failure counts + String tableStatus; + if (successfulRecords == totalRecords && failedRecords == 0) { + tableStatus = "success"; + } else if (failedRecords == totalRecords && successfulRecords == 0) { + tableStatus = "failed"; + groupHasFailures = true; + } else if (successfulRecords > 0 && failedRecords > 0) { + tableStatus = "partial"; + } else { + tableStatus = "failed"; // Default to failed if unclear + groupHasFailures = true; + } + + // Create detailed table info with failure reasons + Map tableDetails = new HashMap<>(); + tableDetails.put("tableName", obj.getTableName()); + tableDetails.put("schemaName", obj.getSchemaName()); + tableDetails.put("status", tableStatus); + tableDetails.put("totalRecords", totalRecords); + tableDetails.put("successfulRecords", successfulRecords); + tableDetails.put("failedRecords", failedRecords); + + // Add failure reasons only if there are any failures + if (!tableFailureReasons.isEmpty()) { + tableDetails.put("failureReasons", tableFailureReasons); + } + + tableDetailsList.add(tableDetails); + + logger.info("Table sync summary - {}: {} (Success: {}, Failed: {}, Total: {}, Failure Reasons: {})", + tableKey, tableStatus, successfulRecords, failedRecords, totalRecords, + tableFailureReasons.isEmpty() ? "None" : tableFailureReasons); + + } else { + logger.info("No data to sync for schema {} and table {}", obj.getSchemaName(), obj.getTableName()); + + Map tableDetails = new HashMap<>(); + tableDetails.put("tableName", obj.getTableName()); + tableDetails.put("schemaName", obj.getSchemaName()); + tableDetails.put("status", "no_data"); + tableDetails.put("totalRecords", 0); + tableDetails.put("successfulRecords", 0); + tableDetails.put("failedRecords", 0); + tableDetailsList.add(tableDetails); + } + + // If this table had critical failures, stop processing this group + if (tableHasError) { + hasSyncFailed = true; + break; + } +} + // Determine overall group status + String groupStatus; + long successTables = tableDetailsList.stream() + .filter(table -> "success".equals(table.get("status")) || "no_data".equals(table.get("status"))) + .count(); + long partialTables = tableDetailsList.stream() + .filter(table -> "partial".equals(table.get("status"))) + .count(); + long failedTables = tableDetailsList.stream() + .filter(table -> "failed".equals(table.get("status"))) + .count(); + + if (failedTables == 0 && partialTables == 0) { + groupStatus = "completed"; + } else if (failedTables > 0 && successTables == 0 && partialTables == 0) { + groupStatus = "failed"; + } else { + groupStatus = "partial"; + } - if (hasSyncFailed) { - // Mark all subsequent groups as "pending" - for (DataSyncGroups remainingGroup : dataSyncGroupList - .subList(dataSyncGroupList.indexOf(dataSyncGroups) + 1, dataSyncGroupList.size())) { - Map pendingGroupIdStatus = new HashMap<>(); - pendingGroupIdStatus.put("groupId", String.valueOf(remainingGroup.getSyncTableGroupID())); - pendingGroupIdStatus.put("status", "pending"); - responseStatus.add(pendingGroupIdStatus); - } - break; + // Create group response + Map groupResponse = new HashMap<>(); + groupResponse.put("syncTableGroupID", groupId); + groupResponse.put("syncTableGroupName", groupName != null ? groupName : "Group " + groupId); + groupResponse.put("status", groupStatus); + groupResponse.put("tables", tableDetailsList); + groupResponse.put("summary", Map.of( + "totalTables", tableDetailsList.size(), + "successfulTables", successTables, + "partialTables", partialTables, + "failedTables", failedTables)); + + responseStatus.add(groupResponse); + + if (hasSyncFailed) { + // Mark all subsequent groups as "pending" + for (int j = dataSyncGroupList.indexOf(dataSyncGroups) + 1; j < dataSyncGroupList.size(); j++) { + DataSyncGroups remainingGroup = dataSyncGroupList.get(j); + Map pendingGroupResponse = new HashMap<>(); + pendingGroupResponse.put("syncTableGroupID", remainingGroup.getSyncTableGroupID()); + pendingGroupResponse.put("syncTableGroupName", + remainingGroup.getSyncTableGroupName() != null ? remainingGroup.getSyncTableGroupName() + : "Group " + remainingGroup.getSyncTableGroupID()); + pendingGroupResponse.put("status", "pending"); + pendingGroupResponse.put("tables", new ArrayList<>()); + pendingGroupResponse.put("summary", Map.of( + "totalTables", 0, + "successfulTables", 0L, + "partialTables", 0L, + "failedTables", 0L)); + responseStatus.add(pendingGroupResponse); } + break; } } + // Create final response + Map finalResponse = new HashMap<>(); if (hasSyncFailed) { - Map response = new HashMap<>(); - response.put("response", "Data sync failed"); - response.put("groupsProgress", responseStatus); - objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(response); + finalResponse.put("response", "Data sync failed"); + finalResponse.put("groupsProgress", responseStatus); return objectMapper.writerWithDefaultPrettyPrinter() - .writeValueAsString(Collections.singletonMap("data", response)); + .writeValueAsString(finalResponse); } else { - if ("No data to sync".equals(serverAcknowledgement)) { - return serverAcknowledgement; + // Check if there was any data to sync + boolean hasData = responseStatus.stream() + .anyMatch(group -> { + @SuppressWarnings("unchecked") + List> tables = (List>) ((Map) group) + .get("tables"); + return tables.stream().anyMatch(table -> !("no_data".equals(table.get("status")))); + }); + + if (!hasData) { + return "No data to sync"; } else { - return "Data successfully synced"; + finalResponse.put("response", "Data sync completed"); + finalResponse.put("groupsProgress", responseStatus); + return objectMapper.writerWithDefaultPrettyPrinter() + .writeValueAsString(finalResponse); } } } - private void setResponseStatus(Map groupIdStatus, int groupId, String serverAcknowledgement, - List> responseStatus) { - groupIdStatus.put("groupId", String.valueOf(groupId)); - groupIdStatus.put("status", serverAcknowledgement); - responseStatus.add(groupIdStatus); - } - - /** - * - * @param syncTableDetailsIDs - * @return - */ - private List getVanAndServerColumns(Integer groupID) throws Exception { List syncUtilityClassList = getVanAndServerColumnList(groupID); logger.debug("Fetched SyncUtilityClass list for groupID {}: {}", groupID, syncUtilityClassList); - return syncUtilityClassList; } @@ -265,23 +392,13 @@ public List getVanAndServerColumnList(Integer groupID) throws return syncUtilityClassList; } - /** - * - * @param schemaName - * @param tableName - * @param columnNames - * @return - */ - private List> getDataToSync(String schemaName, String tableName, String columnNames) throws Exception { - logger.info("Fetching data to sync for schema: {}, table: {}, columns: {}", schemaName, tableName, columnNames); + logger.info("Fetching data to sync for schema: {}, table: {}, columns: {}", schemaName, tableName, columnNames); List> resultSetList = dataSyncRepository.getDataForGivenSchemaAndTable(schemaName, tableName, columnNames); if (resultSetList != null) { logger.debug("Fetched {} records for schema '{}', table '{}'", resultSetList.size(), schemaName, tableName); - // Optionally log a sample of the resultSetList for verification (be careful - // with large datasets) if (!resultSetList.isEmpty()) { logger.debug("Sample record: {}", resultSetList.get(0)); } @@ -291,82 +408,121 @@ private List> getDataToSync(String schemaName, String tableN return resultSetList; } - /** - * - * @param syncData - * @param startIndex - * @param size - * @return - */ - private List> getBatchOfAskedSizeDataToSync(List> syncData, int startIndex, int size) throws Exception { List> syncDataOfBatchSize = syncData.subList(startIndex, (startIndex + size)); return syncDataOfBatchSize; } - /** - * - * @param schemaName - * @param tableName - * @param vanAutoIncColumnName - * @param serverColumns - * @param dataToBesync - * @param Authorization - * @return - */ - - public String syncDataToServer(int vanID, String schemaName, String tableName, String vanAutoIncColumnName, - String serverColumns, List> dataToBesync, String user, String Authorization, - String token) - throws Exception { - - RestTemplate restTemplate = new RestTemplate(); - - Integer facilityID = masterVanRepo.getFacilityID(vanID); - - // serialize null - GsonBuilder gsonBuilder = new GsonBuilder(); - gsonBuilder.serializeNulls(); - Gson gson = gsonBuilder.create(); - - Map dataMap = new HashMap<>(); - dataMap.put("schemaName", schemaName); - dataMap.put("tableName", tableName); - dataMap.put("vanAutoIncColumnName", vanAutoIncColumnName); - dataMap.put("serverColumns", serverColumns); - dataMap.put("syncData", dataToBesync); - dataMap.put("syncedBy", user); - if (facilityID != null) - dataMap.put("facilityID", facilityID); - - String requestOBJ = gson.toJson(dataMap); - HttpEntity request = RestTemplateUtil.createRequestEntity(requestOBJ, Authorization, "datasync"); - ResponseEntity response = restTemplate.exchange(dataSyncUploadUrl, HttpMethod.POST, request, - String.class); - - int i = 0; - if (response != null && response.hasBody()) { - JSONObject obj = new JSONObject(response.getBody()); - if (obj != null && obj.has("statusCode") && obj.getInt("statusCode") == 200) { - StringBuilder vanSerialNos = getVanSerialNoListForSyncedData(vanAutoIncColumnName, dataToBesync); - - i = dataSyncRepository.updateProcessedFlagInVan(schemaName, tableName, vanSerialNos, - vanAutoIncColumnName, user); + public Map syncDataToServer(int vanID, String schemaName, String tableName, String vanAutoIncColumnName, + String serverColumns, List> dataToBesync, String user, String Authorization, + String token) throws Exception { + + RestTemplate restTemplate = new RestTemplate(); + Integer facilityID = masterVanRepo.getFacilityID(vanID); + + // serialize null + GsonBuilder gsonBuilder = new GsonBuilder(); + gsonBuilder.serializeNulls(); + Gson gson = gsonBuilder.create(); + + Map dataMap = new HashMap<>(); + dataMap.put("schemaName", schemaName); + dataMap.put("tableName", tableName); + dataMap.put("vanAutoIncColumnName", vanAutoIncColumnName); + dataMap.put("serverColumns", serverColumns); + dataMap.put("syncData", dataToBesync); + dataMap.put("syncedBy", user); + if (facilityID != null) + dataMap.put("facilityID", facilityID); + + String requestOBJ = gson.toJson(dataMap); + HttpEntity request = RestTemplateUtil.createRequestEntity(requestOBJ, Authorization, "datasync"); + ResponseEntity response = restTemplate.exchange(dataSyncUploadUrl, HttpMethod.POST, request, + String.class); + + logger.info("Response from the server=" + response); + + int successCount = 0; + int failCount = 0; + List successVanSerialNos = new ArrayList<>(); + List failedVanSerialNos = new ArrayList<>(); + List failureReasons = new ArrayList<>(); + + if (response != null && response.hasBody()) { + JSONObject obj = new JSONObject(response.getBody()); + if (obj.has("data")) { + JSONObject dataObj = obj.getJSONObject("data"); + if (dataObj.has("records")) { + JSONArray recordsArr = dataObj.getJSONArray("records"); + for (int i = 0; i < recordsArr.length(); i++) { + JSONObject record = recordsArr.getJSONObject(i); + String vanSerialNo = record.getString("vanSerialNo"); + boolean success = record.getBoolean("success"); + if (success) { + successVanSerialNos.add(vanSerialNo); + successCount++; + } else { + failedVanSerialNos.add(vanSerialNo); + failCount++; + // Capture the failure reason + String reason = record.optString("reason", "Unknown error"); + failureReasons.add(reason); + } + } + } else if (tableName.equalsIgnoreCase("m_beneficiaryregidmapping")) { + // Handle summary response for m_beneficiaryregidmapping + String respMsg = dataObj.optString("response", ""); + int statusCode = obj.optInt("statusCode", 0); + if (respMsg.toLowerCase().contains("success") && statusCode == 200) { + // All records are successful + for (Map map : dataToBesync) { + successVanSerialNos.add(String.valueOf(map.get(vanAutoIncColumnName))); + } + successCount = successVanSerialNos.size(); + } else { + // All records failed + for (Map map : dataToBesync) { + failedVanSerialNos.add(String.valueOf(map.get(vanAutoIncColumnName))); + } + failCount = failedVanSerialNos.size(); + // Add a generic reason for all failed records + for (int i = 0; i < failCount; i++) { + failureReasons.add(respMsg.isEmpty() ? "Sync failed" : respMsg); + } + } } } - if (i > 0) - return "Data successfully synced"; - else - return null; } - /** - * - * @param vanAutoIncColumnName - * @param dataToBesync - * @return - */ + logger.info("Success Van Serial No=" + successVanSerialNos.toString()); + logger.info("Failed Van Serial No=" + failedVanSerialNos.toString()); + + // Update processed flag for success and failed vanSerialNos + if (!successVanSerialNos.isEmpty()) { + dataSyncRepository.updateProcessedFlagInVan(schemaName, tableName, successVanSerialNos, + vanAutoIncColumnName, user, "P","Null"); + } + if (!failedVanSerialNos.isEmpty()) { + dataSyncRepository.updateProcessedFlagInVan(schemaName, tableName, failedVanSerialNos, + vanAutoIncColumnName, user, "F",failureReasons.get(0)); + } + + // Return detailed result object instead of just a string + Map result = new HashMap<>(); + if (successCount > 0 && failCount == 0) { + result.put("status", "Data successfully synced"); + } else if (successCount > 0 && failCount > 0) { + result.put("status", "Partial success: " + successCount + " records synced, " + failCount + " failed"); + } else { + result.put("status", "Sync failed"); + } + + result.put("successCount", successCount); + result.put("failCount", failCount); + + return result; +} public StringBuilder getVanSerialNoListForSyncedData(String vanAutoIncColumnName, List> dataToBesync) throws Exception { @@ -392,5 +548,4 @@ public String getDataSyncGroupDetails() { else return null; } - -} +} \ No newline at end of file diff --git a/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java b/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java index fcc68fd3..e338ba17 100644 --- a/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java +++ b/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java @@ -21,6 +21,7 @@ */ package com.iemr.mmu.service.dataSyncLayerCentral; +import java.sql.SQLException; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Arrays; @@ -35,6 +36,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.iemr.mmu.data.syncActivity_syncLayer.SyncUploadDataDigester; +import com.iemr.mmu.service.dataSyncActivity.SyncResult; @Service public class GetDataFromVanAndSyncToDBImpl implements GetDataFromVanAndSyncToDB { @@ -95,25 +97,24 @@ public String syncDataToServer(String requestOBJ, String Authorization) throws E ObjectMapper mapper = new ObjectMapper(); SyncUploadDataDigester syncUploadDataDigester = mapper.readValue(requestOBJ, SyncUploadDataDigester.class); List> dataToBesync = syncUploadDataDigester.getSyncData(); - logger.info("Data to be synced: {}", dataToBesync); + List syncResults = new ArrayList<>(); // <-- define here + if (syncUploadDataDigester == null || syncUploadDataDigester.getTableName() == null) { logger.error("Invalid SyncUploadDataDigester object or tableName is null."); return "Error: Invalid sync request."; } String syncTableName = syncUploadDataDigester.getTableName(); - logger.info("Syncing data for table: {}", syncTableName); // Handle specific tables first, if their logic is distinct if ("m_beneficiaryregidmapping".equalsIgnoreCase(syncTableName)) { - String result = update_M_BeneficiaryRegIdMapping_for_provisioned_benID(syncUploadDataDigester); + String result = update_M_BeneficiaryRegIdMapping_for_provisioned_benID(syncUploadDataDigester, syncResults); if ("data sync passed".equals(result)) { return "Sync successful for m_beneficiaryregidmapping."; } else { logger.error("Sync failed for m_beneficiaryregidmapping: {}", result); return "Sync failed for m_beneficiaryregidmapping."; } - } - else { + } else { boolean syncSuccess = true; String errorMessage = ""; if (syncTableName != null && !syncTableName.isEmpty()) { @@ -123,7 +124,7 @@ public String syncDataToServer(String requestOBJ, String Authorization) throws E if (map.get("tableName") != null && map.get("tableName").toString().equalsIgnoreCase(syncTableName)) { syncSuccess = syncTablesInGroup(syncUploadDataDigester.getSchemaName(), syncTableName, - syncUploadDataDigester); + syncUploadDataDigester, syncResults); foundInGroup = true; break; } @@ -131,7 +132,7 @@ public String syncDataToServer(String requestOBJ, String Authorization) throws E if (!foundInGroup) { logger.warn("Table '{}' not found in any predefined groups. Proceeding with generic sync logic.", syncTableName); - syncSuccess = performGenericTableSync(syncUploadDataDigester); + syncSuccess = performGenericTableSync(syncUploadDataDigester, syncResults); } } else { @@ -142,7 +143,7 @@ public String syncDataToServer(String requestOBJ, String Authorization) throws E try { boolean currentTableSyncResult = syncTablesInGroup(syncUploadDataDigester.getSchemaName(), - table, syncUploadDataDigester); + table, syncUploadDataDigester, syncResults); if (!currentTableSyncResult) { syncSuccess = false; errorMessage += "Failed to sync table: " + table + " in Group " + groupId + ". "; @@ -163,16 +164,19 @@ public String syncDataToServer(String requestOBJ, String Authorization) throws E } } - if (syncSuccess) { - return "Overall data sync passed."; - } else { - return "Overall data sync failed. Details: " + errorMessage; - } + Map responseMap = new HashMap<>(); + responseMap.put("statusCode", 200); + responseMap.put("message", "Data sync completed"); + responseMap.put("records", syncResults); + logger.info("Response = " + responseMap); + logger.info("Sync Results = " + syncResults); + return new ObjectMapper().writeValueAsString(responseMap); + } } private boolean syncTablesInGroup(String schemaName, String currentTableName, - SyncUploadDataDigester originalDigester) { + SyncUploadDataDigester originalDigester, List syncResults) { SyncUploadDataDigester tableSpecificDigester = new SyncUploadDataDigester(); tableSpecificDigester.setSchemaName(schemaName); tableSpecificDigester.setTableName(currentTableName); @@ -181,11 +185,11 @@ private boolean syncTablesInGroup(String schemaName, String currentTableName, tableSpecificDigester.setVanAutoIncColumnName(originalDigester.getVanAutoIncColumnName()); tableSpecificDigester.setServerColumns(originalDigester.getServerColumns()); tableSpecificDigester.setSyncData(originalDigester.getSyncData()); - return performGenericTableSync(tableSpecificDigester); + return performGenericTableSync(tableSpecificDigester, syncResults); } private String update_M_BeneficiaryRegIdMapping_for_provisioned_benID( - SyncUploadDataDigester syncUploadDataDigester) { + SyncUploadDataDigester syncUploadDataDigester, List syncResults) { List> dataToBesync = syncUploadDataDigester.getSyncData(); List syncData = new ArrayList<>(); @@ -297,219 +301,389 @@ private String getQueryFor_I_BeneficiaryDetails(String schemaName, String tableN return queryBuilder.toString(); } - /** - * Handles the generic synchronization logic for tables not covered by specific - * handlers. - */ + private boolean performGenericTableSync(SyncUploadDataDigester syncUploadDataDigester, + List syncResults) { + List> dataToBesync = syncUploadDataDigester.getSyncData(); + List syncDataListInsert = new ArrayList<>(); + List syncDataListUpdate = new ArrayList<>(); - private boolean performGenericTableSync(SyncUploadDataDigester syncUploadDataDigester) { - List> dataToBesync = syncUploadDataDigester.getSyncData(); - List syncDataListInsert = new ArrayList<>(); - List syncDataListUpdate = new ArrayList<>(); + // Track indices for insert and update operations + Map insertIndexMap = new HashMap<>(); // syncResults index -> insert list index + Map updateIndexMap = new HashMap<>(); // syncResults index -> update list index - if (dataToBesync == null || dataToBesync.isEmpty()) { - logger.info("No data to sync for table: {}", syncUploadDataDigester.getTableName()); - return true; // Nothing to sync, consider it a success - } + boolean overallSuccess = true; - String syncTableName = syncUploadDataDigester.getTableName(); - String vanAutoIncColumnName = syncUploadDataDigester.getVanAutoIncColumnName(); - String schemaName = syncUploadDataDigester.getSchemaName(); - Integer facilityIDFromDigester = syncUploadDataDigester.getFacilityID(); - String serverColumns = syncUploadDataDigester.getServerColumns(); - - List serverColumnsList = Arrays.asList(serverColumns.split(",")); - - for (Map map : dataToBesync) { - // Create a new map with clean column names as keys - Map cleanRecord = new HashMap<>(); - for (String key : map.keySet()) { - String cleanKey = key; - // Handle keys with SQL functions like date_format - if (key.startsWith("date_format(") && key.endsWith(")")) { - int start = key.indexOf("(") + 1; - int end = key.indexOf(","); - if (end > start) { - cleanKey = key.substring(start, end).trim(); - } else { - // Fallback if format is unexpected - cleanKey = key.substring(start, key.indexOf(")")).trim(); + if (dataToBesync == null || dataToBesync.isEmpty()) { + logger.info("No data to sync for table: {}", syncUploadDataDigester.getTableName()); + return true; + } + + String syncTableName = syncUploadDataDigester.getTableName(); + String vanAutoIncColumnName = syncUploadDataDigester.getVanAutoIncColumnName(); + String schemaName = syncUploadDataDigester.getSchemaName(); + Integer facilityIDFromDigester = syncUploadDataDigester.getFacilityID(); + String serverColumns = syncUploadDataDigester.getServerColumns(); + + int vanSerialIndex = Arrays.asList(serverColumns.split(",")).indexOf(vanAutoIncColumnName); + List serverColumnsList = Arrays.asList(serverColumns.split(",")); + + for (Map map : dataToBesync) { + // Create a new map with clean column names as keys + Map cleanRecord = new HashMap<>(); + for (String key : map.keySet()) { + String cleanKey = key; + // Handle keys with SQL functions like date_format + if (key.startsWith("date_format(") && key.endsWith(")")) { + int start = key.indexOf("(") + 1; + int end = key.indexOf(","); + if (end > start) { + cleanKey = key.substring(start, end).trim(); + } else { + cleanKey = key.substring(start, key.indexOf(")")).trim(); + } } + cleanRecord.put(cleanKey.trim(), map.get(key)); } - cleanRecord.put(cleanKey.trim(), map.get(key)); - } - String vanSerialNo = String.valueOf(cleanRecord.get(vanAutoIncColumnName)); - String vanID = String.valueOf(cleanRecord.get("VanID")); - int syncFacilityID = 0; - - // Update SyncedBy and SyncedDate in the xmap itself before processing - cleanRecord.put("SyncedBy", syncUploadDataDigester.getSyncedBy()); - cleanRecord.put("SyncedDate", String.valueOf(LocalDateTime.now())); - - if (facilityIDFromDigester != null) { - // Determine the 'Processed' status based on facility ID for specific tables - switch (syncTableName.toLowerCase()) { - case "t_indent": - case "t_indentorder": { - if (cleanRecord.containsKey("FromFacilityID") && cleanRecord.get("FromFacilityID") instanceof Number) { - Number fromFacilityID = (Number) cleanRecord.get("FromFacilityID"); - if (fromFacilityID.intValue() == facilityIDFromDigester) { - cleanRecord.put("Processed", "P"); + String vanSerialNo = String.valueOf(cleanRecord.get(vanAutoIncColumnName)); + String vanID = String.valueOf(cleanRecord.get("VanID")); + int syncFacilityID = 0; + + // Update SyncedBy and SyncedDate in the cleanRecord + cleanRecord.put("SyncedBy", syncUploadDataDigester.getSyncedBy()); + cleanRecord.put("SyncedDate", String.valueOf(LocalDateTime.now())); + + if (facilityIDFromDigester != null) { + // Determine the 'Processed' status based on facility ID for specific tables + switch (syncTableName.toLowerCase()) { + case "t_indent": + case "t_indentorder": { + if (cleanRecord.containsKey("FromFacilityID") + && cleanRecord.get("FromFacilityID") instanceof Number) { + Number fromFacilityID = (Number) cleanRecord.get("FromFacilityID"); + if (fromFacilityID.intValue() == facilityIDFromDigester) { + cleanRecord.put("Processed", "P"); + } } + break; } - break; - } - case "t_indentissue": { - if (cleanRecord.containsKey("ToFacilityID") && cleanRecord.get("ToFacilityID") instanceof Number) { - Number toFacilityID = (Number) cleanRecord.get("ToFacilityID"); - if (toFacilityID.intValue() == facilityIDFromDigester) { - cleanRecord.put("Processed", "P"); + case "t_indentissue": { + if (cleanRecord.containsKey("ToFacilityID") + && cleanRecord.get("ToFacilityID") instanceof Number) { + Number toFacilityID = (Number) cleanRecord.get("ToFacilityID"); + if (toFacilityID.intValue() == facilityIDFromDigester) { + cleanRecord.put("Processed", "P"); + } } + break; } - break; - } - case "t_stocktransfer": { - if (cleanRecord.containsKey("TransferToFacilityID") - && cleanRecord.get("TransferToFacilityID") instanceof Number) { - Number transferToFacilityID = (Number) cleanRecord.get("TransferToFacilityID"); - if (transferToFacilityID.intValue() == facilityIDFromDigester) { - cleanRecord.put("Processed", "P"); + case "t_stocktransfer": { + if (cleanRecord.containsKey("TransferToFacilityID") + && cleanRecord.get("TransferToFacilityID") instanceof Number) { + Number transferToFacilityID = (Number) cleanRecord.get("TransferToFacilityID"); + if (transferToFacilityID.intValue() == facilityIDFromDigester) { + cleanRecord.put("Processed", "P"); + } } + break; } - break; - } - case "t_itemstockentry": { - if (cleanRecord.containsKey("FacilityID") && cleanRecord.get("FacilityID") instanceof Number) { - Number mapFacilityID = (Number) cleanRecord.get("FacilityID"); - if (mapFacilityID.intValue() == facilityIDFromDigester) { - cleanRecord.put("Processed", "P"); + case "t_itemstockentry": { + if (cleanRecord.containsKey("FacilityID") && cleanRecord.get("FacilityID") instanceof Number) { + Number mapFacilityID = (Number) cleanRecord.get("FacilityID"); + if (mapFacilityID.intValue() == facilityIDFromDigester) { + cleanRecord.put("Processed", "P"); + } } + break; } - break; + default: + break; } - default: - // No specific facility ID logic for other tables - break; } - } - // Extract SyncFacilityID for checkRecordIsAlreadyPresentOrNot - if (cleanRecord.containsKey("SyncFacilityID") && cleanRecord.get("SyncFacilityID") instanceof Number) { - syncFacilityID = ((Number) cleanRecord.get("SyncFacilityID")).intValue(); - } + // Extract SyncFacilityID for checkRecordIsAlreadyPresentOrNot + if (cleanRecord.containsKey("SyncFacilityID") && cleanRecord.get("SyncFacilityID") instanceof Number) { + syncFacilityID = ((Number) cleanRecord.get("SyncFacilityID")).intValue(); + } - int recordCheck; - try { - recordCheck = dataSyncRepositoryCentral.checkRecordIsAlreadyPresentOrNot( - schemaName, syncTableName, vanSerialNo, vanID, vanAutoIncColumnName, syncFacilityID); - } catch (Exception e) { - logger.error("Error checking record existence for table {}: VanSerialNo={}, VanID={}. Error: {}", - syncTableName, vanSerialNo, vanID, e.getMessage(), e); - return false; // Critical error, stop sync for this table - } + int recordCheck; + try { + recordCheck = dataSyncRepositoryCentral.checkRecordIsAlreadyPresentOrNot( + schemaName, syncTableName, vanSerialNo, vanID, vanAutoIncColumnName, syncFacilityID); + logger.info("Record check result: {}", recordCheck); + } catch (Exception e) { + logger.error("Error checking record existence for table {}: VanSerialNo={}, VanID={}. Error: {}", + syncTableName, vanSerialNo, vanID, e.getMessage(), e); - // Prepare Object array for insert/update - List currentRecordValues = new ArrayList<>(); - for (String column : serverColumnsList) { - Object value = cleanRecord.get(column.trim()); - if (value instanceof Boolean) { - currentRecordValues.add(value); - } else if (value != null) { - currentRecordValues.add(String.valueOf(value)); - } else { - currentRecordValues.add(null); + // Store the main error reason from record check failure + String mainErrorReason = "Record check failed: " + extractMainErrorReason(e); + + syncResults.add(new SyncResult(schemaName, syncTableName, vanSerialNo, + syncUploadDataDigester.getSyncedBy(), false, mainErrorReason)); + continue; // Skip to next record } - } - Object[] objArr = currentRecordValues.toArray(); - if (recordCheck == 0) { - syncDataListInsert.add(objArr); - } else { - // For update, append the WHERE clause parameters at the end of the array - List updateParams = new ArrayList<>(Arrays.asList(objArr)); - updateParams.add(String.valueOf(vanSerialNo)); - - if (Arrays.asList("t_patientissue", "t_physicalstockentry", "t_stockadjustment", "t_saitemmapping", - "t_stocktransfer", "t_patientreturn", "t_facilityconsumption", "t_indent", - "t_indentorder", "t_indentissue", "t_itemstockentry", "t_itemstockexit") - .contains(syncTableName.toLowerCase()) && cleanRecord.containsKey("SyncFacilityID")) { - updateParams.add(String.valueOf(cleanRecord.get("SyncFacilityID"))); + // Prepare Object array for insert/update + List currentRecordValues = new ArrayList<>(); + for (String column : serverColumnsList) { + Object value = cleanRecord.get(column.trim()); + if (value instanceof Boolean) { + currentRecordValues.add(value); + } else if (value != null) { + currentRecordValues.add(String.valueOf(value)); + } else { + currentRecordValues.add(null); + } + } + + Object[] objArr = currentRecordValues.toArray(); + + // Add to syncResults first, then track the index + int currentSyncResultIndex = syncResults.size(); + syncResults.add(new SyncResult(schemaName, syncTableName, vanSerialNo, + syncUploadDataDigester.getSyncedBy(), true, null)); // Initially set as success + + if (recordCheck == 0) { + // Record doesn't exist - INSERT + insertIndexMap.put(currentSyncResultIndex, syncDataListInsert.size()); + syncDataListInsert.add(objArr); } else { - updateParams.add(String.valueOf(vanID)); + // Record exists - UPDATE + List updateParams = new ArrayList<>(Arrays.asList(objArr)); + updateParams.add(String.valueOf(vanSerialNo)); + + if (Arrays.asList("t_patientissue", "t_physicalstockentry", "t_stockadjustment", "t_saitemmapping", + "t_stocktransfer", "t_patientreturn", "t_facilityconsumption", "t_indent", + "t_indentorder", "t_indentissue", "t_itemstockentry", "t_itemstockexit") + .contains(syncTableName.toLowerCase()) && cleanRecord.containsKey("SyncFacilityID")) { + updateParams.add(String.valueOf(cleanRecord.get("SyncFacilityID"))); + } else { + updateParams.add(String.valueOf(vanID)); + } + + updateIndexMap.put(currentSyncResultIndex, syncDataListUpdate.size()); + syncDataListUpdate.add(updateParams.toArray()); } - syncDataListUpdate.add(updateParams.toArray()); } - } - boolean insertSuccess = true; - boolean updateSuccess = true; + boolean insertSuccess = true; + boolean updateSuccess = true; + + // Process INSERT operations + if (!syncDataListInsert.isEmpty()) { + String queryInsert = getQueryToInsertDataToServerDB(schemaName, syncTableName, serverColumns); - if (!syncDataListInsert.isEmpty()) { - String queryInsert = getQueryToInsertDataToServerDB(schemaName, syncTableName, serverColumns); + try { + int[] insertResults = dataSyncRepositoryCentral.syncDataToCentralDB(schemaName, syncTableName, + serverColumns, queryInsert, syncDataListInsert); + + // Update syncResults based on insert results + for (Map.Entry entry : insertIndexMap.entrySet()) { + int syncResultIndex = entry.getKey(); + int insertListIndex = entry.getValue(); + + if (insertListIndex < insertResults.length && insertResults[insertListIndex] > 0) { + // Success - keep the existing success entry + logger.info("Successfully inserted record at index {}", insertListIndex); + } else { + // Failed - update the syncResults entry with concise reason + String vanSerialNo = String.valueOf(syncDataListInsert.get(insertListIndex)[vanSerialIndex]); + String conciseReason = "Insert failed (code: " + + (insertListIndex < insertResults.length ? insertResults[insertListIndex] : "unknown") + + ")"; + + syncResults.set(syncResultIndex, new SyncResult(schemaName, syncTableName, vanSerialNo, + syncUploadDataDigester.getSyncedBy(), false, conciseReason)); + insertSuccess = false; + } + } - try { - int[] i = dataSyncRepositoryCentral.syncDataToCentralDB(schemaName, syncTableName, - serverColumns, queryInsert, syncDataListInsert); - if (i.length != syncDataListInsert.size()) { + } catch (Exception e) { insertSuccess = false; - logger.error("Partial insert for table {}. Expected {} inserts, got {}. Failed records: {}", - syncTableName, syncDataListInsert.size(), i.length, - getFailedRecords(i, syncDataListInsert)); - } else { - logger.info("Successfully inserted {} records into table {}.", i.length, syncTableName); + logger.error("Exception during insert for table {}: {}", syncTableName, e.getMessage(), e); + + // Store the main error reason instead of complete exception message + String mainErrorReason = extractMainErrorReason(e); + + // Update all insert-related syncResults to failed with concise error message + for (Map.Entry entry : insertIndexMap.entrySet()) { + int syncResultIndex = entry.getKey(); + int insertListIndex = entry.getValue(); + String vanSerialNo = String.valueOf(syncDataListInsert.get(insertListIndex)[vanSerialIndex]); + + syncResults.set(syncResultIndex, new SyncResult(schemaName, syncTableName, vanSerialNo, + syncUploadDataDigester.getSyncedBy(), false, "INSERT: " + mainErrorReason)); + } } - } catch (Exception e) { - insertSuccess = false; - logger.error("Exception during insert for table {}: {}", syncTableName, e.getMessage(), e); } - } - if (!syncDataListUpdate.isEmpty()) { - String queryUpdate = getQueryToUpdateDataToServerDB(schemaName, serverColumns, syncTableName); - try { - int[] j = dataSyncRepositoryCentral.syncDataToCentralDB(schemaName, syncTableName, - SERVER_COLUMNS_NOT_REQUIRED, queryUpdate, syncDataListUpdate); - if (j.length != syncDataListUpdate.size()) { + // Process UPDATE operations + if (!syncDataListUpdate.isEmpty()) { + String queryUpdate = getQueryToUpdateDataToServerDB(schemaName, serverColumns, syncTableName); + + try { + int[] updateResults = dataSyncRepositoryCentral.syncDataToCentralDB(schemaName, syncTableName, + serverColumns, queryUpdate, syncDataListUpdate); + + // Update syncResults based on update results + for (Map.Entry entry : updateIndexMap.entrySet()) { + int syncResultIndex = entry.getKey(); + int updateListIndex = entry.getValue(); + + if (updateListIndex < updateResults.length && updateResults[updateListIndex] > 0) { + // Success - keep the existing success entry + logger.info("Successfully updated record at index {}", updateListIndex); + } else { + // Failed - update the syncResults entry with concise reason + String vanSerialNo = String.valueOf(syncDataListUpdate.get(updateListIndex)[vanSerialIndex]); + String conciseReason = "Update failed (code: " + + (updateListIndex < updateResults.length ? updateResults[updateListIndex] : "unknown") + + ")"; + + syncResults.set(syncResultIndex, new SyncResult(schemaName, syncTableName, vanSerialNo, + syncUploadDataDigester.getSyncedBy(), false, conciseReason)); + updateSuccess = false; + } + } + + } catch (Exception e) { updateSuccess = false; - logger.error("Partial update for table {}. Expected {} updates, got {}. Failed records: {}", - syncTableName, syncDataListUpdate.size(), j.length, - getFailedRecords(j, syncDataListUpdate)); - } else { - logger.info("Successfully updated {} records in table {}.", j.length, syncTableName); + logger.error("Exception during update for table {}: {}", syncTableName, e.getMessage(), e); + + // Store the main error reason instead of complete exception message + String mainErrorReason = extractMainErrorReason(e); + + // Update all update-related syncResults to failed with concise error message + for (Map.Entry entry : updateIndexMap.entrySet()) { + int syncResultIndex = entry.getKey(); + int updateListIndex = entry.getValue(); + String vanSerialNo = String.valueOf(syncDataListUpdate.get(updateListIndex)[vanSerialIndex]); + + syncResults.set(syncResultIndex, new SyncResult(schemaName, syncTableName, vanSerialNo, + syncUploadDataDigester.getSyncedBy(), false, "UPDATE: " + mainErrorReason)); + } } - } catch (Exception e) { - updateSuccess = false; - logger.error("Exception during update for table {}: {}", syncTableName, e.getMessage(), e); } + + logger.info("Sync results for table {}: {}", syncTableName, syncResults); + return insertSuccess && updateSuccess; } - return insertSuccess && updateSuccess; -} - private String getQueryToInsertDataToServerDB(String schemaName, String - tableName, String serverColumns) { - String[] columnsArr = null; - if (serverColumns != null) - columnsArr = serverColumns.split(","); - - StringBuilder preparedStatementSetter = new StringBuilder(); - - if (columnsArr != null && columnsArr.length > 0) { - for (int i = 0; i < columnsArr.length; i++) { - preparedStatementSetter.append("?"); - if (i < columnsArr.length - 1) { - preparedStatementSetter.append(", "); - } - } + + // Helper method to extract concise but meaningful error message + private String extractMainErrorReason(Exception e) { + if (e == null) { + return "Unknown error"; + } + + String message = e.getMessage(); + if (message == null || message.trim().isEmpty()) { + return e.getClass().getSimpleName(); + } + + // Extract key information based on common error patterns + message = message.trim(); + + // Handle SQL constraint violations - extract the key constraint info + if (message.contains("Duplicate entry") && message.contains("for key")) { + // Extract: "Duplicate entry 'value' for key 'constraint_name'" + int keyStart = message.indexOf("for key '") + 9; + int keyEnd = message.indexOf("'", keyStart); + if (keyStart > 8 && keyEnd > keyStart) { + return "Duplicate key: " + message.substring(keyStart, keyEnd); + } + return "Duplicate entry error"; + } + + // Handle column cannot be null + if (message.contains("cannot be null")) { + int colStart = message.indexOf("Column '") + 8; + int colEnd = message.indexOf("'", colStart); + if (colStart > 7 && colEnd > colStart) { + return "Required field: " + message.substring(colStart, colEnd); + } + return "Required field missing"; + } + + // Handle data too long errors + if (message.contains("Data too long for column")) { + int colStart = message.indexOf("column '") + 8; + int colEnd = message.indexOf("'", colStart); + if (colStart > 7 && colEnd > colStart) { + return "Data too long: " + message.substring(colStart, colEnd); + } + return "Data length exceeded"; + } + + // Handle foreign key constraint violations + if (message.contains("foreign key constraint")) { + if (message.contains("CONSTRAINT `")) { + int constStart = message.indexOf("CONSTRAINT `") + 12; + int constEnd = message.indexOf("`", constStart); + if (constStart > 11 && constEnd > constStart) { + return "FK violation: " + message.substring(constStart, constEnd); + } + } + return "Foreign key constraint failed"; + } + + // Handle connection/timeout issues + if (message.toLowerCase().contains("timeout")) { + return "Database connection timeout"; + } + + if (message.toLowerCase().contains("connection")) { + return "Database connection failed"; + } + + // Handle table/schema issues + if (message.contains("doesn't exist")) { + return "Table/schema not found"; + } + + // For other cases, try to get the first meaningful part of the message + // Split by common delimiters and take the first substantial part + String[] parts = message.split("[;:|]"); + for (String part : parts) { + part = part.trim(); + if (part.length() > 10 && part.length() <= 100) { // Reasonable length + return part; + } + } + + // If message is short enough, return it as is + if (message.length() <= 150) { + return message; + } + + // Otherwise, truncate to first 150 characters + return message.substring(0, 150) + "..."; } - StringBuilder queryBuilder = new StringBuilder("INSERT INTO "); - queryBuilder.append(schemaName).append(".").append(tableName); - queryBuilder.append("("); - queryBuilder.append(serverColumns); - queryBuilder.append(") VALUES ("); - queryBuilder.append(preparedStatementSetter); - queryBuilder.append(")"); - return queryBuilder.toString(); + private String getQueryToInsertDataToServerDB(String schemaName, String tableName, String serverColumns) { + String[] columnsArr = null; + if (serverColumns != null) + columnsArr = serverColumns.split(","); + + StringBuilder preparedStatementSetter = new StringBuilder(); + + if (columnsArr != null && columnsArr.length > 0) { + for (int i = 0; i < columnsArr.length; i++) { + preparedStatementSetter.append("?"); + if (i < columnsArr.length - 1) { + preparedStatementSetter.append(", "); + } + } + } + + StringBuilder queryBuilder = new StringBuilder("INSERT INTO "); + queryBuilder.append(schemaName).append(".").append(tableName); + queryBuilder.append("("); + queryBuilder.append(serverColumns); + queryBuilder.append(") VALUES ("); + queryBuilder.append(preparedStatementSetter); + queryBuilder.append(")"); + logger.info("Test Query Builder: {}", queryBuilder.toString()); + return queryBuilder.toString(); } public String getQueryToUpdateDataToServerDB(String schemaName, String serverColumns, String tableName) { @@ -519,7 +693,17 @@ public String getQueryToUpdateDataToServerDB(String schemaName, String serverCol StringBuilder preparedStatementSetter = new StringBuilder(); - StringBuilder queryBuilder = new StringBuilder(" UPDATE "); + if (columnsArr != null && columnsArr.length > 0) { + for (int i = 0; i < columnsArr.length; i++) { + String column = columnsArr[i].trim(); + preparedStatementSetter.append(column).append(" = ?"); + if (i < columnsArr.length - 1) { + preparedStatementSetter.append(", "); + } + } + } + + StringBuilder queryBuilder = new StringBuilder("UPDATE "); queryBuilder.append(schemaName).append(".").append(tableName); queryBuilder.append(" SET "); queryBuilder.append(preparedStatementSetter); @@ -533,11 +717,13 @@ public String getQueryToUpdateDataToServerDB(String schemaName, String serverCol } else { queryBuilder.append(" AND VanID = ? "); } + logger.info("Test Query Builder: {}", queryBuilder.toString()); return queryBuilder.toString(); } // Helper to get information about failed records (for logging purposes) private String getFailedRecords(int[] results, List data) { + logger.info("Inside get Failed Records"); List failedRecordsInfo = new ArrayList<>(); for (int k = 0; k < results.length; k++) { // In Spring JDBC batchUpdate, a value of Statement.EXECUTE_FAILED or @@ -558,5 +744,4 @@ private String getFailedRecords(int[] results, List data) { return String.join("; ", failedRecordsInfo); } - } \ No newline at end of file From 966c0dcdf5bb903f0387e56a1e977e9165039500 Mon Sep 17 00:00:00 2001 From: Amoghavarsh <93114621+5Amogh@users.noreply.github.com> Date: Thu, 25 Sep 2025 10:16:19 +0530 Subject: [PATCH 25/47] Update pom.xml --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b0e8639c..0baff4db 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 com.iemr.mmu mmu-api - 3.4.0 + 3.5.0 war MMU-API From f2a546f02af9921f040cec7cfce1298746b825dc Mon Sep 17 00:00:00 2001 From: Amoghavarsh <93114621+5Amogh@users.noreply.github.com> Date: Thu, 25 Sep 2025 12:51:21 +0530 Subject: [PATCH 26/47] Update pom.xml --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index aa3c19c9..f2f9740e 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 com.iemr.mmu mmu-api - 3.4.1 + 3.5.1 war MMU-API From 3f522278fcef800c74d6811dfd4a9be35130f010 Mon Sep 17 00:00:00 2001 From: Vanitha S <116701245+vanitha1822@users.noreply.github.com> Date: Fri, 26 Sep 2025 20:08:19 +0530 Subject: [PATCH 27/47] Fix the partial datasync issue (#122) * fix: resolve the i_beneficiarymappig table issue * fix: add logs * fix: update function * fix: update server functionality * fix: update else block * fix: update the catch block * fix: corrected the table name * fix: update the failure flag * fix: remove unwanted code --- .../DownloadDataFromServerImpl.java | 10 +- ...wnloadDataFromServerTransactionalImpl.java | 10 +- .../UploadDataToServerImpl.java | 40 ++-- .../DataSyncRepositoryCentral.java | 2 +- .../GetDataFromVanAndSyncToDBImpl.java | 202 +++++++++++++----- 5 files changed, 174 insertions(+), 90 deletions(-) diff --git a/src/main/java/com/iemr/mmu/service/dataSyncActivity/DownloadDataFromServerImpl.java b/src/main/java/com/iemr/mmu/service/dataSyncActivity/DownloadDataFromServerImpl.java index 6e7b1c91..b483517e 100644 --- a/src/main/java/com/iemr/mmu/service/dataSyncActivity/DownloadDataFromServerImpl.java +++ b/src/main/java/com/iemr/mmu/service/dataSyncActivity/DownloadDataFromServerImpl.java @@ -23,12 +23,12 @@ import java.text.DecimalFormat; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import java.util.HashMap; import org.json.JSONObject; import org.slf4j.Logger; @@ -40,11 +40,7 @@ import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; -import org.springframework.util.LinkedMultiValueMap; -import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestTemplate; -import org.springframework.web.context.request.RequestContextHolder; -import org.springframework.web.context.request.ServletRequestAttributes; import com.google.gson.Gson; import com.iemr.mmu.data.syncActivity_syncLayer.MasterDownloadDataDigester; @@ -56,8 +52,6 @@ import com.iemr.mmu.utils.RestTemplateUtil; import com.iemr.mmu.utils.mapper.InputMapper; -import jakarta.servlet.http.HttpServletRequest; - @Service @PropertySource("classpath:application.properties") public class DownloadDataFromServerImpl implements DownloadDataFromServer { @@ -335,11 +329,13 @@ public int callCentralAPIToGenerateBenIDAndimportToLocal(String requestOBJ, Stri // Rest template RestTemplate restTemplate = new RestTemplate(); HttpEntity request = RestTemplateUtil.createRequestEntity(requestOBJ, ServerAuthorization,"datasync"); + logger.info("request obj check="+requestOBJ); // Call rest-template to call central API to generate UNIQUE ID at central ResponseEntity response = restTemplate.exchange(benGenUrlCentral, HttpMethod.POST, request, String.class); logger.info("Authorization before calling local api="+Authorization); logger.info("Import url="+benImportUrlLocal); + logger.info("Response from benGenUrlCentral: " + response.getBody()); if (response != null && response.hasBody()) { JSONObject obj = new JSONObject(response.getBody()); if (obj != null && obj.has("data") && obj.has("statusCode") && obj.getInt("statusCode") == 200) { diff --git a/src/main/java/com/iemr/mmu/service/dataSyncActivity/DownloadDataFromServerTransactionalImpl.java b/src/main/java/com/iemr/mmu/service/dataSyncActivity/DownloadDataFromServerTransactionalImpl.java index 5cd8d26d..ee3c39a5 100644 --- a/src/main/java/com/iemr/mmu/service/dataSyncActivity/DownloadDataFromServerTransactionalImpl.java +++ b/src/main/java/com/iemr/mmu/service/dataSyncActivity/DownloadDataFromServerTransactionalImpl.java @@ -109,7 +109,7 @@ public int downloadTransactionalData(int vanID, String ServerAuthorization, Stri } indentRepo.saveAll(indentList); - int updateFlag = updateProcessedFlagToCentral("db_iemr_sync", "t_indent", ids, ServerAuthorization, token); + int updateFlag = updateProcessedFlagToCentral("db_iemr", "t_indent", ids, ServerAuthorization, token); } break; @@ -136,7 +136,7 @@ public int downloadTransactionalData(int vanID, String ServerAuthorization, Stri indentOrder.setProcessed("P"); } indentOrderRepo.saveAll(indentOrderList); - int updateFlag = updateProcessedFlagToCentral("db_iemr_sync", "t_indentorder", ids, ServerAuthorization, token); + int updateFlag = updateProcessedFlagToCentral("db_iemr", "t_indentorder", ids, ServerAuthorization, token); } break; } @@ -164,7 +164,7 @@ public int downloadTransactionalData(int vanID, String ServerAuthorization, Stri } indentIssueRepo.saveAll(indentIssueList); - int updateFlag = updateProcessedFlagToCentral("db_iemr_sync", "t_indentissue", ids, ServerAuthorization, token); + int updateFlag = updateProcessedFlagToCentral("db_iemr", "t_indentissue", ids, ServerAuthorization, token); } break; } @@ -191,7 +191,7 @@ public int downloadTransactionalData(int vanID, String ServerAuthorization, Stri } stockTransferRepo.saveAll(stockTransferList); - int updateFlag = updateProcessedFlagToCentral("db_iemr_sync", "t_stocktransfer", ids, + int updateFlag = updateProcessedFlagToCentral("db_iemr", "t_stocktransfer", ids, ServerAuthorization, token); } break; @@ -219,7 +219,7 @@ public int downloadTransactionalData(int vanID, String ServerAuthorization, Stri } itemStockEntryRepo.saveAll(itemStockEntryList); - int updateFlag = updateProcessedFlagToCentral("db_iemr_sync", "t_itemstockentry", ids, + int updateFlag = updateProcessedFlagToCentral("db_iemr", "t_itemstockentry", ids, ServerAuthorization, token); } break; diff --git a/src/main/java/com/iemr/mmu/service/dataSyncActivity/UploadDataToServerImpl.java b/src/main/java/com/iemr/mmu/service/dataSyncActivity/UploadDataToServerImpl.java index 266d3d28..f0764baa 100644 --- a/src/main/java/com/iemr/mmu/service/dataSyncActivity/UploadDataToServerImpl.java +++ b/src/main/java/com/iemr/mmu/service/dataSyncActivity/UploadDataToServerImpl.java @@ -88,6 +88,7 @@ public class UploadDataToServerImpl implements UploadDataToServer { private SyncUtilityClassRepo syncutilityClassRepo; @Autowired private CookieUtil cookieUtil; +boolean criticalTableFailure = false; // Add this flag /** * @@ -242,19 +243,22 @@ private String startDataSync(int vanID, String user, String Authorization, Strin } } - // Determine table status based on success/failure counts - String tableStatus; - if (successfulRecords == totalRecords && failedRecords == 0) { - tableStatus = "success"; - } else if (failedRecords == totalRecords && successfulRecords == 0) { - tableStatus = "failed"; - groupHasFailures = true; - } else if (successfulRecords > 0 && failedRecords > 0) { - tableStatus = "partial"; - } else { - tableStatus = "failed"; // Default to failed if unclear - groupHasFailures = true; - } + String tableStatus; + +if (successfulRecords == totalRecords && failedRecords == 0) { + tableStatus = "success"; +} else if (failedRecords == totalRecords && successfulRecords == 0) { + tableStatus = "failed"; + criticalTableFailure = true; // Only critical failures stop sync + groupHasFailures = true; +} else if (successfulRecords > 0 && failedRecords > 0) { + tableStatus = "partial"; + groupHasFailures = true; // Group has issues but don't stop sync +} else { + tableStatus = "failed"; + criticalTableFailure = true; // Complete failure is critical + groupHasFailures = true; +} // Create detailed table info with failure reasons Map tableDetails = new HashMap<>(); @@ -289,11 +293,10 @@ private String startDataSync(int vanID, String user, String Authorization, Strin tableDetailsList.add(tableDetails); } - // If this table had critical failures, stop processing this group - if (tableHasError) { - hasSyncFailed = true; - break; - } + if (criticalTableFailure) { + hasSyncFailed = true; + break; +} } // Determine overall group status String groupStatus; @@ -438,6 +441,7 @@ public Map syncDataToServer(int vanID, String schemaName, String String requestOBJ = gson.toJson(dataMap); HttpEntity request = RestTemplateUtil.createRequestEntity(requestOBJ, Authorization, "datasync"); + logger.info("Request to sync data: " + requestOBJ); ResponseEntity response = restTemplate.exchange(dataSyncUploadUrl, HttpMethod.POST, request, String.class); diff --git a/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/DataSyncRepositoryCentral.java b/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/DataSyncRepositoryCentral.java index 6dba4611..3cb869e1 100644 --- a/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/DataSyncRepositoryCentral.java +++ b/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/DataSyncRepositoryCentral.java @@ -62,7 +62,7 @@ private JdbcTemplate getJdbcTemplate() { "t_ncdscreening", "t_ncdcare", "i_ben_flow_outreach", "t_covid19", "t_idrsdetails", "t_physicalactivity", "t_phy_generalexam", "t_phy_headtotoe", "t_sys_obstetric", "t_sys_gastrointestinal", "t_sys_cardiovascular", "t_sys_respiratory", "t_sys_centralnervous", "t_sys_musculoskeletalsystem", "t_sys_genitourinarysystem", - "t_ancdiagnosis", "t_ncddiagnosis", "t_pncdiagnosis", "t_benchefcomplaint", "t_benclinicalobservation", + "t_ancdiagnosis", "t_ncddiagnosis", "t_pncdiagnosis", "t_benchiefcomplaint", "t_benclinicalobservation", "t_prescription", "t_prescribeddrug", "t_lab_testorder", "t_benreferdetails", "t_lab_testresult", "t_physicalstockentry", "t_patientissue", "t_facilityconsumption", "t_itemstockentry", "t_itemstockexit", "t_benmedhistory", "t_femaleobstetrichistory", "t_benmenstrualdetails", diff --git a/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java b/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java index e338ba17..1f648198 100644 --- a/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java +++ b/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java @@ -21,7 +21,6 @@ */ package com.iemr.mmu.service.dataSyncLayerCentral; -import java.sql.SQLException; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Arrays; @@ -177,6 +176,23 @@ public String syncDataToServer(String requestOBJ, String Authorization) throws E private boolean syncTablesInGroup(String schemaName, String currentTableName, SyncUploadDataDigester originalDigester, List syncResults) { + + // Filter syncData for this specific table + List> filteredData = new ArrayList<>(); + for (Map map : originalDigester.getSyncData()) { + if (map.get("tableName") != null && + map.get("tableName").toString().equalsIgnoreCase(currentTableName)) { + filteredData.add(map); + } + } + + logger.info("Filtered {} records for table {}", filteredData.size(), currentTableName); + + if (filteredData.isEmpty()) { + logger.info("No data found for table: {}", currentTableName); + return true; // No data to sync is considered success + } + SyncUploadDataDigester tableSpecificDigester = new SyncUploadDataDigester(); tableSpecificDigester.setSchemaName(schemaName); tableSpecificDigester.setTableName(currentTableName); @@ -184,7 +200,8 @@ private boolean syncTablesInGroup(String schemaName, String currentTableName, tableSpecificDigester.setFacilityID(originalDigester.getFacilityID()); tableSpecificDigester.setVanAutoIncColumnName(originalDigester.getVanAutoIncColumnName()); tableSpecificDigester.setServerColumns(originalDigester.getServerColumns()); - tableSpecificDigester.setSyncData(originalDigester.getSyncData()); + tableSpecificDigester.setSyncData(filteredData); // Use filtered data + return performGenericTableSync(tableSpecificDigester, syncResults); } @@ -441,7 +458,7 @@ private boolean performGenericTableSync(SyncUploadDataDigester syncUploadDataDig // Add to syncResults first, then track the index int currentSyncResultIndex = syncResults.size(); syncResults.add(new SyncResult(schemaName, syncTableName, vanSerialNo, - syncUploadDataDigester.getSyncedBy(), true, null)); // Initially set as success + syncUploadDataDigester.getSyncedBy(), false, "Pending")); // Initially set as success if (recordCheck == 0) { // Record doesn't exist - INSERT @@ -466,8 +483,8 @@ private boolean performGenericTableSync(SyncUploadDataDigester syncUploadDataDig } } - boolean insertSuccess = true; - boolean updateSuccess = true; + boolean insertSuccess = false; + boolean updateSuccess = false; // Process INSERT operations if (!syncDataListInsert.isEmpty()) { @@ -477,47 +494,77 @@ private boolean performGenericTableSync(SyncUploadDataDigester syncUploadDataDig int[] insertResults = dataSyncRepositoryCentral.syncDataToCentralDB(schemaName, syncTableName, serverColumns, queryInsert, syncDataListInsert); - // Update syncResults based on insert results for (Map.Entry entry : insertIndexMap.entrySet()) { int syncResultIndex = entry.getKey(); int insertListIndex = entry.getValue(); - if (insertListIndex < insertResults.length && insertResults[insertListIndex] > 0) { - // Success - keep the existing success entry - logger.info("Successfully inserted record at index {}", insertListIndex); - } else { - // Failed - update the syncResults entry with concise reason - String vanSerialNo = String.valueOf(syncDataListInsert.get(insertListIndex)[vanSerialIndex]); - String conciseReason = "Insert failed (code: " + - (insertListIndex < insertResults.length ? insertResults[insertListIndex] : "unknown") - + ")"; + boolean success = insertListIndex < insertResults.length && insertResults[insertListIndex] > 0; - syncResults.set(syncResultIndex, new SyncResult(schemaName, syncTableName, vanSerialNo, + if (!success) { + String failedVanSerialNo = getVanSerialNo(syncDataListInsert.get(insertListIndex), + vanSerialIndex, + syncResults.get(syncResultIndex)); + String conciseReason = "Insert failed (code: " + + (insertListIndex < insertResults.length ? insertResults[insertListIndex] : "unknown") + + ")"; + syncResults.set(syncResultIndex, new SyncResult(schemaName, syncTableName, failedVanSerialNo, syncUploadDataDigester.getSyncedBy(), false, conciseReason)); insertSuccess = false; } + else { + // ADD THIS ELSE BLOCK + syncResults.set(syncResultIndex, new SyncResult(schemaName, syncTableName, + syncResults.get(syncResultIndex).getVanSerialNo(), + syncUploadDataDigester.getSyncedBy(), true, null)); +} } } catch (Exception e) { - insertSuccess = false; - logger.error("Exception during insert for table {}: {}", syncTableName, e.getMessage(), e); - - // Store the main error reason instead of complete exception message - String mainErrorReason = extractMainErrorReason(e); - - // Update all insert-related syncResults to failed with concise error message - for (Map.Entry entry : insertIndexMap.entrySet()) { - int syncResultIndex = entry.getKey(); - int insertListIndex = entry.getValue(); - String vanSerialNo = String.valueOf(syncDataListInsert.get(insertListIndex)[vanSerialIndex]); - - syncResults.set(syncResultIndex, new SyncResult(schemaName, syncTableName, vanSerialNo, - syncUploadDataDigester.getSyncedBy(), false, "INSERT: " + mainErrorReason)); - } + String mainErrorReason = extractMainErrorReason(e); + + // Check if we can get partial results even with an exception + try { + // Try to check which records actually made it to the database + for (Map.Entry entry : insertIndexMap.entrySet()) { + int syncResultIndex = entry.getKey(); + int insertListIndex = entry.getValue(); + + String vanSerialNo = getVanSerialNo(syncDataListInsert.get(insertListIndex), vanSerialIndex, + syncResults.get(syncResultIndex)); + int vanIDIndex = serverColumnsList.indexOf("VanID"); + String vanID = vanIDIndex >= 0 && vanIDIndex < syncDataListInsert.get(insertListIndex).length + ? String.valueOf(syncDataListInsert.get(insertListIndex)[vanIDIndex]) + : null; + + // Check if this specific record exists in DB now (it might have succeeded before the exception) + int recordExists = dataSyncRepositoryCentral.checkRecordIsAlreadyPresentOrNot( + schemaName, syncTableName, vanSerialNo, vanID, vanAutoIncColumnName, 0); + + if (recordExists > 0) { + // Record exists - it was actually inserted successfully + syncResults.set(syncResultIndex, new SyncResult(schemaName, syncTableName, vanSerialNo, + syncUploadDataDigester.getSyncedBy(), true, null)); + } else { + // Record doesn't exist - it failed + syncResults.set(syncResultIndex, new SyncResult(schemaName, syncTableName, vanSerialNo, + syncUploadDataDigester.getSyncedBy(), false, "INSERT: " + mainErrorReason)); } } + } catch (Exception checkException) { + // If we can't check, mark all as failed + for (Map.Entry entry : insertIndexMap.entrySet()) { + int syncResultIndex = entry.getKey(); + int insertListIndex = entry.getValue(); + String vanSerialNo = getVanSerialNo(syncDataListInsert.get(insertListIndex), vanSerialIndex, + syncResults.get(syncResultIndex)); + syncResults.set(syncResultIndex, new SyncResult(schemaName, syncTableName, vanSerialNo, + syncUploadDataDigester.getSyncedBy(), false, "INSERT: " + mainErrorReason)); + } + } + insertSuccess = false; +} + } - // Process UPDATE operations if (!syncDataListUpdate.isEmpty()) { String queryUpdate = getQueryToUpdateDataToServerDB(schemaName, serverColumns, syncTableName); @@ -525,50 +572,88 @@ private boolean performGenericTableSync(SyncUploadDataDigester syncUploadDataDig int[] updateResults = dataSyncRepositoryCentral.syncDataToCentralDB(schemaName, syncTableName, serverColumns, queryUpdate, syncDataListUpdate); - // Update syncResults based on update results for (Map.Entry entry : updateIndexMap.entrySet()) { int syncResultIndex = entry.getKey(); int updateListIndex = entry.getValue(); - if (updateListIndex < updateResults.length && updateResults[updateListIndex] > 0) { - // Success - keep the existing success entry - logger.info("Successfully updated record at index {}", updateListIndex); - } else { - // Failed - update the syncResults entry with concise reason - String vanSerialNo = String.valueOf(syncDataListUpdate.get(updateListIndex)[vanSerialIndex]); - String conciseReason = "Update failed (code: " + - (updateListIndex < updateResults.length ? updateResults[updateListIndex] : "unknown") - + ")"; + boolean success = updateListIndex < updateResults.length && updateResults[updateListIndex] > 0; - syncResults.set(syncResultIndex, new SyncResult(schemaName, syncTableName, vanSerialNo, + if (!success) { + String failedVanSerialNo = getVanSerialNo(syncDataListUpdate.get(updateListIndex), + vanSerialIndex, + syncResults.get(syncResultIndex)); + String conciseReason = "Update failed (code: " + + (updateListIndex < updateResults.length ? updateResults[updateListIndex] : "unknown") + + ")"; + syncResults.set(syncResultIndex, new SyncResult(schemaName, syncTableName, failedVanSerialNo, syncUploadDataDigester.getSyncedBy(), false, conciseReason)); updateSuccess = false; } + else { + // ADD THIS ELSE BLOCK + syncResults.set(syncResultIndex, new SyncResult(schemaName, syncTableName, + syncResults.get(syncResultIndex).getVanSerialNo(), + syncUploadDataDigester.getSyncedBy(), true, null)); +} } } catch (Exception e) { - updateSuccess = false; - logger.error("Exception during update for table {}: {}", syncTableName, e.getMessage(), e); - - // Store the main error reason instead of complete exception message - String mainErrorReason = extractMainErrorReason(e); - - // Update all update-related syncResults to failed with concise error message - for (Map.Entry entry : updateIndexMap.entrySet()) { - int syncResultIndex = entry.getKey(); - int updateListIndex = entry.getValue(); - String vanSerialNo = String.valueOf(syncDataListUpdate.get(updateListIndex)[vanSerialIndex]); - - syncResults.set(syncResultIndex, new SyncResult(schemaName, syncTableName, vanSerialNo, - syncUploadDataDigester.getSyncedBy(), false, "UPDATE: " + mainErrorReason)); - } + String mainErrorReason = extractMainErrorReason(e); + + // Check if we can get partial results even with an exception + try { + // Try to check which records actually made it to the database + for (Map.Entry entry : updateIndexMap.entrySet()) { + int syncResultIndex = entry.getKey(); + int updateListIndex = entry.getValue(); + + String vanSerialNo = getVanSerialNo(syncDataListUpdate.get(updateListIndex), vanSerialIndex, + syncResults.get(syncResultIndex)); + int vanIDIndex = serverColumnsList.indexOf("VanID"); + String vanID = vanIDIndex >= 0 && vanIDIndex < syncDataListUpdate.get(updateListIndex).length + ? String.valueOf(syncDataListUpdate.get(updateListIndex)[vanIDIndex]) + : null; + + // Check if this specific record was actually updated in DB + int recordExists = dataSyncRepositoryCentral.checkRecordIsAlreadyPresentOrNot( + schemaName, syncTableName, vanSerialNo, vanID, vanAutoIncColumnName, 0); + + if (recordExists > 0) { + // Record exists and was likely updated successfully + syncResults.set(syncResultIndex, new SyncResult(schemaName, syncTableName, vanSerialNo, + syncUploadDataDigester.getSyncedBy(), true, null)); + } else { + // Record doesn't exist or update failed + syncResults.set(syncResultIndex, new SyncResult(schemaName, syncTableName, vanSerialNo, + syncUploadDataDigester.getSyncedBy(), false, "UPDATE: " + mainErrorReason)); } } + } catch (Exception checkException) { + // If we can't check, mark all as failed + for (Map.Entry entry : updateIndexMap.entrySet()) { + int syncResultIndex = entry.getKey(); + int updateListIndex = entry.getValue(); + String vanSerialNo = getVanSerialNo(syncDataListUpdate.get(updateListIndex), vanSerialIndex, + syncResults.get(syncResultIndex)); + syncResults.set(syncResultIndex, new SyncResult(schemaName, syncTableName, vanSerialNo, + syncUploadDataDigester.getSyncedBy(), false, "UPDATE: " + mainErrorReason)); + } + } + updateSuccess = false; +} + } logger.info("Sync results for table {}: {}", syncTableName, syncResults); return insertSuccess && updateSuccess; } + private String getVanSerialNo(Object[] record, int vanSerialIndex, SyncResult originalResult) { + if (vanSerialIndex >= 0 && vanSerialIndex < record.length) { + return String.valueOf(record[vanSerialIndex]); + } + return originalResult.getVanSerialNo() != null ? originalResult.getVanSerialNo() : "UNKNOWN"; + } + // Helper method to extract concise but meaningful error message private String extractMainErrorReason(Exception e) { if (e == null) { @@ -682,7 +767,6 @@ private String getQueryToInsertDataToServerDB(String schemaName, String tableNam queryBuilder.append(") VALUES ("); queryBuilder.append(preparedStatementSetter); queryBuilder.append(")"); - logger.info("Test Query Builder: {}", queryBuilder.toString()); return queryBuilder.toString(); } From f232c1c8ae7921d638d5573084013abccb741de3 Mon Sep 17 00:00:00 2001 From: Vanitha S <116701245+vanitha1822@users.noreply.github.com> Date: Thu, 2 Oct 2025 09:35:38 +0530 Subject: [PATCH 28/47] Fix Sync Issue to Ensure Full Completion (#123) * fix: date format issue * fix: marriage date format * fix: timeout issue - applicaiton.properties * fix: timeout issue - applicaiton.properties * fix: add logs * fix: add logs * fix: add logs * fix: add more logs * fix: add logs in server * fix: update syncFacilityID * fix: Reduce batch size to 10 --- .../UploadDataToServerImpl.java | 752 ++++++++++-------- .../DataSyncRepositoryCentral.java | 9 +- .../GetDataFromVanAndSyncToDBImpl.java | 509 ++++++------ src/main/resources/application.properties | 17 +- 4 files changed, 649 insertions(+), 638 deletions(-) diff --git a/src/main/java/com/iemr/mmu/service/dataSyncActivity/UploadDataToServerImpl.java b/src/main/java/com/iemr/mmu/service/dataSyncActivity/UploadDataToServerImpl.java index f0764baa..6093e51f 100644 --- a/src/main/java/com/iemr/mmu/service/dataSyncActivity/UploadDataToServerImpl.java +++ b/src/main/java/com/iemr/mmu/service/dataSyncActivity/UploadDataToServerImpl.java @@ -28,6 +28,7 @@ import java.util.Map; import org.json.JSONArray; +import org.json.JSONException; import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -37,9 +38,11 @@ import org.springframework.http.HttpEntity; import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; +import org.springframework.http.client.SimpleClientHttpRequestFactory; import org.springframework.stereotype.Service; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; +import org.springframework.web.client.ResourceAccessException; import org.springframework.web.client.RestTemplate; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; @@ -120,267 +123,257 @@ public String syncIntercepter(int vanID, String user, String Authorization, Stri * @param Authorization * @return */ + private String startDataSync(int vanID, String user, String Authorization, String token) throws Exception { - String serverAcknowledgement = null; - List> responseStatus = new ArrayList<>(); - boolean hasSyncFailed = false; - ObjectMapper objectMapper = new ObjectMapper(); - - // fetch group masters - List dataSyncGroupList = dataSyncGroupsRepo.findByDeleted(false); - logger.debug("Fetched DataSyncGroups: {}", - objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(dataSyncGroupList)); - - for (DataSyncGroups dataSyncGroups : dataSyncGroupList) { - int groupId = dataSyncGroups.getSyncTableGroupID(); - String groupName = dataSyncGroups.getSyncTableGroupName(); // Get group name if available - - List syncUtilityClassList = getVanAndServerColumns(groupId); - logger.debug("Fetched SyncUtilityClass for groupId {}: {}", groupId, - objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(syncUtilityClassList)); - - // Track table-level results for this group - List> tableDetailsList = new ArrayList<>(); - boolean groupHasFailures = false; - - for (SyncUtilityClass obj : syncUtilityClassList) { - String tableKey = obj.getSchemaName() + "." + obj.getTableName(); - boolean tableHasError = false; - - // get data from DB to sync to server - List> syncData = getDataToSync(obj.getSchemaName(), obj.getTableName(), - obj.getVanColumnName()); - logger.debug("Fetched syncData for schema {} and table {}: {}", obj.getSchemaName(), obj.getTableName(), - objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(syncData)); - - if (syncData != null && syncData.size() > 0) { - int dataSize = syncData.size(); - int startIndex = 0; - int fullBatchCount = dataSize / BATCH_SIZE; - int remainder = dataSize % BATCH_SIZE; - - // Track table-level success/failure counts - int totalRecords = dataSize; - int successfulRecords = 0; - int failedRecords = 0; - List tableFailureReasons = new ArrayList<>(); - - logger.info("Starting batch sync for schema: {}, table: {} with {} full batches and {} remainder", - obj.getSchemaName(), obj.getTableName(), fullBatchCount, remainder); - - // Process full batches - for (int i = 0; i < fullBatchCount && !tableHasError; i++) { - List> syncDataBatch = getBatchOfAskedSizeDataToSync(syncData, startIndex, - BATCH_SIZE); - - // Updated to handle Map return type - Map syncResult = syncDataToServer(vanID, obj.getSchemaName(), obj.getTableName(), - obj.getVanAutoIncColumnName(), obj.getServerColumnName(), syncDataBatch, user, - Authorization, token); - - if (syncResult == null) { - logger.error("Sync failed for batch {} in schema: {}, table: {}", i, obj.getSchemaName(), - obj.getTableName()); - tableHasError = true; - failedRecords += syncDataBatch.size(); - groupHasFailures = true; - break; - } - - String status = (String) syncResult.get("status"); - int batchSuccessCount = (Integer) syncResult.get("successCount"); - int batchFailCount = (Integer) syncResult.get("failCount"); - @SuppressWarnings("unchecked") - List batchFailureReasons = (List) syncResult.get("failureReasons"); - - successfulRecords += batchSuccessCount; - failedRecords += batchFailCount; - - if (batchFailureReasons != null && !batchFailureReasons.isEmpty()) { - tableFailureReasons.addAll(batchFailureReasons); - groupHasFailures = true; - } - - if (status.equals("Sync failed")) { - tableHasError = true; - break; - } + String serverAcknowledgement = null; + List> responseStatus = new ArrayList<>(); + ObjectMapper objectMapper = new ObjectMapper(); + + // fetch group masters + List dataSyncGroupList = dataSyncGroupsRepo.findByDeleted(false); + logger.debug("Fetched DataSyncGroups: {}", + objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(dataSyncGroupList)); + + for (DataSyncGroups dataSyncGroups : dataSyncGroupList) { + int groupId = dataSyncGroups.getSyncTableGroupID(); + String groupName = dataSyncGroups.getSyncTableGroupName(); + + List syncUtilityClassList = getVanAndServerColumns(groupId); + logger.debug("Fetched SyncUtilityClass for groupId {}: {}", groupId, + objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(syncUtilityClassList)); + + // Track table-level results for this group + List> tableDetailsList = new ArrayList<>(); + boolean groupHasFailures = false; + boolean groupHasCriticalFailure = false; // Track critical failures at group level + + for (SyncUtilityClass obj : syncUtilityClassList) { + String tableKey = obj.getSchemaName() + "." + obj.getTableName(); + boolean tableHasError = false; + + // get data from DB to sync to server + List> syncData = getDataToSync(obj.getSchemaName(), obj.getTableName(), + obj.getVanColumnName()); + logger.debug("Fetched syncData for schema {} and table {}: {}", obj.getSchemaName(), obj.getTableName(), + objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(syncData)); + + if (syncData != null && syncData.size() > 0) { + int dataSize = syncData.size(); + int startIndex = 0; + int fullBatchCount = dataSize / BATCH_SIZE; + int remainder = dataSize % BATCH_SIZE; + + // Track table-level success/failure counts + int totalRecords = dataSize; + int successfulRecords = 0; + int failedRecords = 0; + List tableFailureReasons = new ArrayList<>(); + + logger.info("Starting batch sync for schema: {}, table: {} with {} full batches and {} remainder", + obj.getSchemaName(), obj.getTableName(), fullBatchCount, remainder); + + // Process full batches + for (int i = 0; i < fullBatchCount && !tableHasError; i++) { + List> syncDataBatch = getBatchOfAskedSizeDataToSync(syncData, startIndex, + BATCH_SIZE); + + Map syncResult = syncDataToServer(vanID, obj.getSchemaName(), obj.getTableName(), + obj.getVanAutoIncColumnName(), obj.getServerColumnName(), syncDataBatch, user, + Authorization, token); + + if (syncResult == null) { + logger.error("Sync failed for batch {} in schema: {}, table: {}", i, obj.getSchemaName(), + obj.getTableName()); + tableHasError = true; + failedRecords += syncDataBatch.size(); + groupHasFailures = true; + tableFailureReasons.add("Batch " + i + " sync returned null response"); + break; + } + + String status = (String) syncResult.get("status"); + int batchSuccessCount = (Integer) syncResult.get("successCount"); + int batchFailCount = (Integer) syncResult.get("failCount"); + @SuppressWarnings("unchecked") + List batchFailureReasons = (List) syncResult.get("failureReasons"); + + successfulRecords += batchSuccessCount; + failedRecords += batchFailCount; + + if (batchFailureReasons != null && !batchFailureReasons.isEmpty()) { + tableFailureReasons.addAll(batchFailureReasons); + groupHasFailures = true; + } + + if (status.equals("Sync failed")) { + tableHasError = true; + break; + } + + startIndex += BATCH_SIZE; + } - startIndex += BATCH_SIZE; - } + // Process remainder batch if no error in full batches + if (!tableHasError && remainder > 0) { + List> syncDataBatch = getBatchOfAskedSizeDataToSync(syncData, startIndex, + remainder); + + Map syncResult = syncDataToServer(vanID, obj.getSchemaName(), obj.getTableName(), + obj.getVanAutoIncColumnName(), obj.getServerColumnName(), syncDataBatch, user, + Authorization, token); + + if (syncResult == null) { + logger.error("Sync failed for remaining data in schema: {}, table: {}", obj.getSchemaName(), + obj.getTableName()); + failedRecords += syncDataBatch.size(); + groupHasFailures = true; + tableFailureReasons.add("Remainder batch sync returned null response"); + } else { + String status = (String) syncResult.get("status"); + int batchSuccessCount = (Integer) syncResult.get("successCount"); + int batchFailCount = (Integer) syncResult.get("failCount"); + @SuppressWarnings("unchecked") + List batchFailureReasons = (List) syncResult.get("failureReasons"); + + successfulRecords += batchSuccessCount; + failedRecords += batchFailCount; + + if (batchFailureReasons != null && !batchFailureReasons.isEmpty()) { + tableFailureReasons.addAll(batchFailureReasons); + groupHasFailures = true; + } + + if (status.equals("Sync failed")) { + groupHasFailures = true; + } + } + } - if (!tableHasError && remainder > 0) { - List> syncDataBatch = getBatchOfAskedSizeDataToSync(syncData, startIndex, - remainder); - - Map syncResult = syncDataToServer(vanID, obj.getSchemaName(), obj.getTableName(), - obj.getVanAutoIncColumnName(), obj.getServerColumnName(), syncDataBatch, user, - Authorization, token); - - if (syncResult == null) { - logger.error("Sync failed for remaining data in schema: {}, table: {}", obj.getSchemaName(), - obj.getTableName()); - failedRecords += syncDataBatch.size(); - groupHasFailures = true; - } else { - String status = (String) syncResult.get("status"); - int batchSuccessCount = (Integer) syncResult.get("successCount"); - int batchFailCount = (Integer) syncResult.get("failCount"); - @SuppressWarnings("unchecked") - List batchFailureReasons = (List) syncResult.get("failureReasons"); - - successfulRecords += batchSuccessCount; - failedRecords += batchFailCount; - - if (batchFailureReasons != null && !batchFailureReasons.isEmpty()) { - tableFailureReasons.addAll(batchFailureReasons); + // Determine table status + String tableStatus; + if (successfulRecords == totalRecords && failedRecords == 0) { + tableStatus = "success"; + } else if (failedRecords == totalRecords && successfulRecords == 0) { + tableStatus = "failed"; + groupHasCriticalFailure = true; // Mark as critical failure + groupHasFailures = true; + } else if (successfulRecords > 0 && failedRecords > 0) { + tableStatus = "partial"; + groupHasFailures = true; + } else { + tableStatus = "failed"; + groupHasCriticalFailure = true; groupHasFailures = true; } + + // Create detailed table info with failure reasons + Map tableDetails = new HashMap<>(); + tableDetails.put("tableName", obj.getTableName()); + tableDetails.put("schemaName", obj.getSchemaName()); + tableDetails.put("status", tableStatus); + tableDetails.put("totalRecords", totalRecords); + tableDetails.put("successfulRecords", successfulRecords); + tableDetails.put("failedRecords", failedRecords); - if (status.equals("Sync failed")) { - groupHasFailures = true; + // Add failure reasons only if there are any failures + if (!tableFailureReasons.isEmpty()) { + tableDetails.put("failureReasons", tableFailureReasons); } + + tableDetailsList.add(tableDetails); + + logger.info("Table sync summary - {}: {} (Success: {}, Failed: {}, Total: {}, Failure Reasons: {})", + tableKey, tableStatus, successfulRecords, failedRecords, totalRecords, + tableFailureReasons.isEmpty() ? "None" : tableFailureReasons); + + } else { + logger.info("No data to sync for schema {} and table {}", obj.getSchemaName(), obj.getTableName()); + + Map tableDetails = new HashMap<>(); + tableDetails.put("tableName", obj.getTableName()); + tableDetails.put("schemaName", obj.getSchemaName()); + tableDetails.put("status", "no_data"); + tableDetails.put("totalRecords", 0); + tableDetails.put("successfulRecords", 0); + tableDetails.put("failedRecords", 0); + tableDetailsList.add(tableDetails); } + + // Continue processing all tables in the group - NO BREAK HERE } - String tableStatus; - -if (successfulRecords == totalRecords && failedRecords == 0) { - tableStatus = "success"; -} else if (failedRecords == totalRecords && successfulRecords == 0) { - tableStatus = "failed"; - criticalTableFailure = true; // Only critical failures stop sync - groupHasFailures = true; -} else if (successfulRecords > 0 && failedRecords > 0) { - tableStatus = "partial"; - groupHasFailures = true; // Group has issues but don't stop sync -} else { - tableStatus = "failed"; - criticalTableFailure = true; // Complete failure is critical - groupHasFailures = true; -} - - // Create detailed table info with failure reasons - Map tableDetails = new HashMap<>(); - tableDetails.put("tableName", obj.getTableName()); - tableDetails.put("schemaName", obj.getSchemaName()); - tableDetails.put("status", tableStatus); - tableDetails.put("totalRecords", totalRecords); - tableDetails.put("successfulRecords", successfulRecords); - tableDetails.put("failedRecords", failedRecords); - - // Add failure reasons only if there are any failures - if (!tableFailureReasons.isEmpty()) { - tableDetails.put("failureReasons", tableFailureReasons); + // Determine overall group status based on table results + String groupStatus; + long successTables = tableDetailsList.stream() + .filter(table -> "success".equals(table.get("status")) || "no_data".equals(table.get("status"))) + .count(); + long partialTables = tableDetailsList.stream() + .filter(table -> "partial".equals(table.get("status"))) + .count(); + long failedTables = tableDetailsList.stream() + .filter(table -> "failed".equals(table.get("status"))) + .count(); + + if (groupHasCriticalFailure) { + // If group has critical failure (100% failed tables), mark as failed + groupStatus = "failed"; + } else if (failedTables == 0 && partialTables == 0) { + // All tables succeeded or had no data + groupStatus = "completed"; + } else if (failedTables > 0 && successTables == 0 && partialTables == 0) { + // All tables failed + groupStatus = "failed"; + } else { + // Mixed results - some success, some partial, some failed + groupStatus = "partial"; } - - tableDetailsList.add(tableDetails); - logger.info("Table sync summary - {}: {} (Success: {}, Failed: {}, Total: {}, Failure Reasons: {})", - tableKey, tableStatus, successfulRecords, failedRecords, totalRecords, - tableFailureReasons.isEmpty() ? "None" : tableFailureReasons); + // Create group response + Map groupResponse = new HashMap<>(); + groupResponse.put("syncTableGroupID", groupId); + groupResponse.put("syncTableGroupName", groupName != null ? groupName : "Group " + groupId); + groupResponse.put("status", groupStatus); + groupResponse.put("tables", tableDetailsList); + groupResponse.put("summary", Map.of( + "totalTables", tableDetailsList.size(), + "successfulTables", successTables, + "partialTables", partialTables, + "failedTables", failedTables)); + + responseStatus.add(groupResponse); + + // Continue to next group - NO BREAK HERE, process ALL groups + } + // Create final response + Map finalResponse = new HashMap<>(); + + // Check if any group failed completely + boolean anyGroupFailed = responseStatus.stream() + .anyMatch(group -> "failed".equals(((Map) group).get("status"))); + + // Check if there was any data to sync + boolean hasData = responseStatus.stream() + .anyMatch(group -> { + @SuppressWarnings("unchecked") + List> tables = (List>) ((Map) group) + .get("tables"); + return tables.stream().anyMatch(table -> !("no_data".equals(table.get("status")))); + }); + + if (!hasData) { + return "No data to sync"; + } else if (anyGroupFailed) { + finalResponse.put("response", "Data sync completed with failures"); + finalResponse.put("groupsProgress", responseStatus); + return objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(finalResponse); } else { - logger.info("No data to sync for schema {} and table {}", obj.getSchemaName(), obj.getTableName()); - - Map tableDetails = new HashMap<>(); - tableDetails.put("tableName", obj.getTableName()); - tableDetails.put("schemaName", obj.getSchemaName()); - tableDetails.put("status", "no_data"); - tableDetails.put("totalRecords", 0); - tableDetails.put("successfulRecords", 0); - tableDetails.put("failedRecords", 0); - tableDetailsList.add(tableDetails); + finalResponse.put("response", "Data sync completed successfully"); + finalResponse.put("groupsProgress", responseStatus); + return objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(finalResponse); } - - if (criticalTableFailure) { - hasSyncFailed = true; - break; -} } - // Determine overall group status - String groupStatus; - long successTables = tableDetailsList.stream() - .filter(table -> "success".equals(table.get("status")) || "no_data".equals(table.get("status"))) - .count(); - long partialTables = tableDetailsList.stream() - .filter(table -> "partial".equals(table.get("status"))) - .count(); - long failedTables = tableDetailsList.stream() - .filter(table -> "failed".equals(table.get("status"))) - .count(); - - if (failedTables == 0 && partialTables == 0) { - groupStatus = "completed"; - } else if (failedTables > 0 && successTables == 0 && partialTables == 0) { - groupStatus = "failed"; - } else { - groupStatus = "partial"; - } - // Create group response - Map groupResponse = new HashMap<>(); - groupResponse.put("syncTableGroupID", groupId); - groupResponse.put("syncTableGroupName", groupName != null ? groupName : "Group " + groupId); - groupResponse.put("status", groupStatus); - groupResponse.put("tables", tableDetailsList); - groupResponse.put("summary", Map.of( - "totalTables", tableDetailsList.size(), - "successfulTables", successTables, - "partialTables", partialTables, - "failedTables", failedTables)); - - responseStatus.add(groupResponse); - - if (hasSyncFailed) { - // Mark all subsequent groups as "pending" - for (int j = dataSyncGroupList.indexOf(dataSyncGroups) + 1; j < dataSyncGroupList.size(); j++) { - DataSyncGroups remainingGroup = dataSyncGroupList.get(j); - Map pendingGroupResponse = new HashMap<>(); - pendingGroupResponse.put("syncTableGroupID", remainingGroup.getSyncTableGroupID()); - pendingGroupResponse.put("syncTableGroupName", - remainingGroup.getSyncTableGroupName() != null ? remainingGroup.getSyncTableGroupName() - : "Group " + remainingGroup.getSyncTableGroupID()); - pendingGroupResponse.put("status", "pending"); - pendingGroupResponse.put("tables", new ArrayList<>()); - pendingGroupResponse.put("summary", Map.of( - "totalTables", 0, - "successfulTables", 0L, - "partialTables", 0L, - "failedTables", 0L)); - responseStatus.add(pendingGroupResponse); - } - break; - } - } - - // Create final response - Map finalResponse = new HashMap<>(); - if (hasSyncFailed) { - finalResponse.put("response", "Data sync failed"); - finalResponse.put("groupsProgress", responseStatus); - return objectMapper.writerWithDefaultPrettyPrinter() - .writeValueAsString(finalResponse); - } else { - // Check if there was any data to sync - boolean hasData = responseStatus.stream() - .anyMatch(group -> { - @SuppressWarnings("unchecked") - List> tables = (List>) ((Map) group) - .get("tables"); - return tables.stream().anyMatch(table -> !("no_data".equals(table.get("status")))); - }); - - if (!hasData) { - return "No data to sync"; - } else { - finalResponse.put("response", "Data sync completed"); - finalResponse.put("groupsProgress", responseStatus); - return objectMapper.writerWithDefaultPrettyPrinter() - .writeValueAsString(finalResponse); - } - } - } private List getVanAndServerColumns(Integer groupID) throws Exception { List syncUtilityClassList = getVanAndServerColumnList(groupID); @@ -417,115 +410,172 @@ private List> getBatchOfAskedSizeDataToSync(List syncDataToServer(int vanID, String schemaName, String tableName, String vanAutoIncColumnName, - String serverColumns, List> dataToBesync, String user, String Authorization, - String token) throws Exception { - - RestTemplate restTemplate = new RestTemplate(); - Integer facilityID = masterVanRepo.getFacilityID(vanID); - - // serialize null - GsonBuilder gsonBuilder = new GsonBuilder(); - gsonBuilder.serializeNulls(); - Gson gson = gsonBuilder.create(); - - Map dataMap = new HashMap<>(); - dataMap.put("schemaName", schemaName); - dataMap.put("tableName", tableName); - dataMap.put("vanAutoIncColumnName", vanAutoIncColumnName); - dataMap.put("serverColumns", serverColumns); - dataMap.put("syncData", dataToBesync); - dataMap.put("syncedBy", user); - if (facilityID != null) - dataMap.put("facilityID", facilityID); - - String requestOBJ = gson.toJson(dataMap); - HttpEntity request = RestTemplateUtil.createRequestEntity(requestOBJ, Authorization, "datasync"); - logger.info("Request to sync data: " + requestOBJ); - ResponseEntity response = restTemplate.exchange(dataSyncUploadUrl, HttpMethod.POST, request, - String.class); - - logger.info("Response from the server=" + response); - - int successCount = 0; - int failCount = 0; - List successVanSerialNos = new ArrayList<>(); - List failedVanSerialNos = new ArrayList<>(); - List failureReasons = new ArrayList<>(); - - if (response != null && response.hasBody()) { - JSONObject obj = new JSONObject(response.getBody()); - if (obj.has("data")) { - JSONObject dataObj = obj.getJSONObject("data"); - if (dataObj.has("records")) { - JSONArray recordsArr = dataObj.getJSONArray("records"); - for (int i = 0; i < recordsArr.length(); i++) { - JSONObject record = recordsArr.getJSONObject(i); - String vanSerialNo = record.getString("vanSerialNo"); - boolean success = record.getBoolean("success"); - if (success) { - successVanSerialNos.add(vanSerialNo); - successCount++; - } else { - failedVanSerialNos.add(vanSerialNo); - failCount++; - // Capture the failure reason - String reason = record.optString("reason", "Unknown error"); - failureReasons.add(reason); - } - } - } else if (tableName.equalsIgnoreCase("m_beneficiaryregidmapping")) { - // Handle summary response for m_beneficiaryregidmapping - String respMsg = dataObj.optString("response", ""); - int statusCode = obj.optInt("statusCode", 0); - if (respMsg.toLowerCase().contains("success") && statusCode == 200) { - // All records are successful - for (Map map : dataToBesync) { - successVanSerialNos.add(String.valueOf(map.get(vanAutoIncColumnName))); - } - successCount = successVanSerialNos.size(); - } else { - // All records failed - for (Map map : dataToBesync) { - failedVanSerialNos.add(String.valueOf(map.get(vanAutoIncColumnName))); - } - failCount = failedVanSerialNos.size(); - // Add a generic reason for all failed records - for (int i = 0; i < failCount; i++) { - failureReasons.add(respMsg.isEmpty() ? "Sync failed" : respMsg); - } - } - } - } - } +public Map syncDataToServer(int vanID, String schemaName, String tableName, + String vanAutoIncColumnName, String serverColumns, List> dataToBesync, + String user, String Authorization, String token) throws Exception { + + RestTemplate restTemplate = new RestTemplate(); + + // Configure timeouts + SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); + factory.setConnectTimeout(60000); // 60 seconds to connect + factory.setReadTimeout(600000); // 10 minutes to read response + restTemplate.setRequestFactory(factory); + + Integer facilityID = masterVanRepo.getFacilityID(vanID); + + GsonBuilder gsonBuilder = new GsonBuilder(); + gsonBuilder.serializeNulls(); + Gson gson = gsonBuilder.create(); + + Map dataMap = new HashMap<>(); + dataMap.put("schemaName", schemaName); + dataMap.put("tableName", tableName); + dataMap.put("vanAutoIncColumnName", vanAutoIncColumnName); + dataMap.put("serverColumns", serverColumns); + dataMap.put("syncData", dataToBesync); + dataMap.put("syncedBy", user); + if (facilityID != null) + dataMap.put("facilityID", facilityID); + + String requestOBJ = gson.toJson(dataMap); + HttpEntity request = RestTemplateUtil.createRequestEntity(requestOBJ, Authorization, "datasync"); + + logger.info("Syncing {} records for table {}", dataToBesync.size(), tableName); + + int successCount = 0; + int failCount = 0; + List successVanSerialNos = new ArrayList<>(); + List failedVanSerialNos = new ArrayList<>(); + List failureReasons = new ArrayList<>(); + + try { + ResponseEntity response = restTemplate.exchange(dataSyncUploadUrl, HttpMethod.POST, + request, String.class); + + logger.info("Response from server: status={}, hasBody={}, getBody={}", + response.getStatusCode(), response.hasBody(), response.getBody()); - logger.info("Success Van Serial No=" + successVanSerialNos.toString()); - logger.info("Failed Van Serial No=" + failedVanSerialNos.toString()); - - // Update processed flag for success and failed vanSerialNos - if (!successVanSerialNos.isEmpty()) { - dataSyncRepository.updateProcessedFlagInVan(schemaName, tableName, successVanSerialNos, - vanAutoIncColumnName, user, "P","Null"); - } - if (!failedVanSerialNos.isEmpty()) { - dataSyncRepository.updateProcessedFlagInVan(schemaName, tableName, failedVanSerialNos, - vanAutoIncColumnName, user, "F",failureReasons.get(0)); - } + + if (response != null && response.hasBody()) { + try { + JSONObject obj = new JSONObject(response.getBody()); + + int statusCode = obj.optInt("statusCode", 200); + String errorMessage = obj.optString("errorMessage", ""); + + // Check for ACTUAL errors - status >= 400 OR errorMessage is not "Success" + if (statusCode >= 400 || (!errorMessage.isEmpty() && !errorMessage.equalsIgnoreCase("Success"))) { + logger.error("Server returned error: {}", errorMessage); + + // Mark all as failed + for (Map map : dataToBesync) { + failedVanSerialNos.add(String.valueOf(map.get(vanAutoIncColumnName))); + failureReasons.add(errorMessage); + } + failCount = failedVanSerialNos.size(); + + } else if (obj.has("data")) { + JSONObject dataObj = obj.getJSONObject("data"); + + if (dataObj.has("records")) { + JSONArray recordsArr = dataObj.getJSONArray("records"); + for (int i = 0; i < recordsArr.length(); i++) { + JSONObject record = recordsArr.getJSONObject(i); + String vanSerialNo = record.getString("vanSerialNo"); + boolean success = record.getBoolean("success"); + + if (success) { + successVanSerialNos.add(vanSerialNo); + successCount++; + } else { + failedVanSerialNos.add(vanSerialNo); + failCount++; + String reason = record.optString("reason", "Unknown error"); + failureReasons.add(reason); + } + } + } else if (tableName.equalsIgnoreCase("m_beneficiaryregidmapping")) { + String respMsg = dataObj.optString("response", ""); + + if (respMsg.toLowerCase().contains("success") && statusCode == 200) { + for (Map map : dataToBesync) { + successVanSerialNos.add(String.valueOf(map.get(vanAutoIncColumnName))); + } + successCount = successVanSerialNos.size(); + } else { + for (Map map : dataToBesync) { + failedVanSerialNos.add(String.valueOf(map.get(vanAutoIncColumnName))); + failureReasons.add(respMsg.isEmpty() ? "Sync failed" : respMsg); + } + failCount = failedVanSerialNos.size(); + } + } + } + } catch (JSONException e) { + logger.error("Failed to parse server response: {}", e.getMessage(), e); + for (Map map : dataToBesync) { + failedVanSerialNos.add(String.valueOf(map.get(vanAutoIncColumnName))); + failureReasons.add("Invalid server response"); + } + failCount = failedVanSerialNos.size(); + } +} + else { + logger.error("Empty response from server"); + for (Map map : dataToBesync) { + failedVanSerialNos.add(String.valueOf(map.get(vanAutoIncColumnName))); + failureReasons.add("Empty server response"); + } + failCount = failedVanSerialNos.size(); + } + + } catch (ResourceAccessException e) { + logger.error("Connection error during sync: {}", e.getMessage(), e); + + // Mark all as failed due to connection error + for (Map map : dataToBesync) { + failedVanSerialNos.add(String.valueOf(map.get(vanAutoIncColumnName))); + failureReasons.add("Connection failed: " + e.getMessage()); + } + failCount = failedVanSerialNos.size(); + + } catch (Exception e) { + logger.error("Unexpected error during sync: {}", e.getMessage(), e); + + for (Map map : dataToBesync) { + failedVanSerialNos.add(String.valueOf(map.get(vanAutoIncColumnName))); + failureReasons.add("Unexpected error: " + e.getMessage()); + } + failCount = failedVanSerialNos.size(); + } - // Return detailed result object instead of just a string - Map result = new HashMap<>(); - if (successCount > 0 && failCount == 0) { - result.put("status", "Data successfully synced"); - } else if (successCount > 0 && failCount > 0) { - result.put("status", "Partial success: " + successCount + " records synced, " + failCount + " failed"); - } else { - result.put("status", "Sync failed"); - } - - result.put("successCount", successCount); - result.put("failCount", failCount); - - return result; + logger.info("Sync complete - Success: {}, Failed: {}", successCount, failCount); + + // Update processed flags + if (!successVanSerialNos.isEmpty()) { + dataSyncRepository.updateProcessedFlagInVan(schemaName, tableName, successVanSerialNos, + vanAutoIncColumnName, user, "P", "null"); + } + if (!failedVanSerialNos.isEmpty()) { + String firstError = failureReasons.isEmpty() ? "Unknown error" : failureReasons.get(0); + dataSyncRepository.updateProcessedFlagInVan(schemaName, tableName, failedVanSerialNos, + vanAutoIncColumnName, user, "F", firstError); + } + + Map result = new HashMap<>(); + if (successCount > 0 && failCount == 0) { + result.put("status", "Data successfully synced"); + } else if (successCount > 0 && failCount > 0) { + result.put("status", "Partial success"); + } else { + result.put("status", "Sync failed"); + } + + result.put("successCount", successCount); + result.put("failCount", failCount); + + return result; } public StringBuilder getVanSerialNoListForSyncedData(String vanAutoIncColumnName, diff --git a/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/DataSyncRepositoryCentral.java b/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/DataSyncRepositoryCentral.java index 3cb869e1..4eadbb49 100644 --- a/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/DataSyncRepositoryCentral.java +++ b/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/DataSyncRepositoryCentral.java @@ -114,7 +114,8 @@ private boolean isValidColumnNamesList(String columnNames) { public int checkRecordIsAlreadyPresentOrNot(String schemaName, String tableName, String vanSerialNo, String vanID, String vanAutoIncColumnName, int syncFacilityID) { - + logger.info("Checking record presence: schema={}, table={}, vanSerialNo={}, vanID={}, column={}, syncFacilityID={}", + schemaName, tableName, vanSerialNo, vanID, vanAutoIncColumnName, syncFacilityID); jdbcTemplate = getJdbcTemplate(); List params = new ArrayList<>(); @@ -128,16 +129,18 @@ public int checkRecordIsAlreadyPresentOrNot(String schemaName, String tableName, StringBuilder queryBuilder = new StringBuilder("SELECT ") .append(vanAutoIncColumnName).append(" FROM ") .append(schemaName).append(".").append(tableName).append(" WHERE VanSerialNo = ?"); - + logger.info("Constructed query: {}", queryBuilder.toString()); params.add(vanSerialNo); - + logger.info("Table name="+tableName.toLowerCase()); if (List.of("t_patientissue", "t_physicalstockentry", "t_stockadjustment", "t_saitemmapping", "t_stocktransfer", "t_patientreturn", "t_facilityconsumption", "t_indent", "t_indentorder", "t_indentissue", "t_itemstockentry", "t_itemstockexit") .contains(tableName.toLowerCase()) && syncFacilityID > 0) { + logger.info("If block"); queryBuilder.append(" AND SyncFacilityID = ?"); params.add(syncFacilityID); } else { + logger.info("Else part"); queryBuilder.append(" AND VanID = ?"); params.add(vanID); } diff --git a/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java b/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java index 1f648198..19bfca8c 100644 --- a/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java +++ b/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java @@ -318,335 +318,280 @@ private String getQueryFor_I_BeneficiaryDetails(String schemaName, String tableN return queryBuilder.toString(); } - private boolean performGenericTableSync(SyncUploadDataDigester syncUploadDataDigester, - List syncResults) { - List> dataToBesync = syncUploadDataDigester.getSyncData(); - List syncDataListInsert = new ArrayList<>(); - List syncDataListUpdate = new ArrayList<>(); - - // Track indices for insert and update operations - Map insertIndexMap = new HashMap<>(); // syncResults index -> insert list index - Map updateIndexMap = new HashMap<>(); // syncResults index -> update list index +private boolean performGenericTableSync(SyncUploadDataDigester syncUploadDataDigester, + List syncResults) { + List> dataToBesync = syncUploadDataDigester.getSyncData(); + List syncDataListInsert = new ArrayList<>(); + List syncDataListUpdate = new ArrayList<>(); - boolean overallSuccess = true; + Map insertIndexMap = new HashMap<>(); + Map updateIndexMap = new HashMap<>(); - if (dataToBesync == null || dataToBesync.isEmpty()) { - logger.info("No data to sync for table: {}", syncUploadDataDigester.getTableName()); - return true; - } - - String syncTableName = syncUploadDataDigester.getTableName(); - String vanAutoIncColumnName = syncUploadDataDigester.getVanAutoIncColumnName(); - String schemaName = syncUploadDataDigester.getSchemaName(); - Integer facilityIDFromDigester = syncUploadDataDigester.getFacilityID(); - String serverColumns = syncUploadDataDigester.getServerColumns(); + boolean overallSuccess = true; - int vanSerialIndex = Arrays.asList(serverColumns.split(",")).indexOf(vanAutoIncColumnName); - List serverColumnsList = Arrays.asList(serverColumns.split(",")); + if (dataToBesync == null || dataToBesync.isEmpty()) { + logger.info("No data to sync for table: {}", syncUploadDataDigester.getTableName()); + return true; + } - for (Map map : dataToBesync) { - // Create a new map with clean column names as keys - Map cleanRecord = new HashMap<>(); - for (String key : map.keySet()) { - String cleanKey = key; - // Handle keys with SQL functions like date_format - if (key.startsWith("date_format(") && key.endsWith(")")) { - int start = key.indexOf("(") + 1; - int end = key.indexOf(","); - if (end > start) { - cleanKey = key.substring(start, end).trim(); - } else { - cleanKey = key.substring(start, key.indexOf(")")).trim(); - } + String syncTableName = syncUploadDataDigester.getTableName(); + String vanAutoIncColumnName = syncUploadDataDigester.getVanAutoIncColumnName(); + String schemaName = syncUploadDataDigester.getSchemaName(); + Integer facilityIDFromDigester = syncUploadDataDigester.getFacilityID(); + String serverColumns = syncUploadDataDigester.getServerColumns(); + logger.info("Facility ID from digester="+facilityIDFromDigester); + int vanSerialIndex = Arrays.asList(serverColumns.split(",")).indexOf(vanAutoIncColumnName); + List serverColumnsList = Arrays.asList(serverColumns.split(",")); + + for (Map map : dataToBesync) { + Map cleanRecord = new HashMap<>(); + + for (String key : map.keySet()) { + String cleanKey = key; + Object value = map.get(key); + + // Handle date_format fields + if (key.startsWith("date_format(") && key.endsWith(")")) { + int start = key.indexOf("(") + 1; + int end = key.indexOf(","); + if (end > start) { + cleanKey = key.substring(start, end).trim(); + } else { + cleanKey = key.substring(start, key.indexOf(")")).trim(); } - cleanRecord.put(cleanKey.trim(), map.get(key)); } + + // CRITICAL FIX: Keep null as null, don't convert to string + cleanRecord.put(cleanKey.trim(), value); + } + - String vanSerialNo = String.valueOf(cleanRecord.get(vanAutoIncColumnName)); - String vanID = String.valueOf(cleanRecord.get("VanID")); - int syncFacilityID = 0; - - // Update SyncedBy and SyncedDate in the cleanRecord - cleanRecord.put("SyncedBy", syncUploadDataDigester.getSyncedBy()); - cleanRecord.put("SyncedDate", String.valueOf(LocalDateTime.now())); - - if (facilityIDFromDigester != null) { - // Determine the 'Processed' status based on facility ID for specific tables - switch (syncTableName.toLowerCase()) { - case "t_indent": - case "t_indentorder": { - if (cleanRecord.containsKey("FromFacilityID") - && cleanRecord.get("FromFacilityID") instanceof Number) { - Number fromFacilityID = (Number) cleanRecord.get("FromFacilityID"); - if (fromFacilityID.intValue() == facilityIDFromDigester) { - cleanRecord.put("Processed", "P"); - } + String vanSerialNo = String.valueOf(cleanRecord.get(vanAutoIncColumnName)); + String vanID = String.valueOf(cleanRecord.get("VanID")); + int syncFacilityID = 0; + + cleanRecord.put("SyncedBy", syncUploadDataDigester.getSyncedBy()); + cleanRecord.put("SyncedDate", String.valueOf(LocalDateTime.now())); + + if (facilityIDFromDigester != null) { + switch (syncTableName.toLowerCase()) { + case "t_indent": + case "t_indentorder": { + if (cleanRecord.containsKey("FromFacilityID") + && cleanRecord.get("FromFacilityID") instanceof Number) { + Number fromFacilityID = (Number) cleanRecord.get("FromFacilityID"); + if (fromFacilityID.intValue() == facilityIDFromDigester) { + cleanRecord.put("Processed", "P"); } - break; } - case "t_indentissue": { - if (cleanRecord.containsKey("ToFacilityID") - && cleanRecord.get("ToFacilityID") instanceof Number) { - Number toFacilityID = (Number) cleanRecord.get("ToFacilityID"); - if (toFacilityID.intValue() == facilityIDFromDigester) { - cleanRecord.put("Processed", "P"); - } + break; + } + case "t_indentissue": { + if (cleanRecord.containsKey("ToFacilityID") + && cleanRecord.get("ToFacilityID") instanceof Number) { + Number toFacilityID = (Number) cleanRecord.get("ToFacilityID"); + if (toFacilityID.intValue() == facilityIDFromDigester) { + cleanRecord.put("Processed", "P"); } - break; } - case "t_stocktransfer": { - if (cleanRecord.containsKey("TransferToFacilityID") - && cleanRecord.get("TransferToFacilityID") instanceof Number) { - Number transferToFacilityID = (Number) cleanRecord.get("TransferToFacilityID"); - if (transferToFacilityID.intValue() == facilityIDFromDigester) { - cleanRecord.put("Processed", "P"); - } + break; + } + case "t_stocktransfer": { + if (cleanRecord.containsKey("TransferToFacilityID") + && cleanRecord.get("TransferToFacilityID") instanceof Number) { + Number transferToFacilityID = (Number) cleanRecord.get("TransferToFacilityID"); + if (transferToFacilityID.intValue() == facilityIDFromDigester) { + cleanRecord.put("Processed", "P"); } - break; } - case "t_itemstockentry": { - if (cleanRecord.containsKey("FacilityID") && cleanRecord.get("FacilityID") instanceof Number) { - Number mapFacilityID = (Number) cleanRecord.get("FacilityID"); - if (mapFacilityID.intValue() == facilityIDFromDigester) { - cleanRecord.put("Processed", "P"); - } + break; + } + case "t_itemstockentry": { + logger.info("case:t_itemStockEntry"+cleanRecord); + if (cleanRecord.containsKey("FacilityID") && cleanRecord.get("FacilityID") instanceof Number) { + Number mapFacilityID = (Number) cleanRecord.get("FacilityID"); + + if (mapFacilityID.intValue() == facilityIDFromDigester) { + cleanRecord.put("Processed", "P"); } - break; } - default: - break; + break; } + default: + break; } + } - // Extract SyncFacilityID for checkRecordIsAlreadyPresentOrNot - if (cleanRecord.containsKey("SyncFacilityID") && cleanRecord.get("SyncFacilityID") instanceof Number) { - syncFacilityID = ((Number) cleanRecord.get("SyncFacilityID")).intValue(); - } - - int recordCheck; - try { - recordCheck = dataSyncRepositoryCentral.checkRecordIsAlreadyPresentOrNot( - schemaName, syncTableName, vanSerialNo, vanID, vanAutoIncColumnName, syncFacilityID); - logger.info("Record check result: {}", recordCheck); - } catch (Exception e) { - logger.error("Error checking record existence for table {}: VanSerialNo={}, VanID={}. Error: {}", - syncTableName, vanSerialNo, vanID, e.getMessage(), e); + if (cleanRecord.containsKey("SyncFacilityID") && cleanRecord.get("SyncFacilityID") instanceof Number) { + syncFacilityID = ((Number) cleanRecord.get("SyncFacilityID")).intValue(); + } - // Store the main error reason from record check failure - String mainErrorReason = "Record check failed: " + extractMainErrorReason(e); + int recordCheck; + try { + recordCheck = dataSyncRepositoryCentral.checkRecordIsAlreadyPresentOrNot( + schemaName, syncTableName, vanSerialNo, vanID, vanAutoIncColumnName, syncFacilityID); + logger.info("Record check result: {}", recordCheck); + } catch (Exception e) { + logger.error("Error checking record existence for table {}: VanSerialNo={}, VanID={}. Error: {}", + syncTableName, vanSerialNo, vanID, e.getMessage(), e); - syncResults.add(new SyncResult(schemaName, syncTableName, vanSerialNo, - syncUploadDataDigester.getSyncedBy(), false, mainErrorReason)); - continue; // Skip to next record - } + String mainErrorReason = "Record check failed: " + extractMainErrorReason(e); + syncResults.add(new SyncResult(schemaName, syncTableName, vanSerialNo, + syncUploadDataDigester.getSyncedBy(), false, mainErrorReason)); + overallSuccess = false; + continue; + } - // Prepare Object array for insert/update - List currentRecordValues = new ArrayList<>(); - for (String column : serverColumnsList) { - Object value = cleanRecord.get(column.trim()); - if (value instanceof Boolean) { - currentRecordValues.add(value); - } else if (value != null) { - currentRecordValues.add(String.valueOf(value)); - } else { - currentRecordValues.add(null); - } + List currentRecordValues = new ArrayList<>(); + for (String column : serverColumnsList) { + logger.info("Column="+column); + Object value = cleanRecord.get(column.trim()); + // CRITICAL FIX: Don't convert null to string + if (value == null) { + currentRecordValues.add(null); + } else if (value instanceof Boolean) { + currentRecordValues.add(value); + } else { + currentRecordValues.add(String.valueOf(value)); } + } - Object[] objArr = currentRecordValues.toArray(); + Object[] objArr = currentRecordValues.toArray(); - // Add to syncResults first, then track the index - int currentSyncResultIndex = syncResults.size(); - syncResults.add(new SyncResult(schemaName, syncTableName, vanSerialNo, - syncUploadDataDigester.getSyncedBy(), false, "Pending")); // Initially set as success + int currentSyncResultIndex = syncResults.size(); + syncResults.add(new SyncResult(schemaName, syncTableName, vanSerialNo, + syncUploadDataDigester.getSyncedBy(), false, "Pending")); - if (recordCheck == 0) { - // Record doesn't exist - INSERT - insertIndexMap.put(currentSyncResultIndex, syncDataListInsert.size()); - syncDataListInsert.add(objArr); + if (recordCheck == 0) { + insertIndexMap.put(currentSyncResultIndex, syncDataListInsert.size()); + syncDataListInsert.add(objArr); + } else { + List updateParams = new ArrayList<>(Arrays.asList(objArr)); + updateParams.add(String.valueOf(vanSerialNo)); + if (Arrays.asList("t_patientissue", "t_physicalstockentry", "t_stockadjustment", "t_saitemmapping", + "t_stocktransfer", "t_patientreturn", "t_facilityconsumption", "t_indent", + "t_indentorder", "t_indentissue", "t_itemstockentry", "t_itemstockexit") + .contains(syncTableName.toLowerCase()) && cleanRecord.containsKey("SyncFacilityID")) { + logger.info("Adding SyncFacilityID to update params for table {}", syncTableName); + updateParams.add(String.valueOf(cleanRecord.get("SyncFacilityID"))); } else { - // Record exists - UPDATE - List updateParams = new ArrayList<>(Arrays.asList(objArr)); - updateParams.add(String.valueOf(vanSerialNo)); - - if (Arrays.asList("t_patientissue", "t_physicalstockentry", "t_stockadjustment", "t_saitemmapping", - "t_stocktransfer", "t_patientreturn", "t_facilityconsumption", "t_indent", - "t_indentorder", "t_indentissue", "t_itemstockentry", "t_itemstockexit") - .contains(syncTableName.toLowerCase()) && cleanRecord.containsKey("SyncFacilityID")) { - updateParams.add(String.valueOf(cleanRecord.get("SyncFacilityID"))); - } else { - updateParams.add(String.valueOf(vanID)); - } - - updateIndexMap.put(currentSyncResultIndex, syncDataListUpdate.size()); - syncDataListUpdate.add(updateParams.toArray()); + logger.info("Adding VanID to update params for table {}", syncTableName); + updateParams.add(String.valueOf(vanID)); } - } - - boolean insertSuccess = false; - boolean updateSuccess = false; - // Process INSERT operations - if (!syncDataListInsert.isEmpty()) { - String queryInsert = getQueryToInsertDataToServerDB(schemaName, syncTableName, serverColumns); + updateIndexMap.put(currentSyncResultIndex, syncDataListUpdate.size()); + logger.info("Update Params=",updateParams.toArray()); + syncDataListUpdate.add(updateParams.toArray()); + } + } - try { - int[] insertResults = dataSyncRepositoryCentral.syncDataToCentralDB(schemaName, syncTableName, - serverColumns, queryInsert, syncDataListInsert); - - for (Map.Entry entry : insertIndexMap.entrySet()) { - int syncResultIndex = entry.getKey(); - int insertListIndex = entry.getValue(); - - boolean success = insertListIndex < insertResults.length && insertResults[insertListIndex] > 0; - - if (!success) { - String failedVanSerialNo = getVanSerialNo(syncDataListInsert.get(insertListIndex), - vanSerialIndex, - syncResults.get(syncResultIndex)); - String conciseReason = "Insert failed (code: " + - (insertListIndex < insertResults.length ? insertResults[insertListIndex] : "unknown") + - ")"; - syncResults.set(syncResultIndex, new SyncResult(schemaName, syncTableName, failedVanSerialNo, - syncUploadDataDigester.getSyncedBy(), false, conciseReason)); - insertSuccess = false; - } - else { - // ADD THIS ELSE BLOCK - syncResults.set(syncResultIndex, new SyncResult(schemaName, syncTableName, - syncResults.get(syncResultIndex).getVanSerialNo(), - syncUploadDataDigester.getSyncedBy(), true, null)); -} + // FIXED: Initialize as true, set to false only on failures + boolean insertSuccess = true; + boolean updateSuccess = true; + + // Process INSERT operations + if (!syncDataListInsert.isEmpty()) { + String queryInsert = getQueryToInsertDataToServerDB(schemaName, syncTableName, serverColumns); + + try { + int[] insertResults = dataSyncRepositoryCentral.syncDataToCentralDB(schemaName, syncTableName, + serverColumns, queryInsert, syncDataListInsert); + + for (Map.Entry entry : insertIndexMap.entrySet()) { + int syncResultIndex = entry.getKey(); + int insertListIndex = entry.getValue(); + + boolean success = insertListIndex < insertResults.length && insertResults[insertListIndex] > 0; + + if (!success) { + String failedVanSerialNo = getVanSerialNo(syncDataListInsert.get(insertListIndex), + vanSerialIndex, syncResults.get(syncResultIndex)); + String conciseReason = "Insert failed (code: " + + (insertListIndex < insertResults.length ? insertResults[insertListIndex] : "unknown") + ")"; + syncResults.set(syncResultIndex, new SyncResult(schemaName, syncTableName, failedVanSerialNo, + syncUploadDataDigester.getSyncedBy(), false, conciseReason)); + insertSuccess = false; + overallSuccess = false; + } else { + syncResults.set(syncResultIndex, new SyncResult(schemaName, syncTableName, + syncResults.get(syncResultIndex).getVanSerialNo(), + syncUploadDataDigester.getSyncedBy(), true, null)); } + } - } catch (Exception e) { - String mainErrorReason = extractMainErrorReason(e); - - // Check if we can get partial results even with an exception - try { - // Try to check which records actually made it to the database - for (Map.Entry entry : insertIndexMap.entrySet()) { - int syncResultIndex = entry.getKey(); - int insertListIndex = entry.getValue(); - - String vanSerialNo = getVanSerialNo(syncDataListInsert.get(insertListIndex), vanSerialIndex, - syncResults.get(syncResultIndex)); - int vanIDIndex = serverColumnsList.indexOf("VanID"); - String vanID = vanIDIndex >= 0 && vanIDIndex < syncDataListInsert.get(insertListIndex).length - ? String.valueOf(syncDataListInsert.get(insertListIndex)[vanIDIndex]) - : null; + } catch (Exception e) { + String mainErrorReason = extractMainErrorReason(e); + logger.info("Batch insert failed for table {}: {}", syncTableName, mainErrorReason, e); - // Check if this specific record exists in DB now (it might have succeeded before the exception) - int recordExists = dataSyncRepositoryCentral.checkRecordIsAlreadyPresentOrNot( - schemaName, syncTableName, vanSerialNo, vanID, vanAutoIncColumnName, 0); - - if (recordExists > 0) { - // Record exists - it was actually inserted successfully - syncResults.set(syncResultIndex, new SyncResult(schemaName, syncTableName, vanSerialNo, - syncUploadDataDigester.getSyncedBy(), true, null)); - } else { - // Record doesn't exist - it failed + // Mark ALL inserts as failed + for (Map.Entry entry : insertIndexMap.entrySet()) { + int syncResultIndex = entry.getKey(); + int insertListIndex = entry.getValue(); + String vanSerialNo = getVanSerialNo(syncDataListInsert.get(insertListIndex), vanSerialIndex, + syncResults.get(syncResultIndex)); syncResults.set(syncResultIndex, new SyncResult(schemaName, syncTableName, vanSerialNo, syncUploadDataDigester.getSyncedBy(), false, "INSERT: " + mainErrorReason)); } - } - } catch (Exception checkException) { - // If we can't check, mark all as failed - for (Map.Entry entry : insertIndexMap.entrySet()) { - int syncResultIndex = entry.getKey(); - int insertListIndex = entry.getValue(); - String vanSerialNo = getVanSerialNo(syncDataListInsert.get(insertListIndex), vanSerialIndex, - syncResults.get(syncResultIndex)); - syncResults.set(syncResultIndex, new SyncResult(schemaName, syncTableName, vanSerialNo, - syncUploadDataDigester.getSyncedBy(), false, "INSERT: " + mainErrorReason)); + insertSuccess = false; + overallSuccess = false; } } - insertSuccess = false; -} - } - - if (!syncDataListUpdate.isEmpty()) { - String queryUpdate = getQueryToUpdateDataToServerDB(schemaName, serverColumns, syncTableName); - try { - int[] updateResults = dataSyncRepositoryCentral.syncDataToCentralDB(schemaName, syncTableName, - serverColumns, queryUpdate, syncDataListUpdate); - - for (Map.Entry entry : updateIndexMap.entrySet()) { - int syncResultIndex = entry.getKey(); - int updateListIndex = entry.getValue(); - - boolean success = updateListIndex < updateResults.length && updateResults[updateListIndex] > 0; - - if (!success) { - String failedVanSerialNo = getVanSerialNo(syncDataListUpdate.get(updateListIndex), - vanSerialIndex, - syncResults.get(syncResultIndex)); - String conciseReason = "Update failed (code: " + - (updateListIndex < updateResults.length ? updateResults[updateListIndex] : "unknown") + - ")"; - syncResults.set(syncResultIndex, new SyncResult(schemaName, syncTableName, failedVanSerialNo, - syncUploadDataDigester.getSyncedBy(), false, conciseReason)); - updateSuccess = false; - } - else { - // ADD THIS ELSE BLOCK - syncResults.set(syncResultIndex, new SyncResult(schemaName, syncTableName, - syncResults.get(syncResultIndex).getVanSerialNo(), - syncUploadDataDigester.getSyncedBy(), true, null)); -} + // Process UPDATE operations + if (!syncDataListUpdate.isEmpty()) { + String queryUpdate = getQueryToUpdateDataToServerDB(schemaName, serverColumns, syncTableName); + + try { + int[] updateResults = dataSyncRepositoryCentral.syncDataToCentralDB(schemaName, syncTableName, + serverColumns, queryUpdate, syncDataListUpdate); + for (Map.Entry entry : updateIndexMap.entrySet()) { + int syncResultIndex = entry.getKey(); + int updateListIndex = entry.getValue(); + + boolean success = updateListIndex < updateResults.length && updateResults[updateListIndex] > 0; + if (!success) { + Object[] failedParams = syncDataListUpdate.get(updateListIndex); + + logger.info("No rows updated for {}. Query: {} | Params: {}", + syncTableName, queryUpdate, Arrays.toString(failedParams)); + + String failedVanSerialNo = getVanSerialNo(failedParams, vanSerialIndex, + syncResults.get(syncResultIndex)); + String conciseReason = "No matching row (0 rows updated)"; + + syncResults.set(syncResultIndex, new SyncResult(schemaName, syncTableName, failedVanSerialNo, + syncUploadDataDigester.getSyncedBy(), false, conciseReason)); + updateSuccess = false; + overallSuccess = false; + } else { + syncResults.set(syncResultIndex, new SyncResult(schemaName, syncTableName, + syncResults.get(syncResultIndex).getVanSerialNo(), + syncUploadDataDigester.getSyncedBy(), true, null)); } + } - } catch (Exception e) { - String mainErrorReason = extractMainErrorReason(e); - - // Check if we can get partial results even with an exception - try { - // Try to check which records actually made it to the database - for (Map.Entry entry : updateIndexMap.entrySet()) { - int syncResultIndex = entry.getKey(); - int updateListIndex = entry.getValue(); - - String vanSerialNo = getVanSerialNo(syncDataListUpdate.get(updateListIndex), vanSerialIndex, - syncResults.get(syncResultIndex)); - int vanIDIndex = serverColumnsList.indexOf("VanID"); - String vanID = vanIDIndex >= 0 && vanIDIndex < syncDataListUpdate.get(updateListIndex).length - ? String.valueOf(syncDataListUpdate.get(updateListIndex)[vanIDIndex]) - : null; + } catch (Exception e) { + String mainErrorReason = extractMainErrorReason(e); + logger.info("Batch update failed for table {}: {}", syncTableName, mainErrorReason, e); - // Check if this specific record was actually updated in DB - int recordExists = dataSyncRepositoryCentral.checkRecordIsAlreadyPresentOrNot( - schemaName, syncTableName, vanSerialNo, vanID, vanAutoIncColumnName, 0); - - if (recordExists > 0) { - // Record exists and was likely updated successfully - syncResults.set(syncResultIndex, new SyncResult(schemaName, syncTableName, vanSerialNo, - syncUploadDataDigester.getSyncedBy(), true, null)); - } else { - // Record doesn't exist or update failed + // Mark ALL updates as failed + for (Map.Entry entry : updateIndexMap.entrySet()) { + int syncResultIndex = entry.getKey(); + int updateListIndex = entry.getValue(); + String vanSerialNo = getVanSerialNo(syncDataListUpdate.get(updateListIndex), vanSerialIndex, + syncResults.get(syncResultIndex)); syncResults.set(syncResultIndex, new SyncResult(schemaName, syncTableName, vanSerialNo, syncUploadDataDigester.getSyncedBy(), false, "UPDATE: " + mainErrorReason)); } - } - } catch (Exception checkException) { - // If we can't check, mark all as failed - for (Map.Entry entry : updateIndexMap.entrySet()) { - int syncResultIndex = entry.getKey(); - int updateListIndex = entry.getValue(); - String vanSerialNo = getVanSerialNo(syncDataListUpdate.get(updateListIndex), vanSerialIndex, - syncResults.get(syncResultIndex)); - syncResults.set(syncResultIndex, new SyncResult(schemaName, syncTableName, vanSerialNo, - syncUploadDataDigester.getSyncedBy(), false, "UPDATE: " + mainErrorReason)); + updateSuccess = false; + overallSuccess = false; } } - updateSuccess = false; -} - } - - logger.info("Sync results for table {}: {}", syncTableName, syncResults); - return insertSuccess && updateSuccess; - } + logger.info("Sync results for table {}: {}", syncTableName, syncResults); + return overallSuccess; +} + private String getVanSerialNo(Object[] record, int vanSerialIndex, SyncResult originalResult) { if (vanSerialIndex >= 0 && vanSerialIndex < record.length) { return String.valueOf(record[vanSerialIndex]); diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 2e6ce84f..c2e28213 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -4,10 +4,10 @@ spring.datasource.tomcat.max-idle=15 spring.datasource.tomcat.min-idle=5 spring.datasource.tomcat.min-evictable-idle-time-millis=15000 spring.datasource.tomcat.remove-abandoned=true -spring.datasource.tomcat.remove-abandoned-timeout=1800 +spring.datasource.tomcat.remove-abandoned-timeout=300 spring.datasource.tomcat.logAbandoned=true spring.datasource.continue-on-error=true -spring.datasource.tomcat.max-wait=60000 +spring.datasource.tomcat.max-wait=180000 ## below line added by neeraj for reset abandoned DB connection from connection pool @@ -53,3 +53,16 @@ spring.datasource.tomcat.testOnBorrow=true spring.datasource.tomcat.validationQuery=SELECT 1 spring.datasource.tomcat.validationInterval=30000 # 30 sec logging.level.org.apache.tomcat.jdbc.pool=DEBUG + +# Connection timeout - time to establish connection +spring.mvc.async.request-timeout=600000 +# HTTP client timeouts for RestTemplate +rest.connection.timeout=60000 +rest.read.timeout=600000 +rest.socket.timeout=600000 + + +# ============= SERVER TIMEOUT ============= +# Tomcat connection timeout +server.connection-timeout=600000 +server.tomcat.connection-timeout=600000 From 3db94c99c4ba64ba34ad028ec2c29319e43d1ee8 Mon Sep 17 00:00:00 2001 From: Vanitha S <116701245+vanitha1822@users.noreply.github.com> Date: Fri, 3 Oct 2025 17:01:35 +0530 Subject: [PATCH 29/47] fix: update van serial no (#124) --- .../mmu/repo/quickConsultation/PrescriptionDetailRepo.java | 6 ++++++ .../service/common/transaction/CommonNurseServiceImpl.java | 2 ++ 2 files changed, 8 insertions(+) diff --git a/src/main/java/com/iemr/mmu/repo/quickConsultation/PrescriptionDetailRepo.java b/src/main/java/com/iemr/mmu/repo/quickConsultation/PrescriptionDetailRepo.java index 6bc2350e..5010ea91 100644 --- a/src/main/java/com/iemr/mmu/repo/quickConsultation/PrescriptionDetailRepo.java +++ b/src/main/java/com/iemr/mmu/repo/quickConsultation/PrescriptionDetailRepo.java @@ -83,4 +83,10 @@ public int updatePrescription(@Param("diagnosisProvided") String diagnosisProvid @Param("diagnosisProvided_SCTCode") String diagnosisProvided_SCTCode, @Param("diagnosisProvided_SCTTerm") String diagnosisProvided_SCTTerm); + @Transactional + @Modifying + @Query(" UPDATE PrescriptionDetail set vanSerialNo = :prescriptionID WHERE prescriptionID = :prescriptionID") + int updateVanSerialNo(@Param("prescriptionID") Long prescriptionID); + + } diff --git a/src/main/java/com/iemr/mmu/service/common/transaction/CommonNurseServiceImpl.java b/src/main/java/com/iemr/mmu/service/common/transaction/CommonNurseServiceImpl.java index 0fedb10d..b2662874 100644 --- a/src/main/java/com/iemr/mmu/service/common/transaction/CommonNurseServiceImpl.java +++ b/src/main/java/com/iemr/mmu/service/common/transaction/CommonNurseServiceImpl.java @@ -2685,6 +2685,8 @@ public Long saveBenPrescription(PrescriptionDetail prescription) { } PrescriptionDetail prescriptionRS = prescriptionDetailRepo.save(prescription); + prescriptionDetailRepo.updateVanSerialNo(prescriptionRS.getPrescriptionID()); + if (prescriptionRS != null && prescriptionRS.getPrescriptionID() > 0) { r = prescriptionRS.getPrescriptionID(); } From d621130eefee52c6cdc06e0a50858b387f21c2d4 Mon Sep 17 00:00:00 2001 From: Vanitha S <116701245+vanitha1822@users.noreply.github.com> Date: Fri, 3 Oct 2025 19:46:50 +0530 Subject: [PATCH 30/47] fix: ui change (#125) --- .../UploadDataToServerImpl.java | 984 +++++++++--------- 1 file changed, 506 insertions(+), 478 deletions(-) diff --git a/src/main/java/com/iemr/mmu/service/dataSyncActivity/UploadDataToServerImpl.java b/src/main/java/com/iemr/mmu/service/dataSyncActivity/UploadDataToServerImpl.java index 6093e51f..b8fdbf5b 100644 --- a/src/main/java/com/iemr/mmu/service/dataSyncActivity/UploadDataToServerImpl.java +++ b/src/main/java/com/iemr/mmu/service/dataSyncActivity/UploadDataToServerImpl.java @@ -72,534 +72,562 @@ @Service @PropertySource("classpath:application.properties") public class UploadDataToServerImpl implements UploadDataToServer { - private Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName()); - // rest URLs from server to consume local van data and to sync to DB server - @Value("${dataSyncUploadUrl}") - private String dataSyncUploadUrl; - - @Value("${BATCH_SIZE}") - private int BATCH_SIZE; - - @Autowired - private DataSyncRepository dataSyncRepository; - @Autowired - private DataSyncGroupsRepo dataSyncGroupsRepo; - @Autowired - private MasterVanRepo masterVanRepo; - - @Autowired - private SyncUtilityClassRepo syncutilityClassRepo; - @Autowired - private CookieUtil cookieUtil; -boolean criticalTableFailure = false; // Add this flag - - /** - * - * @param groupName - * @param Authorization - * @return - */ - public String getDataToSyncToServer(int vanID, String user, String Authorization, String token) throws Exception { - String syncData = null; - syncData = syncIntercepter(vanID, user, Authorization, token); - return syncData; - } - - /** - * - * @param Authorization - * @return - */ - public String syncIntercepter(int vanID, String user, String Authorization, String token) throws Exception { - // sync activity trigger - String serverAcknowledgement = startDataSync(vanID, user, Authorization, token); - return serverAcknowledgement; - } - - /** - * Enhanced startDataSync method with table-level and group-level tracking - * - * @param syncTableDetailsIDs - * @param Authorization - * @return - */ - - private String startDataSync(int vanID, String user, String Authorization, String token) throws Exception { - String serverAcknowledgement = null; - List> responseStatus = new ArrayList<>(); - ObjectMapper objectMapper = new ObjectMapper(); - - // fetch group masters - List dataSyncGroupList = dataSyncGroupsRepo.findByDeleted(false); - logger.debug("Fetched DataSyncGroups: {}", - objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(dataSyncGroupList)); - - for (DataSyncGroups dataSyncGroups : dataSyncGroupList) { - int groupId = dataSyncGroups.getSyncTableGroupID(); - String groupName = dataSyncGroups.getSyncTableGroupName(); - - List syncUtilityClassList = getVanAndServerColumns(groupId); - logger.debug("Fetched SyncUtilityClass for groupId {}: {}", groupId, - objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(syncUtilityClassList)); - - // Track table-level results for this group - List> tableDetailsList = new ArrayList<>(); - boolean groupHasFailures = false; - boolean groupHasCriticalFailure = false; // Track critical failures at group level - - for (SyncUtilityClass obj : syncUtilityClassList) { - String tableKey = obj.getSchemaName() + "." + obj.getTableName(); - boolean tableHasError = false; - - // get data from DB to sync to server - List> syncData = getDataToSync(obj.getSchemaName(), obj.getTableName(), - obj.getVanColumnName()); - logger.debug("Fetched syncData for schema {} and table {}: {}", obj.getSchemaName(), obj.getTableName(), - objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(syncData)); - - if (syncData != null && syncData.size() > 0) { - int dataSize = syncData.size(); - int startIndex = 0; - int fullBatchCount = dataSize / BATCH_SIZE; - int remainder = dataSize % BATCH_SIZE; - - // Track table-level success/failure counts - int totalRecords = dataSize; - int successfulRecords = 0; - int failedRecords = 0; - List tableFailureReasons = new ArrayList<>(); - - logger.info("Starting batch sync for schema: {}, table: {} with {} full batches and {} remainder", - obj.getSchemaName(), obj.getTableName(), fullBatchCount, remainder); - - // Process full batches - for (int i = 0; i < fullBatchCount && !tableHasError; i++) { - List> syncDataBatch = getBatchOfAskedSizeDataToSync(syncData, startIndex, - BATCH_SIZE); - - Map syncResult = syncDataToServer(vanID, obj.getSchemaName(), obj.getTableName(), - obj.getVanAutoIncColumnName(), obj.getServerColumnName(), syncDataBatch, user, - Authorization, token); - - if (syncResult == null) { - logger.error("Sync failed for batch {} in schema: {}, table: {}", i, obj.getSchemaName(), - obj.getTableName()); - tableHasError = true; - failedRecords += syncDataBatch.size(); - groupHasFailures = true; - tableFailureReasons.add("Batch " + i + " sync returned null response"); - break; - } - - String status = (String) syncResult.get("status"); - int batchSuccessCount = (Integer) syncResult.get("successCount"); - int batchFailCount = (Integer) syncResult.get("failCount"); - @SuppressWarnings("unchecked") - List batchFailureReasons = (List) syncResult.get("failureReasons"); - - successfulRecords += batchSuccessCount; - failedRecords += batchFailCount; - - if (batchFailureReasons != null && !batchFailureReasons.isEmpty()) { - tableFailureReasons.addAll(batchFailureReasons); - groupHasFailures = true; - } - - if (status.equals("Sync failed")) { - tableHasError = true; - break; - } + private Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName()); + // rest URLs from server to consume local van data and to sync to DB server + @Value("${dataSyncUploadUrl}") + private String dataSyncUploadUrl; + + @Value("${BATCH_SIZE}") + private int BATCH_SIZE; + + @Autowired + private DataSyncRepository dataSyncRepository; + @Autowired + private DataSyncGroupsRepo dataSyncGroupsRepo; + @Autowired + private MasterVanRepo masterVanRepo; + + @Autowired + private SyncUtilityClassRepo syncutilityClassRepo; + @Autowired + private CookieUtil cookieUtil; + boolean criticalTableFailure = false; // Add this flag + + /** + * + * @param groupName + * @param Authorization + * @return + */ + public String getDataToSyncToServer(int vanID, String user, String Authorization, String token) throws Exception { + String syncData = null; + syncData = syncIntercepter(vanID, user, Authorization, token); + return syncData; + } - startIndex += BATCH_SIZE; - } + /** + * + * @param Authorization + * @return + */ + public String syncIntercepter(int vanID, String user, String Authorization, String token) throws Exception { + // sync activity trigger + String serverAcknowledgement = startDataSync(vanID, user, Authorization, token); + return serverAcknowledgement; + } + + /** + * Enhanced startDataSync method with table-level and group-level tracking + * + * @param syncTableDetailsIDs + * @param Authorization + * @return + */ + + private String startDataSync(int vanID, String user, String Authorization, String token) throws Exception { + String serverAcknowledgement = null; + List> responseStatus = new ArrayList<>(); + ObjectMapper objectMapper = new ObjectMapper(); + + // fetch group masters + List dataSyncGroupList = dataSyncGroupsRepo.findByDeleted(false); + logger.debug("Fetched DataSyncGroups: {}", + objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(dataSyncGroupList)); + + for (DataSyncGroups dataSyncGroups : dataSyncGroupList) { + int groupId = dataSyncGroups.getSyncTableGroupID(); + String groupName = dataSyncGroups.getSyncTableGroupName(); + + List syncUtilityClassList = getVanAndServerColumns(groupId); + logger.debug("Fetched SyncUtilityClass for groupId {}: {}", groupId, + objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(syncUtilityClassList)); + + // Track table-level results for this group + List> tableDetailsList = new ArrayList<>(); + boolean groupHasFailures = false; + boolean groupHasCriticalFailure = false; // Track critical failures at group level + + for (SyncUtilityClass obj : syncUtilityClassList) { + String tableKey = obj.getSchemaName() + "." + obj.getTableName(); + boolean tableHasError = false; + + // get data from DB to sync to server + List> syncData = getDataToSync(obj.getSchemaName(), obj.getTableName(), + obj.getVanColumnName()); + logger.debug("Fetched syncData for schema {} and table {}: {}", obj.getSchemaName(), obj.getTableName(), + objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(syncData)); + + if (syncData != null && syncData.size() > 0) { + int dataSize = syncData.size(); + int startIndex = 0; + int fullBatchCount = dataSize / BATCH_SIZE; + int remainder = dataSize % BATCH_SIZE; + + // Track table-level success/failure counts + int totalRecords = dataSize; + int successfulRecords = 0; + int failedRecords = 0; + List tableFailureReasons = new ArrayList<>(); + + logger.info("Starting batch sync for schema: {}, table: {} with {} full batches and {} remainder", + obj.getSchemaName(), obj.getTableName(), fullBatchCount, remainder); + + // Process full batches + for (int i = 0; i < fullBatchCount && !tableHasError; i++) { + List> syncDataBatch = getBatchOfAskedSizeDataToSync(syncData, startIndex, + BATCH_SIZE); + + Map syncResult = syncDataToServer(vanID, obj.getSchemaName(), + obj.getTableName(), + obj.getVanAutoIncColumnName(), obj.getServerColumnName(), syncDataBatch, user, + Authorization, token); + + if (syncResult == null) { + logger.error("Sync failed for batch {} in schema: {}, table: {}", i, obj.getSchemaName(), + obj.getTableName()); + tableHasError = true; + failedRecords += syncDataBatch.size(); + groupHasFailures = true; + tableFailureReasons.add("Batch " + i + " sync returned null response"); + break; + } - // Process remainder batch if no error in full batches - if (!tableHasError && remainder > 0) { - List> syncDataBatch = getBatchOfAskedSizeDataToSync(syncData, startIndex, - remainder); - - Map syncResult = syncDataToServer(vanID, obj.getSchemaName(), obj.getTableName(), - obj.getVanAutoIncColumnName(), obj.getServerColumnName(), syncDataBatch, user, - Authorization, token); - - if (syncResult == null) { - logger.error("Sync failed for remaining data in schema: {}, table: {}", obj.getSchemaName(), - obj.getTableName()); - failedRecords += syncDataBatch.size(); - groupHasFailures = true; - tableFailureReasons.add("Remainder batch sync returned null response"); - } else { String status = (String) syncResult.get("status"); int batchSuccessCount = (Integer) syncResult.get("successCount"); int batchFailCount = (Integer) syncResult.get("failCount"); @SuppressWarnings("unchecked") List batchFailureReasons = (List) syncResult.get("failureReasons"); - + successfulRecords += batchSuccessCount; failedRecords += batchFailCount; - + if (batchFailureReasons != null && !batchFailureReasons.isEmpty()) { tableFailureReasons.addAll(batchFailureReasons); groupHasFailures = true; } - + if (status.equals("Sync failed")) { + tableHasError = true; + break; + } + + startIndex += BATCH_SIZE; + } + + // Process remainder batch if no error in full batches + if (!tableHasError && remainder > 0) { + List> syncDataBatch = getBatchOfAskedSizeDataToSync(syncData, startIndex, + remainder); + + Map syncResult = syncDataToServer(vanID, obj.getSchemaName(), + obj.getTableName(), + obj.getVanAutoIncColumnName(), obj.getServerColumnName(), syncDataBatch, user, + Authorization, token); + + if (syncResult == null) { + logger.error("Sync failed for remaining data in schema: {}, table: {}", obj.getSchemaName(), + obj.getTableName()); + failedRecords += syncDataBatch.size(); groupHasFailures = true; + tableFailureReasons.add("Remainder batch sync returned null response"); + } else { + String status = (String) syncResult.get("status"); + int batchSuccessCount = (Integer) syncResult.get("successCount"); + int batchFailCount = (Integer) syncResult.get("failCount"); + @SuppressWarnings("unchecked") + List batchFailureReasons = (List) syncResult.get("failureReasons"); + + successfulRecords += batchSuccessCount; + failedRecords += batchFailCount; + + if (batchFailureReasons != null && !batchFailureReasons.isEmpty()) { + tableFailureReasons.addAll(batchFailureReasons); + groupHasFailures = true; + } + + if (status.equals("Sync failed")) { + groupHasFailures = true; + } } } - } - // Determine table status - String tableStatus; - if (successfulRecords == totalRecords && failedRecords == 0) { - tableStatus = "success"; - } else if (failedRecords == totalRecords && successfulRecords == 0) { - tableStatus = "failed"; - groupHasCriticalFailure = true; // Mark as critical failure - groupHasFailures = true; - } else if (successfulRecords > 0 && failedRecords > 0) { - tableStatus = "partial"; - groupHasFailures = true; - } else { - tableStatus = "failed"; - groupHasCriticalFailure = true; - groupHasFailures = true; - } + // Determine table status + String tableStatus; + if (successfulRecords == totalRecords && failedRecords == 0) { + tableStatus = "success"; + } else if (failedRecords == totalRecords && successfulRecords == 0) { + tableStatus = "failed"; + // groupHasCriticalFailure = true; // Mark as critical failure + groupHasFailures = true; + } else if (successfulRecords > 0 && failedRecords > 0) { + tableStatus = "partial"; + groupHasFailures = true; + } else { + tableStatus = "failed"; + // groupHasCriticalFailure = true; + groupHasFailures = true; + } - // Create detailed table info with failure reasons - Map tableDetails = new HashMap<>(); - tableDetails.put("tableName", obj.getTableName()); - tableDetails.put("schemaName", obj.getSchemaName()); - tableDetails.put("status", tableStatus); - tableDetails.put("totalRecords", totalRecords); - tableDetails.put("successfulRecords", successfulRecords); - tableDetails.put("failedRecords", failedRecords); - - // Add failure reasons only if there are any failures - if (!tableFailureReasons.isEmpty()) { - tableDetails.put("failureReasons", tableFailureReasons); + // Create detailed table info with failure reasons + Map tableDetails = new HashMap<>(); + tableDetails.put("tableName", obj.getTableName()); + tableDetails.put("schemaName", obj.getSchemaName()); + tableDetails.put("status", tableStatus); + tableDetails.put("totalRecords", totalRecords); + tableDetails.put("successfulRecords", successfulRecords); + tableDetails.put("failedRecords", failedRecords); + + // Add failure reasons only if there are any failures + if (!tableFailureReasons.isEmpty()) { + tableDetails.put("failureReasons", tableFailureReasons); + } + + tableDetailsList.add(tableDetails); + + logger.info("Table sync summary - {}: {} (Success: {}, Failed: {}, Total: {}, Failure Reasons: {})", + tableKey, tableStatus, successfulRecords, failedRecords, totalRecords, + tableFailureReasons.isEmpty() ? "None" : tableFailureReasons); + + } else { + logger.info("No data to sync for schema {} and table {}", obj.getSchemaName(), obj.getTableName()); + + Map tableDetails = new HashMap<>(); + tableDetails.put("tableName", obj.getTableName()); + tableDetails.put("schemaName", obj.getSchemaName()); + tableDetails.put("status", "no_data"); + tableDetails.put("totalRecords", 0); + tableDetails.put("successfulRecords", 0); + tableDetails.put("failedRecords", 0); + tableDetailsList.add(tableDetails); } - - tableDetailsList.add(tableDetails); - logger.info("Table sync summary - {}: {} (Success: {}, Failed: {}, Total: {}, Failure Reasons: {})", - tableKey, tableStatus, successfulRecords, failedRecords, totalRecords, - tableFailureReasons.isEmpty() ? "None" : tableFailureReasons); + // Continue processing all tables in the group - NO BREAK HERE + } + // Determine overall group status based on table results + // String groupStatus; + // long successTables = tableDetailsList.stream() + // .filter(table -> "success".equals(table.get("status")) || + // "no_data".equals(table.get("status"))) + // .count(); + // long partialTables = tableDetailsList.stream() + // .filter(table -> "partial".equals(table.get("status"))) + // .count(); + // long failedTables = tableDetailsList.stream() + // .filter(table -> "failed".equals(table.get("status"))) + // .count(); + + // if (groupHasCriticalFailure) { + // // If group has critical failure (100% failed tables), mark as failed + // groupStatus = "failed"; + // } else if (failedTables == 0 && partialTables == 0) { + // // All tables succeeded or had no data + // groupStatus = "completed"; + // } else if (failedTables > 0 && successTables == 0 && partialTables == 0) { + // // All tables failed + // groupStatus = "failed"; + // } else { + // // Mixed results - some success, some partial, some failed + // groupStatus = "partial"; + // } + + // Determine overall group status based on table results + String groupStatus; + long successTables = tableDetailsList.stream() + .filter(table -> "success".equals(table.get("status")) || "no_data".equals(table.get("status"))) + .count(); + long partialTables = tableDetailsList.stream() + .filter(table -> "partial".equals(table.get("status"))) + .count(); + long failedTables = tableDetailsList.stream() + .filter(table -> "failed".equals(table.get("status"))) + .count(); + + if (failedTables == 0 && partialTables == 0) { + // All tables succeeded or had no data + groupStatus = "completed"; + } else if (failedTables == tableDetailsList.size()) { + // ALL tables failed (100% failure at group level) + groupStatus = "failed"; + } else if (successTables > 0 && (failedTables > 0 || partialTables > 0)) { + // Mixed results - some success with some failures/partials + groupStatus = "partial"; + } else if (partialTables > 0 && failedTables == 0) { + // Only partial and success tables (no complete failures) + groupStatus = "partial"; } else { - logger.info("No data to sync for schema {} and table {}", obj.getSchemaName(), obj.getTableName()); - - Map tableDetails = new HashMap<>(); - tableDetails.put("tableName", obj.getTableName()); - tableDetails.put("schemaName", obj.getSchemaName()); - tableDetails.put("status", "no_data"); - tableDetails.put("totalRecords", 0); - tableDetails.put("successfulRecords", 0); - tableDetails.put("failedRecords", 0); - tableDetailsList.add(tableDetails); + // All other mixed scenarios + groupStatus = "partial"; } - - // Continue processing all tables in the group - NO BREAK HERE + // Create group response + Map groupResponse = new HashMap<>(); + groupResponse.put("syncTableGroupID", groupId); + groupResponse.put("syncTableGroupName", groupName != null ? groupName : "Group " + groupId); + groupResponse.put("status", groupStatus); + groupResponse.put("tables", tableDetailsList); + groupResponse.put("summary", Map.of( + "totalTables", tableDetailsList.size(), + "successfulTables", successTables, + "partialTables", partialTables, + "failedTables", failedTables)); + + responseStatus.add(groupResponse); + + // Continue to next group - NO BREAK HERE, process ALL groups } - // Determine overall group status based on table results - String groupStatus; - long successTables = tableDetailsList.stream() - .filter(table -> "success".equals(table.get("status")) || "no_data".equals(table.get("status"))) - .count(); - long partialTables = tableDetailsList.stream() - .filter(table -> "partial".equals(table.get("status"))) - .count(); - long failedTables = tableDetailsList.stream() - .filter(table -> "failed".equals(table.get("status"))) - .count(); - - if (groupHasCriticalFailure) { - // If group has critical failure (100% failed tables), mark as failed - groupStatus = "failed"; - } else if (failedTables == 0 && partialTables == 0) { - // All tables succeeded or had no data - groupStatus = "completed"; - } else if (failedTables > 0 && successTables == 0 && partialTables == 0) { - // All tables failed - groupStatus = "failed"; + // Create final response + Map finalResponse = new HashMap<>(); + + // Check if any group failed completely + boolean anyGroupFailed = responseStatus.stream() + .anyMatch(group -> "failed".equals(((Map) group).get("status"))); + + // Check if there was any data to sync + boolean hasData = responseStatus.stream() + .anyMatch(group -> { + @SuppressWarnings("unchecked") + List> tables = (List>) ((Map) group) + .get("tables"); + return tables.stream().anyMatch(table -> !("no_data".equals(table.get("status")))); + }); + + if (!hasData) { + return "No data to sync"; + } else if (anyGroupFailed) { + finalResponse.put("response", "Data sync completed with failures"); + finalResponse.put("groupsProgress", responseStatus); + return objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(finalResponse); } else { - // Mixed results - some success, some partial, some failed - groupStatus = "partial"; + finalResponse.put("response", "Data sync completed successfully"); + finalResponse.put("groupsProgress", responseStatus); + return objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(finalResponse); } + } - // Create group response - Map groupResponse = new HashMap<>(); - groupResponse.put("syncTableGroupID", groupId); - groupResponse.put("syncTableGroupName", groupName != null ? groupName : "Group " + groupId); - groupResponse.put("status", groupStatus); - groupResponse.put("tables", tableDetailsList); - groupResponse.put("summary", Map.of( - "totalTables", tableDetailsList.size(), - "successfulTables", successTables, - "partialTables", partialTables, - "failedTables", failedTables)); - - responseStatus.add(groupResponse); - - // Continue to next group - NO BREAK HERE, process ALL groups + private List getVanAndServerColumns(Integer groupID) throws Exception { + List syncUtilityClassList = getVanAndServerColumnList(groupID); + logger.debug("Fetched SyncUtilityClass list for groupID {}: {}", groupID, syncUtilityClassList); + return syncUtilityClassList; } - // Create final response - Map finalResponse = new HashMap<>(); - - // Check if any group failed completely - boolean anyGroupFailed = responseStatus.stream() - .anyMatch(group -> "failed".equals(((Map) group).get("status"))); - - // Check if there was any data to sync - boolean hasData = responseStatus.stream() - .anyMatch(group -> { - @SuppressWarnings("unchecked") - List> tables = (List>) ((Map) group) - .get("tables"); - return tables.stream().anyMatch(table -> !("no_data".equals(table.get("status")))); - }); - - if (!hasData) { - return "No data to sync"; - } else if (anyGroupFailed) { - finalResponse.put("response", "Data sync completed with failures"); - finalResponse.put("groupsProgress", responseStatus); - return objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(finalResponse); - } else { - finalResponse.put("response", "Data sync completed successfully"); - finalResponse.put("groupsProgress", responseStatus); - return objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(finalResponse); + public List getVanAndServerColumnList(Integer groupID) throws Exception { + List syncUtilityClassList = syncutilityClassRepo + .findBySyncTableGroupIDAndDeletedOrderBySyncTableDetailID(groupID, false); + logger.debug("Fetched SyncUtilityClass list from repository for groupID {}: {}", groupID, syncUtilityClassList); + return syncUtilityClassList; } -} - - - private List getVanAndServerColumns(Integer groupID) throws Exception { - List syncUtilityClassList = getVanAndServerColumnList(groupID); - logger.debug("Fetched SyncUtilityClass list for groupID {}: {}", groupID, syncUtilityClassList); - return syncUtilityClassList; - } - - public List getVanAndServerColumnList(Integer groupID) throws Exception { - List syncUtilityClassList = syncutilityClassRepo - .findBySyncTableGroupIDAndDeletedOrderBySyncTableDetailID(groupID, false); - logger.debug("Fetched SyncUtilityClass list from repository for groupID {}: {}", groupID, syncUtilityClassList); - return syncUtilityClassList; - } - - private List> getDataToSync(String schemaName, String tableName, String columnNames) - throws Exception { - logger.info("Fetching data to sync for schema: {}, table: {}, columns: {}", schemaName, tableName, columnNames); - List> resultSetList = dataSyncRepository.getDataForGivenSchemaAndTable(schemaName, - tableName, columnNames); - if (resultSetList != null) { - logger.debug("Fetched {} records for schema '{}', table '{}'", resultSetList.size(), schemaName, tableName); - if (!resultSetList.isEmpty()) { - logger.debug("Sample record: {}", resultSetList.get(0)); - } - } else { - logger.debug("No records found for schema '{}', table '{}'", schemaName, tableName); - } - return resultSetList; - } - - private List> getBatchOfAskedSizeDataToSync(List> syncData, int startIndex, - int size) throws Exception { - List> syncDataOfBatchSize = syncData.subList(startIndex, (startIndex + size)); - return syncDataOfBatchSize; - } - -public Map syncDataToServer(int vanID, String schemaName, String tableName, - String vanAutoIncColumnName, String serverColumns, List> dataToBesync, - String user, String Authorization, String token) throws Exception { - - RestTemplate restTemplate = new RestTemplate(); - - // Configure timeouts - SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); - factory.setConnectTimeout(60000); // 60 seconds to connect - factory.setReadTimeout(600000); // 10 minutes to read response - restTemplate.setRequestFactory(factory); - - Integer facilityID = masterVanRepo.getFacilityID(vanID); - - GsonBuilder gsonBuilder = new GsonBuilder(); - gsonBuilder.serializeNulls(); - Gson gson = gsonBuilder.create(); - - Map dataMap = new HashMap<>(); - dataMap.put("schemaName", schemaName); - dataMap.put("tableName", tableName); - dataMap.put("vanAutoIncColumnName", vanAutoIncColumnName); - dataMap.put("serverColumns", serverColumns); - dataMap.put("syncData", dataToBesync); - dataMap.put("syncedBy", user); - if (facilityID != null) - dataMap.put("facilityID", facilityID); - - String requestOBJ = gson.toJson(dataMap); - HttpEntity request = RestTemplateUtil.createRequestEntity(requestOBJ, Authorization, "datasync"); - - logger.info("Syncing {} records for table {}", dataToBesync.size(), tableName); - - int successCount = 0; - int failCount = 0; - List successVanSerialNos = new ArrayList<>(); - List failedVanSerialNos = new ArrayList<>(); - List failureReasons = new ArrayList<>(); - - try { - ResponseEntity response = restTemplate.exchange(dataSyncUploadUrl, HttpMethod.POST, - request, String.class); - - logger.info("Response from server: status={}, hasBody={}, getBody={}", - response.getStatusCode(), response.hasBody(), response.getBody()); - - - if (response != null && response.hasBody()) { - try { - JSONObject obj = new JSONObject(response.getBody()); - - int statusCode = obj.optInt("statusCode", 200); - String errorMessage = obj.optString("errorMessage", ""); - - // Check for ACTUAL errors - status >= 400 OR errorMessage is not "Success" - if (statusCode >= 400 || (!errorMessage.isEmpty() && !errorMessage.equalsIgnoreCase("Success"))) { - logger.error("Server returned error: {}", errorMessage); - - // Mark all as failed - for (Map map : dataToBesync) { - failedVanSerialNos.add(String.valueOf(map.get(vanAutoIncColumnName))); - failureReasons.add(errorMessage); + + private List> getDataToSync(String schemaName, String tableName, String columnNames) + throws Exception { + logger.info("Fetching data to sync for schema: {}, table: {}, columns: {}", schemaName, tableName, columnNames); + List> resultSetList = dataSyncRepository.getDataForGivenSchemaAndTable(schemaName, + tableName, columnNames); + if (resultSetList != null) { + logger.debug("Fetched {} records for schema '{}', table '{}'", resultSetList.size(), schemaName, tableName); + if (!resultSetList.isEmpty()) { + logger.debug("Sample record: {}", resultSetList.get(0)); } - failCount = failedVanSerialNos.size(); - - } else if (obj.has("data")) { - JSONObject dataObj = obj.getJSONObject("data"); - - if (dataObj.has("records")) { - JSONArray recordsArr = dataObj.getJSONArray("records"); - for (int i = 0; i < recordsArr.length(); i++) { - JSONObject record = recordsArr.getJSONObject(i); - String vanSerialNo = record.getString("vanSerialNo"); - boolean success = record.getBoolean("success"); - - if (success) { - successVanSerialNos.add(vanSerialNo); - successCount++; - } else { - failedVanSerialNos.add(vanSerialNo); - failCount++; - String reason = record.optString("reason", "Unknown error"); - failureReasons.add(reason); - } - } - } else if (tableName.equalsIgnoreCase("m_beneficiaryregidmapping")) { - String respMsg = dataObj.optString("response", ""); - - if (respMsg.toLowerCase().contains("success") && statusCode == 200) { - for (Map map : dataToBesync) { - successVanSerialNos.add(String.valueOf(map.get(vanAutoIncColumnName))); + } else { + logger.debug("No records found for schema '{}', table '{}'", schemaName, tableName); + } + return resultSetList; + } + + private List> getBatchOfAskedSizeDataToSync(List> syncData, int startIndex, + int size) throws Exception { + List> syncDataOfBatchSize = syncData.subList(startIndex, (startIndex + size)); + return syncDataOfBatchSize; + } + + public Map syncDataToServer(int vanID, String schemaName, String tableName, + String vanAutoIncColumnName, String serverColumns, List> dataToBesync, + String user, String Authorization, String token) throws Exception { + + RestTemplate restTemplate = new RestTemplate(); + + // Configure timeouts + SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); + factory.setConnectTimeout(60000); // 60 seconds to connect + factory.setReadTimeout(600000); // 10 minutes to read response + restTemplate.setRequestFactory(factory); + + Integer facilityID = masterVanRepo.getFacilityID(vanID); + + GsonBuilder gsonBuilder = new GsonBuilder(); + gsonBuilder.serializeNulls(); + Gson gson = gsonBuilder.create(); + + Map dataMap = new HashMap<>(); + dataMap.put("schemaName", schemaName); + dataMap.put("tableName", tableName); + dataMap.put("vanAutoIncColumnName", vanAutoIncColumnName); + dataMap.put("serverColumns", serverColumns); + dataMap.put("syncData", dataToBesync); + dataMap.put("syncedBy", user); + if (facilityID != null) + dataMap.put("facilityID", facilityID); + + String requestOBJ = gson.toJson(dataMap); + HttpEntity request = RestTemplateUtil.createRequestEntity(requestOBJ, Authorization, "datasync"); + + logger.info("Syncing {} records for table {}", dataToBesync.size(), tableName); + + int successCount = 0; + int failCount = 0; + List successVanSerialNos = new ArrayList<>(); + List failedVanSerialNos = new ArrayList<>(); + List failureReasons = new ArrayList<>(); + + try { + ResponseEntity response = restTemplate.exchange(dataSyncUploadUrl, HttpMethod.POST, + request, String.class); + + logger.info("Response from server: status={}, hasBody={}, getBody={}", + response.getStatusCode(), response.hasBody(), response.getBody()); + + if (response != null && response.hasBody()) { + try { + JSONObject obj = new JSONObject(response.getBody()); + + int statusCode = obj.optInt("statusCode", 200); + String errorMessage = obj.optString("errorMessage", ""); + + // Check for ACTUAL errors - status >= 400 OR errorMessage is not "Success" + if (statusCode >= 400 || (!errorMessage.isEmpty() && !errorMessage.equalsIgnoreCase("Success"))) { + logger.error("Server returned error: {}", errorMessage); + + // Mark all as failed + for (Map map : dataToBesync) { + failedVanSerialNos.add(String.valueOf(map.get(vanAutoIncColumnName))); + failureReasons.add(errorMessage); + } + failCount = failedVanSerialNos.size(); + + } else if (obj.has("data")) { + JSONObject dataObj = obj.getJSONObject("data"); + + if (dataObj.has("records")) { + JSONArray recordsArr = dataObj.getJSONArray("records"); + for (int i = 0; i < recordsArr.length(); i++) { + JSONObject record = recordsArr.getJSONObject(i); + String vanSerialNo = record.getString("vanSerialNo"); + boolean success = record.getBoolean("success"); + + if (success) { + successVanSerialNos.add(vanSerialNo); + successCount++; + } else { + failedVanSerialNos.add(vanSerialNo); + failCount++; + String reason = record.optString("reason", "Unknown error"); + failureReasons.add(reason); + } + } + } else if (tableName.equalsIgnoreCase("m_beneficiaryregidmapping")) { + String respMsg = dataObj.optString("response", ""); + + if (respMsg.toLowerCase().contains("success") && statusCode == 200) { + for (Map map : dataToBesync) { + successVanSerialNos.add(String.valueOf(map.get(vanAutoIncColumnName))); + } + successCount = successVanSerialNos.size(); + } else { + for (Map map : dataToBesync) { + failedVanSerialNos.add(String.valueOf(map.get(vanAutoIncColumnName))); + failureReasons.add(respMsg.isEmpty() ? "Sync failed" : respMsg); + } + failCount = failedVanSerialNos.size(); + } + } } - successCount = successVanSerialNos.size(); - } else { + } catch (JSONException e) { + logger.error("Failed to parse server response: {}", e.getMessage(), e); for (Map map : dataToBesync) { failedVanSerialNos.add(String.valueOf(map.get(vanAutoIncColumnName))); - failureReasons.add(respMsg.isEmpty() ? "Sync failed" : respMsg); + failureReasons.add("Invalid server response"); } failCount = failedVanSerialNos.size(); } + } else { + logger.error("Empty response from server"); + for (Map map : dataToBesync) { + failedVanSerialNos.add(String.valueOf(map.get(vanAutoIncColumnName))); + failureReasons.add("Empty server response"); + } + failCount = failedVanSerialNos.size(); } - } - } catch (JSONException e) { - logger.error("Failed to parse server response: {}", e.getMessage(), e); - for (Map map : dataToBesync) { - failedVanSerialNos.add(String.valueOf(map.get(vanAutoIncColumnName))); - failureReasons.add("Invalid server response"); - } - failCount = failedVanSerialNos.size(); - } -} - else { - logger.error("Empty response from server"); + + } catch (ResourceAccessException e) { + logger.error("Connection error during sync: {}", e.getMessage(), e); + + // Mark all as failed due to connection error for (Map map : dataToBesync) { failedVanSerialNos.add(String.valueOf(map.get(vanAutoIncColumnName))); - failureReasons.add("Empty server response"); + failureReasons.add("Connection failed: " + e.getMessage()); + } + failCount = failedVanSerialNos.size(); + + } catch (Exception e) { + logger.error("Unexpected error during sync: {}", e.getMessage(), e); + + for (Map map : dataToBesync) { + failedVanSerialNos.add(String.valueOf(map.get(vanAutoIncColumnName))); + failureReasons.add("Unexpected error: " + e.getMessage()); } failCount = failedVanSerialNos.size(); } - - } catch (ResourceAccessException e) { - logger.error("Connection error during sync: {}", e.getMessage(), e); - - // Mark all as failed due to connection error - for (Map map : dataToBesync) { - failedVanSerialNos.add(String.valueOf(map.get(vanAutoIncColumnName))); - failureReasons.add("Connection failed: " + e.getMessage()); + + logger.info("Sync complete - Success: {}, Failed: {}", successCount, failCount); + + // Update processed flags + if (!successVanSerialNos.isEmpty()) { + dataSyncRepository.updateProcessedFlagInVan(schemaName, tableName, successVanSerialNos, + vanAutoIncColumnName, user, "P", "null"); } - failCount = failedVanSerialNos.size(); - - } catch (Exception e) { - logger.error("Unexpected error during sync: {}", e.getMessage(), e); - - for (Map map : dataToBesync) { - failedVanSerialNos.add(String.valueOf(map.get(vanAutoIncColumnName))); - failureReasons.add("Unexpected error: " + e.getMessage()); + if (!failedVanSerialNos.isEmpty()) { + String firstError = failureReasons.isEmpty() ? "Unknown error" : failureReasons.get(0); + dataSyncRepository.updateProcessedFlagInVan(schemaName, tableName, failedVanSerialNos, + vanAutoIncColumnName, user, "F", firstError); + } + + Map result = new HashMap<>(); + if (successCount > 0 && failCount == 0) { + result.put("status", "Data successfully synced"); + } else if (successCount > 0 && failCount > 0) { + result.put("status", "Partial success"); + } else { + result.put("status", "Sync failed"); } - failCount = failedVanSerialNos.size(); - } - logger.info("Sync complete - Success: {}, Failed: {}", successCount, failCount); - - // Update processed flags - if (!successVanSerialNos.isEmpty()) { - dataSyncRepository.updateProcessedFlagInVan(schemaName, tableName, successVanSerialNos, - vanAutoIncColumnName, user, "P", "null"); + result.put("successCount", successCount); + result.put("failCount", failCount); + + return result; } - if (!failedVanSerialNos.isEmpty()) { - String firstError = failureReasons.isEmpty() ? "Unknown error" : failureReasons.get(0); - dataSyncRepository.updateProcessedFlagInVan(schemaName, tableName, failedVanSerialNos, - vanAutoIncColumnName, user, "F", firstError); + + public StringBuilder getVanSerialNoListForSyncedData(String vanAutoIncColumnName, + List> dataToBesync) throws Exception { + // comma separated van serial no + StringBuilder vanSerialNos = new StringBuilder(); + + int pointer1 = 0; + for (Map map : dataToBesync) { + if (pointer1 == dataToBesync.size() - 1) + vanSerialNos.append(map.get(vanAutoIncColumnName.trim())); + else + vanSerialNos.append(map.get(vanAutoIncColumnName.trim()) + ","); + + pointer1++; + } + return vanSerialNos; } - Map result = new HashMap<>(); - if (successCount > 0 && failCount == 0) { - result.put("status", "Data successfully synced"); - } else if (successCount > 0 && failCount > 0) { - result.put("status", "Partial success"); - } else { - result.put("status", "Sync failed"); + public String getDataSyncGroupDetails() { + List dataSyncGroupList = dataSyncGroupsRepo.findByDeleted(false); + if (dataSyncGroupList != null) + return new Gson().toJson(dataSyncGroupList); + else + return null; } - - result.put("successCount", successCount); - result.put("failCount", failCount); - - return result; -} - - public StringBuilder getVanSerialNoListForSyncedData(String vanAutoIncColumnName, - List> dataToBesync) throws Exception { - // comma separated van serial no - StringBuilder vanSerialNos = new StringBuilder(); - - int pointer1 = 0; - for (Map map : dataToBesync) { - if (pointer1 == dataToBesync.size() - 1) - vanSerialNos.append(map.get(vanAutoIncColumnName.trim())); - else - vanSerialNos.append(map.get(vanAutoIncColumnName.trim()) + ","); - - pointer1++; - } - return vanSerialNos; - } - - public String getDataSyncGroupDetails() { - List dataSyncGroupList = dataSyncGroupsRepo.findByDeleted(false); - if (dataSyncGroupList != null) - return new Gson().toJson(dataSyncGroupList); - else - return null; - } } \ No newline at end of file From f1efb4d9a8b3117c254826794086b78a23510528 Mon Sep 17 00:00:00 2001 From: SnehaRH Date: Mon, 6 Oct 2025 13:48:50 +0530 Subject: [PATCH 31/47] fix: Doctor signature was not coming in to ncd care visittype --- .../com/iemr/mmu/repo/nurse/ncdcare/NCDCareDiagnosisRepo.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/iemr/mmu/repo/nurse/ncdcare/NCDCareDiagnosisRepo.java b/src/main/java/com/iemr/mmu/repo/nurse/ncdcare/NCDCareDiagnosisRepo.java index 6b78c721..e8c2c52a 100644 --- a/src/main/java/com/iemr/mmu/repo/nurse/ncdcare/NCDCareDiagnosisRepo.java +++ b/src/main/java/com/iemr/mmu/repo/nurse/ncdcare/NCDCareDiagnosisRepo.java @@ -37,7 +37,7 @@ public interface NCDCareDiagnosisRepo extends CrudRepository { @Query(" SELECT beneficiaryRegID, benVisitID, providerServiceMapID, prescriptionID, " - + " ncdScreeningCondition, ncdComplication, ncdCareType, visitCode, ncdScreeningConditionOther " + + " ncdScreeningCondition, ncdComplication, ncdCareType, visitCode, ncdScreeningConditionOther, createdBy, createdDate " + " from NCDCareDiagnosis ba " + " WHERE ba.beneficiaryRegID = :benRegID" + " AND ba.visitCode = :visitCode AND ba.deleted = false " + " ORDER BY createdDate desc") public ArrayList getNCDCareDiagnosisDetails(@Param("benRegID") Long benRegID, From 5e5e0783361744f57014012694df05c1dddff32a Mon Sep 17 00:00:00 2001 From: vishwab1 Date: Mon, 6 Oct 2025 17:58:14 +0530 Subject: [PATCH 32/47] fix: add the createby and createat --- .../iemr/mmu/data/ncdcare/NCDCareDiagnosis.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/iemr/mmu/data/ncdcare/NCDCareDiagnosis.java b/src/main/java/com/iemr/mmu/data/ncdcare/NCDCareDiagnosis.java index 6a413d97..a4acb7c6 100644 --- a/src/main/java/com/iemr/mmu/data/ncdcare/NCDCareDiagnosis.java +++ b/src/main/java/com/iemr/mmu/data/ncdcare/NCDCareDiagnosis.java @@ -39,7 +39,7 @@ @Table(name = "t_ncddiagnosis") public class NCDCareDiagnosis { @Id - @GeneratedValue(strategy = GenerationType.IDENTITY ) + @GeneratedValue(strategy = GenerationType.IDENTITY) @Expose @Column(name = "ID") private Long ID; @@ -142,20 +142,18 @@ public class NCDCareDiagnosis { @Transient @Expose private String externalInvestigation; - + @Expose @Transient private ArrayList provisionalDiagnosisList; - + @Expose @Transient private String diagnosisProvided; - + @Expose @Transient private String diagnosisProvided_SCTCode; - - public String getDiagnosisProvided() { return diagnosisProvided; @@ -383,7 +381,7 @@ public void setVanID(Integer vanID) { public NCDCareDiagnosis(Long beneficiaryRegID, Long benVisitID, Integer providerServiceMapID, Long prescriptionID, String ncdCareCondition, String ncdComplication, String ncdCareType, Long visitCode, - String externalInvestigation, String ncdCareConditionOther) { + String externalInvestigation, String ncdCareConditionOther, String createdBy, Timestamp createdDate) { super(); this.beneficiaryRegID = beneficiaryRegID; this.benVisitID = benVisitID; @@ -395,6 +393,8 @@ public NCDCareDiagnosis(Long beneficiaryRegID, Long benVisitID, Integer provider this.visitCode = visitCode; this.externalInvestigation = externalInvestigation; this.ncdScreeningConditionOther = ncdCareConditionOther; + this.createdBy = createdBy; + this.createdDate = createdDate; } public static NCDCareDiagnosis getNCDCareDiagnosisDetails(ArrayList resList) { @@ -402,7 +402,8 @@ public static NCDCareDiagnosis getNCDCareDiagnosisDetails(ArrayList re if (null != resList && resList.size() > 0) { Object[] obj = resList.get(0); cOBJ = new NCDCareDiagnosis((Long) obj[0], (Long) obj[1], (Integer) obj[2], (Long) obj[3], (String) obj[4], - (String) obj[5], (String) obj[6], (Long) obj[7], null, (String) obj[8]); + (String) obj[5], (String) obj[6], (Long) obj[7], null, (String) obj[8], (String) obj[9], + (Timestamp) obj[10]); } return cOBJ; From f1ebcf4eb5eb0d9080f6da159a87ec0ed5453c54 Mon Sep 17 00:00:00 2001 From: Vanitha S <116701245+vanitha1822@users.noreply.github.com> Date: Tue, 7 Oct 2025 16:45:35 +0530 Subject: [PATCH 33/47] Fix the BenChiefcomplaint issue (#127) * fix: correct the table name: t_benchiefcomplaint * fix: van Serial No updation * fix: add logs * fix: van serial no in benchiefcomplain * fix: remove unwanted logs * fix: update vanserial no * fix: add vanid in request --- .../BeneficiaryFlowStatusRepo.java | 2 +- .../mmu/repo/nurse/BenVisitDetailRepo.java | 5 +++++ .../BenChiefComplaintRepo.java | 4 ++++ .../mmu/service/anc/ANCNurseServiceImpl.java | 2 ++ .../CommonBenStatusFlowServiceImpl.java | 2 ++ .../cancerScreening/CSDoctorServiceImpl.java | 5 ++++- .../transaction/CommonDoctorServiceImpl.java | 5 +++++ .../transaction/CommonNurseServiceImpl.java | 14 +++++++++++++ .../DownloadDataFromServerImpl.java | 17 +++++++++++++++- .../UploadDataToServerImpl.java | 2 +- .../GetDataFromVanAndSyncToDBImpl.java | 2 +- .../QuickConsultationServiceImpl.java | 20 +++++++++++++++---- 12 files changed, 71 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/iemr/mmu/repo/benFlowStatus/BeneficiaryFlowStatusRepo.java b/src/main/java/com/iemr/mmu/repo/benFlowStatus/BeneficiaryFlowStatusRepo.java index d4adc10e..900beccd 100644 --- a/src/main/java/com/iemr/mmu/repo/benFlowStatus/BeneficiaryFlowStatusRepo.java +++ b/src/main/java/com/iemr/mmu/repo/benFlowStatus/BeneficiaryFlowStatusRepo.java @@ -56,7 +56,7 @@ public ArrayList getNurseWorklistNew( + " t.VisitCategory = :visitCategory, t.nurseFlag = :nurseFlag, t.doctorFlag = :docFlag, " + " t.labIteration = :labIteration, t.lab_technician_flag = 0, t.radiologist_flag = :radiologistFlag, " + " t.oncologist_flag = :oncologistFlag, t.benVisitDate = now(), " - + " t.visitCode = :benVisitCode, t.processed = 'U', t.vanID =:vanID " + + " t.visitCode = :benVisitCode, t.processed = 'U', t.vanID =:vanID, t.vanSerialNo=:benFlowID " + " WHERE t.benFlowID = :benFlowID AND t.beneficiaryRegID = :benRegID " + " AND nurseFlag = 1 ") public int updateBenFlowStatusAfterNurseActivity(@Param("benFlowID") Long benFlowID, @Param("benRegID") Long benRegID, @Param("benVisitID") Long benVisitID, diff --git a/src/main/java/com/iemr/mmu/repo/nurse/BenVisitDetailRepo.java b/src/main/java/com/iemr/mmu/repo/nurse/BenVisitDetailRepo.java index 8c659c8b..c4a03286 100644 --- a/src/main/java/com/iemr/mmu/repo/nurse/BenVisitDetailRepo.java +++ b/src/main/java/com/iemr/mmu/repo/nurse/BenVisitDetailRepo.java @@ -96,4 +96,9 @@ public int updateFileID(@Param("fileIDs") String fileIDs, @Param("regID") Long r @Query("SELECT MAX(bvd.createdDate) from BeneficiaryVisitDetail bvd WHERE bvd.beneficiaryRegID = :benRegID AND bvd.visitReason = :visitreason AND bvd.visitCategory = :visitcategory ") public String getMaxCreatedDate(@Param("benRegID") Long benRegID, @Param("visitreason") String visitreason,@Param("visitcategory") String visitcategory); + @Transactional + @Modifying + @Query(" UPDATE BeneficiaryVisitDetail set vanSerialNo = :benVisitID WHERE benVisitID = :benVisitID") + int updateVanSerialNo(@Param("benVisitID") Long benVisitID); + } diff --git a/src/main/java/com/iemr/mmu/repo/quickConsultation/BenChiefComplaintRepo.java b/src/main/java/com/iemr/mmu/repo/quickConsultation/BenChiefComplaintRepo.java index 9adc296b..15a27c8e 100644 --- a/src/main/java/com/iemr/mmu/repo/quickConsultation/BenChiefComplaintRepo.java +++ b/src/main/java/com/iemr/mmu/repo/quickConsultation/BenChiefComplaintRepo.java @@ -48,4 +48,8 @@ public ArrayList getBenChiefComplaints(@Param("benRegID") Long benRegI @Query(" Delete from BenChiefComplaint WHERE beneficiaryRegID = :benRegID AND visitCode = :visitCode") public int deleteExistingBenChiefComplaints(@Param("benRegID") Long benRegID, @Param("visitCode") Long visitCode); + @Transactional + @Modifying + @Query(" UPDATE BenChiefComplaint set vanSerialNo = :benChiefComplaintID WHERE benChiefComplaintID = :benChiefComplaintID") + int updateVanSerialNo(@Param("benChiefComplaintID") Long benChiefComplaintID); } diff --git a/src/main/java/com/iemr/mmu/service/anc/ANCNurseServiceImpl.java b/src/main/java/com/iemr/mmu/service/anc/ANCNurseServiceImpl.java index 69db925c..f1ad731a 100644 --- a/src/main/java/com/iemr/mmu/service/anc/ANCNurseServiceImpl.java +++ b/src/main/java/com/iemr/mmu/service/anc/ANCNurseServiceImpl.java @@ -151,6 +151,7 @@ public Long saveBenAncCareDetails(ANCCareDetails ancCareDetailsOBJ) throws Parse } ANCCareDetails ancCareDetailsRS = ancCareRepo.save(ancCareDetailsOBJ); if (ancCareDetailsRS != null) { + ancCareDetailsRS.setVanSerialNo((ancCareDetailsRS.getID())); ancCareSuccessFlag = ancCareDetailsRS.getID(); } return ancCareSuccessFlag; @@ -163,6 +164,7 @@ public Long saveAncImmunizationDetails(WrapperAncImmunization wrapperAncImmuniza List ancWomenVaccineDetailRSList = (List) ancWomenVaccineRepo .saveAll(ancWomenVaccineDetailList); if (!ancWomenVaccineDetailRSList.isEmpty()) { + ancWomenVaccineDetailRSList.get(0).setVanSerialNo(ancWomenVaccineDetailRSList.get(0).getID()); successFlag = ancWomenVaccineDetailRSList.get(0).getID(); } return successFlag; diff --git a/src/main/java/com/iemr/mmu/service/benFlowStatus/CommonBenStatusFlowServiceImpl.java b/src/main/java/com/iemr/mmu/service/benFlowStatus/CommonBenStatusFlowServiceImpl.java index 716b4530..148c789d 100644 --- a/src/main/java/com/iemr/mmu/service/benFlowStatus/CommonBenStatusFlowServiceImpl.java +++ b/src/main/java/com/iemr/mmu/service/benFlowStatus/CommonBenStatusFlowServiceImpl.java @@ -72,6 +72,7 @@ public int createBenFlowRecord(String requestOBJ, Long beneficiaryRegID, Long be if (beneficiaryRegID != null && beneficiaryID != null && beneficiaryRegID > 0 && beneficiaryID > 0) { objRS = beneficiaryFlowStatusRepo.save(obj); + obj.setVanSerialNo((objRS.getBenFlowID())); if (objRS != null) returnOBJ = 1; else @@ -91,6 +92,7 @@ public int createBenFlowRecord(String requestOBJ, Long beneficiaryRegID, Long be returnOBJ = 3; } else { objRS = beneficiaryFlowStatusRepo.save(obj); +obj.setVanSerialNo((objRS.getBenFlowID())); if (objRS != null) returnOBJ = 1; else diff --git a/src/main/java/com/iemr/mmu/service/cancerScreening/CSDoctorServiceImpl.java b/src/main/java/com/iemr/mmu/service/cancerScreening/CSDoctorServiceImpl.java index 80322522..ae56e0cf 100644 --- a/src/main/java/com/iemr/mmu/service/cancerScreening/CSDoctorServiceImpl.java +++ b/src/main/java/com/iemr/mmu/service/cancerScreening/CSDoctorServiceImpl.java @@ -49,7 +49,10 @@ public Long saveCancerDiagnosisData(CancerDiagnosis cancerDiagnosis) { CancerDiagnosis response = cancerDiagnosisRepo.save(cancerDiagnosis); if (response != null) - return response.getID(); + { + response.setVanSerialNo(response.getID()); + return response.getID(); + } else return null; } diff --git a/src/main/java/com/iemr/mmu/service/common/transaction/CommonDoctorServiceImpl.java b/src/main/java/com/iemr/mmu/service/common/transaction/CommonDoctorServiceImpl.java index e986e374..11191065 100644 --- a/src/main/java/com/iemr/mmu/service/common/transaction/CommonDoctorServiceImpl.java +++ b/src/main/java/com/iemr/mmu/service/common/transaction/CommonDoctorServiceImpl.java @@ -214,6 +214,11 @@ public Integer saveDocFindings(WrapperAncFindings wrapperAncFindings) { ArrayList benChiefComplaintListRS = (ArrayList) benChiefComplaintRepo .saveAll(tmpBenCHiefComplaintsTMP); if (tmpBenCHiefComplaintsTMP.size() == benChiefComplaintListRS.size()) { + for (BenChiefComplaint complaint : benChiefComplaintListRS) { + if (complaint.getBenChiefComplaintID() != null) { + benChiefComplaintRepo.updateVanSerialNo(complaint.getBenChiefComplaintID()); + } + } chiefComFlag = 1; } } else { diff --git a/src/main/java/com/iemr/mmu/service/common/transaction/CommonNurseServiceImpl.java b/src/main/java/com/iemr/mmu/service/common/transaction/CommonNurseServiceImpl.java index b2662874..32502a44 100644 --- a/src/main/java/com/iemr/mmu/service/common/transaction/CommonNurseServiceImpl.java +++ b/src/main/java/com/iemr/mmu/service/common/transaction/CommonNurseServiceImpl.java @@ -259,6 +259,7 @@ public Long saveBeneficiaryVisitDetails(BeneficiaryVisitDetail beneficiaryVisitD beneficiaryVisitDetail.setReportFilePath(sb.toString()); response = benVisitDetailRepo.save(beneficiaryVisitDetail); + benVisitDetailRepo.updateVanSerialNo(response.getBenVisitID()); if (response != null) { // Long visitCode = updateVisitCode(response, 10); @@ -435,7 +436,14 @@ public int saveBenChiefComplaints(List benChiefComplaintList) List benChiefComplaintResultList = (List) benChiefComplaintRepo .saveAll(benChiefComplaintListNew); if (benChiefComplaintListNew.size() == benChiefComplaintResultList.size()) + { + for (BenChiefComplaint complaint : benChiefComplaintResultList) { + if (complaint.getBenChiefComplaintID() != null) { + benChiefComplaintRepo.updateVanSerialNo(complaint.getBenChiefComplaintID()); + } + } r = 1; + } } else { r = 1; } @@ -2076,7 +2084,13 @@ public int updateBenChiefComplaints(List benChiefComplaintLis List benChiefComplaintResultList = (List) benChiefComplaintRepo .saveAll(benChiefComplaintList); + if (!benChiefComplaintResultList.isEmpty()) { + for (BenChiefComplaint complaint : benChiefComplaintResultList) { + if (complaint.getBenChiefComplaintID() != null) { + benChiefComplaintRepo.updateVanSerialNo(complaint.getBenChiefComplaintID()); + } + } r = benChiefComplaintResultList.size(); } } diff --git a/src/main/java/com/iemr/mmu/service/dataSyncActivity/DownloadDataFromServerImpl.java b/src/main/java/com/iemr/mmu/service/dataSyncActivity/DownloadDataFromServerImpl.java index b483517e..4f011703 100644 --- a/src/main/java/com/iemr/mmu/service/dataSyncActivity/DownloadDataFromServerImpl.java +++ b/src/main/java/com/iemr/mmu/service/dataSyncActivity/DownloadDataFromServerImpl.java @@ -21,6 +21,7 @@ */ package com.iemr.mmu.service.dataSyncActivity; +import java.math.BigInteger; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.HashMap; @@ -326,6 +327,13 @@ public int callCentralAPIToGenerateBenIDAndimportToLocal(String requestOBJ, Stri String ServerAuthorization, String token) throws Exception { int i = 0, i1 = 0; try{ + JSONObject originalRequest = new JSONObject(requestOBJ); + BigInteger vanID = null; + if (originalRequest.has("vanID")) { + vanID = originalRequest.getBigInteger("vanID"); + } + logger.info("Extracted vanID from original request: " + vanID); + // Rest template RestTemplate restTemplate = new RestTemplate(); HttpEntity request = RestTemplateUtil.createRequestEntity(requestOBJ, ServerAuthorization,"datasync"); @@ -340,10 +348,17 @@ public int callCentralAPIToGenerateBenIDAndimportToLocal(String requestOBJ, Stri JSONObject obj = new JSONObject(response.getBody()); if (obj != null && obj.has("data") && obj.has("statusCode") && obj.getInt("statusCode") == 200) { // Consume the response from API and call local identity api to save data + JSONObject localImportPayload = new JSONObject(); + localImportPayload.put("vanID", vanID); + localImportPayload.put("benIDList", obj.get("data")); + logger.info("Authorization: " + Authorization); logger.info("ServerAuthorization: " + ServerAuthorization); - HttpEntity request1 = RestTemplateUtil.createRequestEntity(obj.get("data").toString(), Authorization, token); + logger.info("Payload to local import: " + localImportPayload.toString()); + + + HttpEntity request1 = RestTemplateUtil.createRequestEntity( localImportPayload.toString(), Authorization, token); i = 1; logger.info("Request to benImporturllocal: " + request1); ResponseEntity response1 = restTemplate.exchange(benImportUrlLocal, HttpMethod.POST, request1, diff --git a/src/main/java/com/iemr/mmu/service/dataSyncActivity/UploadDataToServerImpl.java b/src/main/java/com/iemr/mmu/service/dataSyncActivity/UploadDataToServerImpl.java index b8fdbf5b..d9567861 100644 --- a/src/main/java/com/iemr/mmu/service/dataSyncActivity/UploadDataToServerImpl.java +++ b/src/main/java/com/iemr/mmu/service/dataSyncActivity/UploadDataToServerImpl.java @@ -154,7 +154,7 @@ private String startDataSync(int vanID, String user, String Authorization, Strin // get data from DB to sync to server List> syncData = getDataToSync(obj.getSchemaName(), obj.getTableName(), obj.getVanColumnName()); - logger.debug("Fetched syncData for schema {} and table {}: {}", obj.getSchemaName(), obj.getTableName(), + logger.info("Fetched syncData for schema {} and table {}: {}", obj.getSchemaName(), obj.getTableName(), objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(syncData)); if (syncData != null && syncData.size() > 0) { diff --git a/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java b/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java index 19bfca8c..ad6f844a 100644 --- a/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java +++ b/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java @@ -64,7 +64,7 @@ public class GetDataFromVanAndSyncToDBImpl implements GetDataFromVanAndSyncToDB "t_sys_musculoskeletalsystem", "t_sys_genitourinarysystem")); TABLE_GROUPS.put(4, - Arrays.asList("t_ancdiagnosis", "t_ncddiagnosis", "t_pncdiagnosis", "t_benchefcomplaint", + Arrays.asList("t_ancdiagnosis", "t_ncddiagnosis", "t_pncdiagnosis", "t_benchiefcomplaint", "t_benclinicalobservation", "t_prescription", "t_prescribeddrug", "t_lab_testorder", "t_benreferdetails")); diff --git a/src/main/java/com/iemr/mmu/service/quickConsultation/QuickConsultationServiceImpl.java b/src/main/java/com/iemr/mmu/service/quickConsultation/QuickConsultationServiceImpl.java index 0078c596..230c4c5d 100644 --- a/src/main/java/com/iemr/mmu/service/quickConsultation/QuickConsultationServiceImpl.java +++ b/src/main/java/com/iemr/mmu/service/quickConsultation/QuickConsultationServiceImpl.java @@ -31,6 +31,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.google.gson.Gson; import com.google.gson.JsonArray; @@ -84,6 +86,8 @@ public class QuickConsultationServiceImpl implements QuickConsultationService { @Autowired private TeleConsultationServiceImpl teleConsultationServiceImpl; + private final Logger logger = LoggerFactory.getLogger(this.getClass().getName()); + @Autowired public void setGeneralOPDDoctorServiceImpl(GeneralOPDDoctorServiceImpl generalOPDDoctorServiceImpl) { this.generalOPDDoctorServiceImpl = generalOPDDoctorServiceImpl; @@ -170,10 +174,18 @@ public Long saveBeneficiaryChiefComplaint(JsonObject caseSheet) { if (benChiefComplaints != null && benChiefComplaints.size() > 0) { List chiefComplaints = (List) benChiefComplaintRepo .saveAll(benChiefComplaints); - - if (benChiefComplaints.size() == chiefComplaints.size()) { - returnOBJ = new Long(1); - } + if (benChiefComplaints.size() == chiefComplaints.size()) { + // Update vanSerialNo for each saved record + for (BenChiefComplaint complaint : chiefComplaints) { + if (complaint.getBenChiefComplaintID() != null) { + benChiefComplaintRepo.updateVanSerialNo(complaint.getBenChiefComplaintID()); + } + } + returnOBJ = new Long(1); + } + // if (benChiefComplaints.size() == chiefComplaints.size()) { + // returnOBJ = new Long(1); + // } } else { returnOBJ = new Long(1); } From e8f40d794ba381fa71f6cd628f3331cc012cead5 Mon Sep 17 00:00:00 2001 From: Vanitha S <116701245+vanitha1822@users.noreply.github.com> Date: Thu, 9 Oct 2025 16:00:02 +0530 Subject: [PATCH 34/47] Update pom.xml (#128) --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f2f9740e..aa3c19c9 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 com.iemr.mmu mmu-api - 3.5.1 + 3.4.1 war MMU-API From b1e6a4a2eb2a4dca9cc733f7ca724481a0658d8b Mon Sep 17 00:00:00 2001 From: Vanitha S <116701245+vanitha1822@users.noreply.github.com> Date: Fri, 10 Oct 2025 10:38:46 +0530 Subject: [PATCH 35/47] fix: van serial no (#130) --- .../repo/labModule/LabResultEntryRepo.java | 8 + .../LabTestOrderDetailRepo.java | 4 + .../mmu/service/anc/ANCNurseServiceImpl.java | 701 ++++++++------- .../LabTechnicianServiceImpl.java | 839 +++++++++--------- 4 files changed, 795 insertions(+), 757 deletions(-) diff --git a/src/main/java/com/iemr/mmu/repo/labModule/LabResultEntryRepo.java b/src/main/java/com/iemr/mmu/repo/labModule/LabResultEntryRepo.java index 33656333..cdf2ad4b 100644 --- a/src/main/java/com/iemr/mmu/repo/labModule/LabResultEntryRepo.java +++ b/src/main/java/com/iemr/mmu/repo/labModule/LabResultEntryRepo.java @@ -24,6 +24,7 @@ import java.math.BigInteger; import java.util.ArrayList; +import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.query.Param; @@ -31,6 +32,8 @@ import com.iemr.mmu.data.labModule.LabResultEntry; +import jakarta.transaction.Transactional; + @Repository public interface LabResultEntryRepo extends CrudRepository { @Query("SELECT procedureID FROM LabResultEntry WHERE beneficiaryRegID = :benRegID AND " @@ -46,4 +49,9 @@ ArrayList findProcedureListByBeneficiaryRegIDAndBenVisitID(@Param("benR ArrayList getLast_3_visitForLabTestDone(@Param("benRegID") Long benRegID, @Param("visitCode") Long visitCode); + @Transactional + @Modifying + @Query(" UPDATE LabResultEntry set vanSerialNo = :ID WHERE ID = :ID") + int updateVanSerialNo(@Param("ID") BigInteger ID); + } diff --git a/src/main/java/com/iemr/mmu/repo/quickConsultation/LabTestOrderDetailRepo.java b/src/main/java/com/iemr/mmu/repo/quickConsultation/LabTestOrderDetailRepo.java index 773021c4..4a7eb9c9 100644 --- a/src/main/java/com/iemr/mmu/repo/quickConsultation/LabTestOrderDetailRepo.java +++ b/src/main/java/com/iemr/mmu/repo/quickConsultation/LabTestOrderDetailRepo.java @@ -47,4 +47,8 @@ public ArrayList getLabTestOrderDetails(@Param("benRegID") Long benReg @Query(" Delete from LabTestOrderDetail WHERE beneficiaryRegID = :benRegID AND benVisitID = :benVisitID ") public int deleteExistingLabTestOrderDetail(@Param("benRegID") Long benRegID, @Param("benVisitID") Long benVisitID); + @Transactional + @Modifying + @Query(" UPDATE LabTestOrderDetail set vanSerialNo = :labTestOrderID WHERE labTestOrderID = :labTestOrderID") + int updateVanSerialNo(@Param("labTestOrderID") Long labTestOrderID); } diff --git a/src/main/java/com/iemr/mmu/service/anc/ANCNurseServiceImpl.java b/src/main/java/com/iemr/mmu/service/anc/ANCNurseServiceImpl.java index f1ad731a..1abc07bd 100644 --- a/src/main/java/com/iemr/mmu/service/anc/ANCNurseServiceImpl.java +++ b/src/main/java/com/iemr/mmu/service/anc/ANCNurseServiceImpl.java @@ -18,7 +18,7 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see https://www.gnu.org/licenses/. -*/ + */ package com.iemr.mmu.service.anc; import java.sql.Date; @@ -49,349 +49,366 @@ @Service public class ANCNurseServiceImpl implements ANCNurseService { - private ANCCareRepo ancCareRepo; - private ANCWomenVaccineRepo ancWomenVaccineRepo; - private BenAdherenceRepo benAdherenceRepo; - - private SysObstetricExaminationRepo sysObstetricExaminationRepo; - - private LabTestOrderDetailRepo labTestOrderDetailRepo; - - @Autowired - public void setLabTestOrderDetailRepo(LabTestOrderDetailRepo labTestOrderDetailRepo) { - this.labTestOrderDetailRepo = labTestOrderDetailRepo; - } - - @Autowired - public void setBenAdherenceRepo(BenAdherenceRepo benAdherenceRepo) { - this.benAdherenceRepo = benAdherenceRepo; - } - - @Autowired - public void setAncCareRepo(ANCCareRepo ancCareRepo) { - this.ancCareRepo = ancCareRepo; - } - - @Autowired - public void setAncWomenVaccineRepo(ANCWomenVaccineRepo ancWomenVaccineRepo) { - this.ancWomenVaccineRepo = ancWomenVaccineRepo; - } - - @Autowired - public void setSysObstetricExaminationRepo(SysObstetricExaminationRepo sysObstetricExaminationRepo) { - this.sysObstetricExaminationRepo = sysObstetricExaminationRepo; - } - - @Override - public Long saveBeneficiaryANCDetails(ANCCareDetails ancCareDetails) { - ANCCareDetails ancCareDetail = ancCareRepo.save(ancCareDetails); - Long ancCareID = null; - if (null != ancCareDetail && ancCareDetail.getID() > 0) { - ancCareID = ancCareDetail.getID(); + private ANCCareRepo ancCareRepo; + private ANCWomenVaccineRepo ancWomenVaccineRepo; + private BenAdherenceRepo benAdherenceRepo; + + private SysObstetricExaminationRepo sysObstetricExaminationRepo; + + private LabTestOrderDetailRepo labTestOrderDetailRepo; + + @Autowired + public void setLabTestOrderDetailRepo(LabTestOrderDetailRepo labTestOrderDetailRepo) { + this.labTestOrderDetailRepo = labTestOrderDetailRepo; + } + + @Autowired + public void setBenAdherenceRepo(BenAdherenceRepo benAdherenceRepo) { + this.benAdherenceRepo = benAdherenceRepo; + } + + @Autowired + public void setAncCareRepo(ANCCareRepo ancCareRepo) { + this.ancCareRepo = ancCareRepo; + } + + @Autowired + public void setAncWomenVaccineRepo(ANCWomenVaccineRepo ancWomenVaccineRepo) { + this.ancWomenVaccineRepo = ancWomenVaccineRepo; + } + + @Autowired + public void setSysObstetricExaminationRepo(SysObstetricExaminationRepo sysObstetricExaminationRepo) { + this.sysObstetricExaminationRepo = sysObstetricExaminationRepo; + } + + @Override + public Long saveBeneficiaryANCDetails(ANCCareDetails ancCareDetails) { + ANCCareDetails ancCareDetail = ancCareRepo.save(ancCareDetails); + Long ancCareID = null; + if (null != ancCareDetail && ancCareDetail.getID() > 0) { + ancCareID = ancCareDetail.getID(); + } + return ancCareID; + } + + @Override + public Long saveANCWomenVaccineDetails(List ancWomenVaccineDetails) { + Iterable listOfANCWomenVaccineDetail = ancWomenVaccineRepo + .saveAll(ancWomenVaccineDetails); + + Long ancWomenVaccineID = null; + if (!((List) listOfANCWomenVaccineDetail).isEmpty()) { + for (ANCWomenVaccineDetail ancWomenVaccine : listOfANCWomenVaccineDetail) { + ancWomenVaccineID = ancWomenVaccine.getID(); + } + } + return ancWomenVaccineID; + } + + public Integer saveBenInvestigationFromDoc(WrapperBenInvestigationANC wrapperBenInvestigationANC) { + int r = 0; + ArrayList LabTestOrderDetailList = new ArrayList<>(); + ArrayList investigationList = wrapperBenInvestigationANC.getLaboratoryList(); + if (investigationList != null && investigationList.size() > 0) { + + for (LabTestOrderDetail testData : investigationList) { + + testData.setBeneficiaryRegID(wrapperBenInvestigationANC.getBeneficiaryRegID()); + testData.setBenVisitID(wrapperBenInvestigationANC.getBenVisitID()); + testData.setProviderServiceMapID(wrapperBenInvestigationANC.getProviderServiceMapID()); + testData.setCreatedBy(wrapperBenInvestigationANC.getCreatedBy()); + testData.setPrescriptionID(wrapperBenInvestigationANC.getPrescriptionID()); + + LabTestOrderDetailList.add(testData); + } + ArrayList LabTestOrderDetailListRS = (ArrayList) labTestOrderDetailRepo + .saveAll(LabTestOrderDetailList); + + if (!LabTestOrderDetailListRS.isEmpty()) { + ArrayList labTestOrderDetailListRS + = (ArrayList) labTestOrderDetailRepo.saveAll(LabTestOrderDetailList); + + if (LabTestOrderDetailList.size() == labTestOrderDetailListRS.size()) { + for (LabTestOrderDetail detail : labTestOrderDetailListRS) { + if (detail.getLabTestOrderID() != null) { + labTestOrderDetailRepo.updateVanSerialNo(detail.getLabTestOrderID()); + } + } + r = 1; + } + + } else { + r = 1; + } } - return ancCareID; - } - - @Override - public Long saveANCWomenVaccineDetails(List ancWomenVaccineDetails) { - Iterable listOfANCWomenVaccineDetail = ancWomenVaccineRepo - .saveAll(ancWomenVaccineDetails); - - Long ancWomenVaccineID = null; - if (!((List) listOfANCWomenVaccineDetail).isEmpty()) { - for (ANCWomenVaccineDetail ancWomenVaccine : listOfANCWomenVaccineDetail) { - ancWomenVaccineID = ancWomenVaccine.getID(); - } - } - return ancWomenVaccineID; - } - - public Integer saveBenInvestigationFromDoc(WrapperBenInvestigationANC wrapperBenInvestigationANC) { - int r = 0; - ArrayList LabTestOrderDetailList = new ArrayList<>(); - ArrayList investigationList = wrapperBenInvestigationANC.getLaboratoryList(); - if (investigationList != null && investigationList.size() > 0) { - - for (LabTestOrderDetail testData : investigationList) { - - testData.setBeneficiaryRegID(wrapperBenInvestigationANC.getBeneficiaryRegID()); - testData.setBenVisitID(wrapperBenInvestigationANC.getBenVisitID()); - testData.setProviderServiceMapID(wrapperBenInvestigationANC.getProviderServiceMapID()); - testData.setCreatedBy(wrapperBenInvestigationANC.getCreatedBy()); - testData.setPrescriptionID(wrapperBenInvestigationANC.getPrescriptionID()); - - LabTestOrderDetailList.add(testData); - } - ArrayList LabTestOrderDetailListRS = (ArrayList) labTestOrderDetailRepo - .saveAll(LabTestOrderDetailList); - - if (!LabTestOrderDetailListRS.isEmpty()) { - r = 1; - } - } else { - r = 1; - } - return r; - } - - @Override - public Long saveBenAncCareDetails(ANCCareDetails ancCareDetailsOBJ) throws ParseException { - Long ancCareSuccessFlag = null; - if (ancCareDetailsOBJ.getLmpDate() != null && !ancCareDetailsOBJ.getLmpDate().isEmpty() - && ancCareDetailsOBJ.getLmpDate().length() >= 10) { - String lmpDate = ancCareDetailsOBJ.getLmpDate().split("T")[0]; - ancCareDetailsOBJ - .setLastMenstrualPeriod_LMP(new Date(new SimpleDateFormat("yyyy-MM-dd").parse(lmpDate).getTime())); - } - if (ancCareDetailsOBJ.getExpDelDt() != null && !ancCareDetailsOBJ.getExpDelDt().isEmpty() - && ancCareDetailsOBJ.getExpDelDt().length() >= 10) { - String edDate = ancCareDetailsOBJ.getExpDelDt().split("T")[0]; - ancCareDetailsOBJ - .setExpectedDateofDelivery(new Date(new SimpleDateFormat("yyyy-MM-dd").parse(edDate).getTime())); - } - ANCCareDetails ancCareDetailsRS = ancCareRepo.save(ancCareDetailsOBJ); - if (ancCareDetailsRS != null) { - ancCareDetailsRS.setVanSerialNo((ancCareDetailsRS.getID())); - ancCareSuccessFlag = ancCareDetailsRS.getID(); - } - return ancCareSuccessFlag; - } - - @Override - public Long saveAncImmunizationDetails(WrapperAncImmunization wrapperAncImmunizationOBJ) throws ParseException { - Long successFlag = null; - List ancWomenVaccineDetailList = getANCWomenVaccineDetail(wrapperAncImmunizationOBJ); - List ancWomenVaccineDetailRSList = (List) ancWomenVaccineRepo - .saveAll(ancWomenVaccineDetailList); - if (!ancWomenVaccineDetailRSList.isEmpty()) { - ancWomenVaccineDetailRSList.get(0).setVanSerialNo(ancWomenVaccineDetailRSList.get(0).getID()); - successFlag = ancWomenVaccineDetailRSList.get(0).getID(); - } - return successFlag; - } - - private List getANCWomenVaccineDetail(WrapperAncImmunization wrapperAncImmunizationOBJ) - throws ParseException { - List ancWomenVaccineDetailList = new ArrayList(); - ANCWomenVaccineDetail ancWomenVaccineDetail; - if (wrapperAncImmunizationOBJ != null) { - - // TT-1 details - ancWomenVaccineDetail = new ANCWomenVaccineDetail(); - ancWomenVaccineDetail.setBeneficiaryRegID(wrapperAncImmunizationOBJ.getBeneficiaryRegID()); - ancWomenVaccineDetail.setBenVisitID(wrapperAncImmunizationOBJ.getBenVisitID()); - ancWomenVaccineDetail.setVisitCode(wrapperAncImmunizationOBJ.getVisitCode()); - ancWomenVaccineDetail.setProviderServiceMapID(wrapperAncImmunizationOBJ.getProviderServiceMapID()); - ancWomenVaccineDetail.setVanID(wrapperAncImmunizationOBJ.getVanID()); - ancWomenVaccineDetail.setParkingPlaceID(wrapperAncImmunizationOBJ.getParkingPlaceID()); - ancWomenVaccineDetail.setCreatedBy(wrapperAncImmunizationOBJ.getCreatedBy()); - ancWomenVaccineDetail.setID(wrapperAncImmunizationOBJ.gettT1ID()); - ancWomenVaccineDetail.setVaccineName("TT-1"); - ancWomenVaccineDetail.setStatus(wrapperAncImmunizationOBJ.gettT_1Status()); - if (wrapperAncImmunizationOBJ.getDateReceivedForTT_1() != null - && wrapperAncImmunizationOBJ.getDateReceivedForTT_1().length() >= 10) { - String TT_1 = wrapperAncImmunizationOBJ.getDateReceivedForTT_1().split("T")[0]; - ancWomenVaccineDetail - .setReceivedDate(new Date(new SimpleDateFormat("yyyy-MM-dd").parse(TT_1).getTime())); - } - ancWomenVaccineDetail.setReceivedFacilityName(wrapperAncImmunizationOBJ.getFacilityNameOfTT_1()); - ancWomenVaccineDetail.setModifiedBy(wrapperAncImmunizationOBJ.getModifiedBy()); - ancWomenVaccineDetailList.add(ancWomenVaccineDetail); - - // TT-2 details - ancWomenVaccineDetail = new ANCWomenVaccineDetail(); - ancWomenVaccineDetail.setBeneficiaryRegID(wrapperAncImmunizationOBJ.getBeneficiaryRegID()); - ancWomenVaccineDetail.setBenVisitID(wrapperAncImmunizationOBJ.getBenVisitID()); - ancWomenVaccineDetail.setProviderServiceMapID(wrapperAncImmunizationOBJ.getProviderServiceMapID()); - ancWomenVaccineDetail.setVanID(wrapperAncImmunizationOBJ.getVanID()); - ancWomenVaccineDetail.setParkingPlaceID(wrapperAncImmunizationOBJ.getParkingPlaceID()); - ancWomenVaccineDetail.setVisitCode(wrapperAncImmunizationOBJ.getVisitCode()); - ancWomenVaccineDetail.setCreatedBy(wrapperAncImmunizationOBJ.getCreatedBy()); - ancWomenVaccineDetail.setID(wrapperAncImmunizationOBJ.gettT2ID()); - ancWomenVaccineDetail.setVaccineName("TT-2"); - ancWomenVaccineDetail.setStatus(wrapperAncImmunizationOBJ.gettT_2Status()); - if (wrapperAncImmunizationOBJ.getDateReceivedForTT_2() != null - && wrapperAncImmunizationOBJ.getDateReceivedForTT_2().length() >= 10) { - String TT_2 = wrapperAncImmunizationOBJ.getDateReceivedForTT_2().split("T")[0]; - ancWomenVaccineDetail - .setReceivedDate(new Date(new SimpleDateFormat("yyyy-MM-dd").parse(TT_2).getTime())); - } - ancWomenVaccineDetail.setReceivedFacilityName(wrapperAncImmunizationOBJ.getFacilityNameOfTT_2()); - ancWomenVaccineDetail.setModifiedBy(wrapperAncImmunizationOBJ.getModifiedBy()); - ancWomenVaccineDetailList.add(ancWomenVaccineDetail); - - // TT-3 (Booster) details - ancWomenVaccineDetail = new ANCWomenVaccineDetail(); - ancWomenVaccineDetail.setBeneficiaryRegID(wrapperAncImmunizationOBJ.getBeneficiaryRegID()); - ancWomenVaccineDetail.setBenVisitID(wrapperAncImmunizationOBJ.getBenVisitID()); - ancWomenVaccineDetail.setProviderServiceMapID(wrapperAncImmunizationOBJ.getProviderServiceMapID()); - ancWomenVaccineDetail.setVanID(wrapperAncImmunizationOBJ.getVanID()); - ancWomenVaccineDetail.setParkingPlaceID(wrapperAncImmunizationOBJ.getParkingPlaceID()); - ancWomenVaccineDetail.setVisitCode(wrapperAncImmunizationOBJ.getVisitCode()); - ancWomenVaccineDetail.setCreatedBy(wrapperAncImmunizationOBJ.getCreatedBy()); - ancWomenVaccineDetail.setID(wrapperAncImmunizationOBJ.gettT3ID()); - ancWomenVaccineDetail.setVaccineName("TT-Booster"); - ancWomenVaccineDetail.setStatus(wrapperAncImmunizationOBJ.gettT_3Status()); - if (wrapperAncImmunizationOBJ.getDateReceivedForTT_3() != null - && wrapperAncImmunizationOBJ.getDateReceivedForTT_3().length() >= 10) { - String TT_3 = wrapperAncImmunizationOBJ.getDateReceivedForTT_3().split("T")[0]; - ancWomenVaccineDetail - .setReceivedDate(new Date(new SimpleDateFormat("yyyy-MM-dd").parse(TT_3).getTime())); - } - ancWomenVaccineDetail.setReceivedFacilityName(wrapperAncImmunizationOBJ.getFacilityNameOfTT_3()); - ancWomenVaccineDetail.setModifiedBy(wrapperAncImmunizationOBJ.getModifiedBy()); - ancWomenVaccineDetailList.add(ancWomenVaccineDetail); - - } - return ancWomenVaccineDetailList; - } - - @Override - public Long saveSysObstetricExamination(SysObstetricExamination obstetricExamination) { - // TODO Auto-generated method stub - Long r = null; - SysObstetricExamination obstetricExaminationRS = sysObstetricExaminationRepo.save(obstetricExamination); - if (obstetricExaminationRS != null) - r = obstetricExaminationRS.getID(); - return r; - } - - public SysObstetricExamination getSysObstetricExamination(Long benRegID, Long visitCode) { - SysObstetricExamination sysObstetricExaminationData = sysObstetricExaminationRepo - .getSysObstetricExaminationData(benRegID, visitCode); - - return sysObstetricExaminationData; - } - - @Override - public String getANCCareDetails(Long beneficiaryRegID, Long visitCode) { - ArrayList resList = ancCareRepo.getANCCareDetails(beneficiaryRegID, visitCode); - ANCCareDetails ancCareDetails = ANCCareDetails.getANCCareDetails(resList); - return new Gson().toJson(ancCareDetails); - } - - @Override - public String getANCWomenVaccineDetails(Long beneficiaryRegID, Long visitCode) { - ArrayList resList = ancWomenVaccineRepo.getANCWomenVaccineDetails(beneficiaryRegID, visitCode); - WrapperAncImmunization ancWomenVaccineDetails = ANCWomenVaccineDetail.getANCWomenVaccineDetails(resList); - return new Gson().toJson(ancWomenVaccineDetails); - } - - @Override - public int updateBenAdherenceDetails(BenAdherence benAdherence) { - int r = 0; - String processed = benAdherenceRepo.getBenAdherenceDetailsStatus(benAdherence.getBeneficiaryRegID(), - benAdherence.getBenVisitID(), benAdherence.getID()); - if (null != processed && !"N".equals(processed)) { - processed = "U"; - } else { - processed = "N"; - } - r = benAdherenceRepo.updateBenAdherence(benAdherence.getToDrugs(), benAdherence.getDrugReason(), - benAdherence.getToReferral(), benAdherence.getReferralReason(), benAdherence.getProgress(), - benAdherence.getModifiedBy(), processed, benAdherence.getBeneficiaryRegID(), - benAdherence.getBenVisitID(), benAdherence.getID()); - /* + return r; + } + + + @Override + public Long saveBenAncCareDetails + (ANCCareDetails ancCareDetailsOBJ) throws ParseException { + Long ancCareSuccessFlag = null; + if (ancCareDetailsOBJ.getLmpDate() != null && !ancCareDetailsOBJ.getLmpDate().isEmpty() + && ancCareDetailsOBJ.getLmpDate().length() >= 10) { + String lmpDate = ancCareDetailsOBJ.getLmpDate().split("T")[0]; + ancCareDetailsOBJ + .setLastMenstrualPeriod_LMP(new Date(new SimpleDateFormat("yyyy-MM-dd").parse(lmpDate).getTime())); + } + if (ancCareDetailsOBJ.getExpDelDt() != null && !ancCareDetailsOBJ.getExpDelDt().isEmpty() + && ancCareDetailsOBJ.getExpDelDt().length() >= 10) { + String edDate = ancCareDetailsOBJ.getExpDelDt().split("T")[0]; + ancCareDetailsOBJ + .setExpectedDateofDelivery(new Date(new SimpleDateFormat("yyyy-MM-dd").parse(edDate).getTime())); + } + ANCCareDetails ancCareDetailsRS = ancCareRepo.save(ancCareDetailsOBJ); + if (ancCareDetailsRS != null) { + ancCareDetailsRS.setVanSerialNo((ancCareDetailsRS.getID())); + ancCareSuccessFlag = ancCareDetailsRS.getID(); + } + return ancCareSuccessFlag; + } + + @Override + public Long saveAncImmunizationDetails + (WrapperAncImmunization wrapperAncImmunizationOBJ) throws ParseException { + Long successFlag = null; + List ancWomenVaccineDetailList = getANCWomenVaccineDetail(wrapperAncImmunizationOBJ); + List ancWomenVaccineDetailRSList = (List) ancWomenVaccineRepo + .saveAll(ancWomenVaccineDetailList); + if (!ancWomenVaccineDetailRSList.isEmpty()) { + ancWomenVaccineDetailRSList.get(0).setVanSerialNo(ancWomenVaccineDetailRSList.get(0).getID()); + successFlag = ancWomenVaccineDetailRSList.get(0).getID(); + } + return successFlag; + } + + + + private List getANCWomenVaccineDetail(WrapperAncImmunization wrapperAncImmunizationOBJ) + throws ParseException { + List ancWomenVaccineDetailList = new ArrayList(); + ANCWomenVaccineDetail ancWomenVaccineDetail; + if (wrapperAncImmunizationOBJ != null) { + + // TT-1 details + ancWomenVaccineDetail = new ANCWomenVaccineDetail(); + ancWomenVaccineDetail.setBeneficiaryRegID(wrapperAncImmunizationOBJ.getBeneficiaryRegID()); + ancWomenVaccineDetail.setBenVisitID(wrapperAncImmunizationOBJ.getBenVisitID()); + ancWomenVaccineDetail.setVisitCode(wrapperAncImmunizationOBJ.getVisitCode()); + ancWomenVaccineDetail.setProviderServiceMapID(wrapperAncImmunizationOBJ.getProviderServiceMapID()); + ancWomenVaccineDetail.setVanID(wrapperAncImmunizationOBJ.getVanID()); + ancWomenVaccineDetail.setParkingPlaceID(wrapperAncImmunizationOBJ.getParkingPlaceID()); + ancWomenVaccineDetail.setCreatedBy(wrapperAncImmunizationOBJ.getCreatedBy()); + ancWomenVaccineDetail.setID(wrapperAncImmunizationOBJ.gettT1ID()); + ancWomenVaccineDetail.setVaccineName("TT-1"); + ancWomenVaccineDetail.setStatus(wrapperAncImmunizationOBJ.gettT_1Status()); + if (wrapperAncImmunizationOBJ.getDateReceivedForTT_1() != null + && wrapperAncImmunizationOBJ.getDateReceivedForTT_1().length() >= 10) { + String TT_1 = wrapperAncImmunizationOBJ.getDateReceivedForTT_1().split("T")[0]; + ancWomenVaccineDetail + .setReceivedDate(new Date(new SimpleDateFormat("yyyy-MM-dd").parse(TT_1).getTime())); + } + ancWomenVaccineDetail.setReceivedFacilityName(wrapperAncImmunizationOBJ.getFacilityNameOfTT_1()); + ancWomenVaccineDetail.setModifiedBy(wrapperAncImmunizationOBJ.getModifiedBy()); + ancWomenVaccineDetailList.add(ancWomenVaccineDetail); + + // TT-2 details + ancWomenVaccineDetail = new ANCWomenVaccineDetail(); + ancWomenVaccineDetail.setBeneficiaryRegID(wrapperAncImmunizationOBJ.getBeneficiaryRegID()); + ancWomenVaccineDetail.setBenVisitID(wrapperAncImmunizationOBJ.getBenVisitID()); + ancWomenVaccineDetail.setProviderServiceMapID(wrapperAncImmunizationOBJ.getProviderServiceMapID()); + ancWomenVaccineDetail.setVanID(wrapperAncImmunizationOBJ.getVanID()); + ancWomenVaccineDetail.setParkingPlaceID(wrapperAncImmunizationOBJ.getParkingPlaceID()); + ancWomenVaccineDetail.setVisitCode(wrapperAncImmunizationOBJ.getVisitCode()); + ancWomenVaccineDetail.setCreatedBy(wrapperAncImmunizationOBJ.getCreatedBy()); + ancWomenVaccineDetail.setID(wrapperAncImmunizationOBJ.gettT2ID()); + ancWomenVaccineDetail.setVaccineName("TT-2"); + ancWomenVaccineDetail.setStatus(wrapperAncImmunizationOBJ.gettT_2Status()); + if (wrapperAncImmunizationOBJ.getDateReceivedForTT_2() != null + && wrapperAncImmunizationOBJ.getDateReceivedForTT_2().length() >= 10) { + String TT_2 = wrapperAncImmunizationOBJ.getDateReceivedForTT_2().split("T")[0]; + ancWomenVaccineDetail + .setReceivedDate(new Date(new SimpleDateFormat("yyyy-MM-dd").parse(TT_2).getTime())); + } + ancWomenVaccineDetail.setReceivedFacilityName(wrapperAncImmunizationOBJ.getFacilityNameOfTT_2()); + ancWomenVaccineDetail.setModifiedBy(wrapperAncImmunizationOBJ.getModifiedBy()); + ancWomenVaccineDetailList.add(ancWomenVaccineDetail); + + // TT-3 (Booster) details + ancWomenVaccineDetail = new ANCWomenVaccineDetail(); + ancWomenVaccineDetail.setBeneficiaryRegID(wrapperAncImmunizationOBJ.getBeneficiaryRegID()); + ancWomenVaccineDetail.setBenVisitID(wrapperAncImmunizationOBJ.getBenVisitID()); + ancWomenVaccineDetail.setProviderServiceMapID(wrapperAncImmunizationOBJ.getProviderServiceMapID()); + ancWomenVaccineDetail.setVanID(wrapperAncImmunizationOBJ.getVanID()); + ancWomenVaccineDetail.setParkingPlaceID(wrapperAncImmunizationOBJ.getParkingPlaceID()); + ancWomenVaccineDetail.setVisitCode(wrapperAncImmunizationOBJ.getVisitCode()); + ancWomenVaccineDetail.setCreatedBy(wrapperAncImmunizationOBJ.getCreatedBy()); + ancWomenVaccineDetail.setID(wrapperAncImmunizationOBJ.gettT3ID()); + ancWomenVaccineDetail.setVaccineName("TT-Booster"); + ancWomenVaccineDetail.setStatus(wrapperAncImmunizationOBJ.gettT_3Status()); + if (wrapperAncImmunizationOBJ.getDateReceivedForTT_3() != null + && wrapperAncImmunizationOBJ.getDateReceivedForTT_3().length() >= 10) { + String TT_3 = wrapperAncImmunizationOBJ.getDateReceivedForTT_3().split("T")[0]; + ancWomenVaccineDetail + .setReceivedDate(new Date(new SimpleDateFormat("yyyy-MM-dd").parse(TT_3).getTime())); + } + ancWomenVaccineDetail.setReceivedFacilityName(wrapperAncImmunizationOBJ.getFacilityNameOfTT_3()); + ancWomenVaccineDetail.setModifiedBy(wrapperAncImmunizationOBJ.getModifiedBy()); + ancWomenVaccineDetailList.add(ancWomenVaccineDetail); + + } + return ancWomenVaccineDetailList; + } + + @Override + public Long saveSysObstetricExamination(SysObstetricExamination obstetricExamination) { + // TODO Auto-generated method stub + Long r = null; + SysObstetricExamination obstetricExaminationRS = sysObstetricExaminationRepo.save(obstetricExamination); + if (obstetricExaminationRS != null) { + r = obstetricExaminationRS.getID(); + } + return r; + } + + public SysObstetricExamination getSysObstetricExamination(Long benRegID, Long visitCode) { + SysObstetricExamination sysObstetricExaminationData = sysObstetricExaminationRepo + .getSysObstetricExaminationData(benRegID, visitCode); + + return sysObstetricExaminationData; + } + + @Override + public String getANCCareDetails(Long beneficiaryRegID, Long visitCode) { + ArrayList resList = ancCareRepo.getANCCareDetails(beneficiaryRegID, visitCode); + ANCCareDetails ancCareDetails = ANCCareDetails.getANCCareDetails(resList); + return new Gson().toJson(ancCareDetails); + } + + @Override + public String getANCWomenVaccineDetails(Long beneficiaryRegID, Long visitCode) { + ArrayList resList = ancWomenVaccineRepo.getANCWomenVaccineDetails(beneficiaryRegID, visitCode); + WrapperAncImmunization ancWomenVaccineDetails = ANCWomenVaccineDetail.getANCWomenVaccineDetails(resList); + return new Gson().toJson(ancWomenVaccineDetails); + } + + @Override + public int updateBenAdherenceDetails(BenAdherence benAdherence) { + int r = 0; + String processed = benAdherenceRepo.getBenAdherenceDetailsStatus(benAdherence.getBeneficiaryRegID(), + benAdherence.getBenVisitID(), benAdherence.getID()); + if (null != processed && !"N".equals(processed)) { + processed = "U"; + } else { + processed = "N"; + } + r = benAdherenceRepo.updateBenAdherence(benAdherence.getToDrugs(), benAdherence.getDrugReason(), + benAdherence.getToReferral(), benAdherence.getReferralReason(), benAdherence.getProgress(), + benAdherence.getModifiedBy(), processed, benAdherence.getBeneficiaryRegID(), + benAdherence.getBenVisitID(), benAdherence.getID()); + /* * BenAdherence adherence= benAdherenceRepo.save(benAdherence); if(null * !=adherence){ r=1; } - */ - return r; - } - - @Override - public int updateBenAncCareDetails(ANCCareDetails ancCareDetailsOBJ) throws ParseException { - int r = 0; - - String processed = ancCareRepo.getBenANCCareDetailsStatus(ancCareDetailsOBJ.getBeneficiaryRegID(), - ancCareDetailsOBJ.getVisitCode()); - if (null != processed && !"N".equals(processed)) { - processed = "U"; - } else { - processed = "N"; - } - - if (ancCareDetailsOBJ.getLmpDate() != null && !ancCareDetailsOBJ.getLmpDate().isEmpty() - && ancCareDetailsOBJ.getLmpDate().length() >= 10) { - String lmpDate = ancCareDetailsOBJ.getLmpDate().split("T")[0]; - ancCareDetailsOBJ - .setLastMenstrualPeriod_LMP(new Date(new SimpleDateFormat("yyyy-MM-dd").parse(lmpDate).getTime())); - } - if (ancCareDetailsOBJ.getExpDelDt() != null && !ancCareDetailsOBJ.getExpDelDt().isEmpty() - && ancCareDetailsOBJ.getExpDelDt().length() >= 10) { - String edDate = ancCareDetailsOBJ.getExpDelDt().split("T")[0]; - ancCareDetailsOBJ - .setExpectedDateofDelivery(new Date(new SimpleDateFormat("yyyy-MM-dd").parse(edDate).getTime())); - } - - r = ancCareRepo.updateANCCareDetails(ancCareDetailsOBJ.getComolaintType(), ancCareDetailsOBJ.getDuration(), - ancCareDetailsOBJ.getDescription(), ancCareDetailsOBJ.getLastMenstrualPeriod_LMP(), - ancCareDetailsOBJ.getGestationalAgeOrPeriodofAmenorrhea_POA(), ancCareDetailsOBJ.getTrimesterNumber(), - ancCareDetailsOBJ.getExpectedDateofDelivery(), ancCareDetailsOBJ.getPrimiGravida(), - ancCareDetailsOBJ.getGravida_G(), ancCareDetailsOBJ.getTermDeliveries_T(), - ancCareDetailsOBJ.getPretermDeliveries_P(), ancCareDetailsOBJ.getAbortions_A(), - ancCareDetailsOBJ.getLivebirths_L(), ancCareDetailsOBJ.getBloodGroup(), - ancCareDetailsOBJ.getModifiedBy(), processed, ancCareDetailsOBJ.getBeneficiaryRegID(), - ancCareDetailsOBJ.getVisitCode(), ancCareDetailsOBJ.getStillBirth()); - return r; - } - - @Override - public int updateBenAncImmunizationDetails(WrapperAncImmunization wrapperAncImmunization) throws ParseException { - int r = 0; - - List ancWomenVaccineDetailList = getANCWomenVaccineDetail(wrapperAncImmunization); - - if (null != ancWomenVaccineDetailList) { - - String processed = "N"; - ANCWomenVaccineDetail ancWomenVaccine = ancWomenVaccineDetailList.get(0); - ArrayList ancWomenVaccineStatuses = ancWomenVaccineRepo - .getBenANCWomenVaccineStatus(ancWomenVaccine.getBeneficiaryRegID(), ancWomenVaccine.getVisitCode()); - Map womenVaccineStatuses = new HashMap(); - - for (Object[] obj : ancWomenVaccineStatuses) { - womenVaccineStatuses.put((String) obj[0], (String) obj[1]); - } - - for (ANCWomenVaccineDetail ancWomenVaccineDetail : ancWomenVaccineDetailList) { - processed = womenVaccineStatuses.get(ancWomenVaccineDetail.getVaccineName()); - if (null != processed && !processed.equals("N")) { - processed = "U"; - } else { - processed = "N"; - } - - r = ancWomenVaccineRepo.updateANCImmunizationDetails(ancWomenVaccineDetail.getStatus(), - ancWomenVaccineDetail.getReceivedDate(), ancWomenVaccineDetail.getReceivedFacilityName(), - ancWomenVaccineDetail.getModifiedBy(), processed, ancWomenVaccineDetail.getBeneficiaryRegID(), - ancWomenVaccineDetail.getVisitCode(), ancWomenVaccineDetail.getVaccineName()); - - } - } - return r; - } - - @Override - public int updateSysObstetricExamination(SysObstetricExamination obstetricExamination) { - int r = 0; - if (null != obstetricExamination) { - String processed = sysObstetricExaminationRepo.getBenObstetricExaminationStatus( - obstetricExamination.getBeneficiaryRegID(), obstetricExamination.getVisitCode()); - if (null != processed && !"N".equals(processed)) { - processed = "U"; - } else { - processed = "N"; - } - r = sysObstetricExaminationRepo.updateSysObstetricExamination(obstetricExamination.getFundalHeight(), - obstetricExamination.getfHAndPOA_Status(), obstetricExamination.getfHAndPOA_Interpretation(), - obstetricExamination.getFetalMovements(), obstetricExamination.getFetalHeartSounds(), - obstetricExamination.getFetalHeartRate_BeatsPerMinute(), - obstetricExamination.getFetalPositionOrLie(), obstetricExamination.getFetalPresentation(), - obstetricExamination.getAbdominalScars(), obstetricExamination.getModifiedBy(), - obstetricExamination.getSfh(), processed, obstetricExamination.getBeneficiaryRegID(), - obstetricExamination.getVisitCode()); - } - return r; - } + */ + return r; + } + + @Override + public int updateBenAncCareDetails(ANCCareDetails ancCareDetailsOBJ) throws ParseException { + int r = 0; + + String processed = ancCareRepo.getBenANCCareDetailsStatus(ancCareDetailsOBJ.getBeneficiaryRegID(), + ancCareDetailsOBJ.getVisitCode()); + if (null != processed && !"N".equals(processed)) { + processed = "U"; + } else { + processed = "N"; + } + + if (ancCareDetailsOBJ.getLmpDate() != null && !ancCareDetailsOBJ.getLmpDate().isEmpty() + && ancCareDetailsOBJ.getLmpDate().length() >= 10) { + String lmpDate = ancCareDetailsOBJ.getLmpDate().split("T")[0]; + ancCareDetailsOBJ + .setLastMenstrualPeriod_LMP(new Date(new SimpleDateFormat("yyyy-MM-dd").parse(lmpDate).getTime())); + } + if (ancCareDetailsOBJ.getExpDelDt() != null && !ancCareDetailsOBJ.getExpDelDt().isEmpty() + && ancCareDetailsOBJ.getExpDelDt().length() >= 10) { + String edDate = ancCareDetailsOBJ.getExpDelDt().split("T")[0]; + ancCareDetailsOBJ + .setExpectedDateofDelivery(new Date(new SimpleDateFormat("yyyy-MM-dd").parse(edDate).getTime())); + } + + r = ancCareRepo.updateANCCareDetails(ancCareDetailsOBJ.getComolaintType(), ancCareDetailsOBJ.getDuration(), + ancCareDetailsOBJ.getDescription(), ancCareDetailsOBJ.getLastMenstrualPeriod_LMP(), + ancCareDetailsOBJ.getGestationalAgeOrPeriodofAmenorrhea_POA(), ancCareDetailsOBJ.getTrimesterNumber(), + ancCareDetailsOBJ.getExpectedDateofDelivery(), ancCareDetailsOBJ.getPrimiGravida(), + ancCareDetailsOBJ.getGravida_G(), ancCareDetailsOBJ.getTermDeliveries_T(), + ancCareDetailsOBJ.getPretermDeliveries_P(), ancCareDetailsOBJ.getAbortions_A(), + ancCareDetailsOBJ.getLivebirths_L(), ancCareDetailsOBJ.getBloodGroup(), + ancCareDetailsOBJ.getModifiedBy(), processed, ancCareDetailsOBJ.getBeneficiaryRegID(), + ancCareDetailsOBJ.getVisitCode(), ancCareDetailsOBJ.getStillBirth()); + return r; + } + + @Override + public int updateBenAncImmunizationDetails(WrapperAncImmunization wrapperAncImmunization) throws ParseException { + int r = 0; + + List ancWomenVaccineDetailList = getANCWomenVaccineDetail(wrapperAncImmunization); + + if (null != ancWomenVaccineDetailList) { + + String processed = "N"; + ANCWomenVaccineDetail ancWomenVaccine = ancWomenVaccineDetailList.get(0); + ArrayList ancWomenVaccineStatuses = ancWomenVaccineRepo + .getBenANCWomenVaccineStatus(ancWomenVaccine.getBeneficiaryRegID(), ancWomenVaccine.getVisitCode()); + Map womenVaccineStatuses = new HashMap(); + + for (Object[] obj : ancWomenVaccineStatuses) { + womenVaccineStatuses.put((String) obj[0], (String) obj[1]); + } + + for (ANCWomenVaccineDetail ancWomenVaccineDetail : ancWomenVaccineDetailList) { + processed = womenVaccineStatuses.get(ancWomenVaccineDetail.getVaccineName()); + if (null != processed && !processed.equals("N")) { + processed = "U"; + } else { + processed = "N"; + } + + r = ancWomenVaccineRepo.updateANCImmunizationDetails(ancWomenVaccineDetail.getStatus(), + ancWomenVaccineDetail.getReceivedDate(), ancWomenVaccineDetail.getReceivedFacilityName(), + ancWomenVaccineDetail.getModifiedBy(), processed, ancWomenVaccineDetail.getBeneficiaryRegID(), + ancWomenVaccineDetail.getVisitCode(), ancWomenVaccineDetail.getVaccineName()); + + } + } + return r; + } + + @Override + public int updateSysObstetricExamination(SysObstetricExamination obstetricExamination) { + int r = 0; + if (null != obstetricExamination) { + String processed = sysObstetricExaminationRepo.getBenObstetricExaminationStatus( + obstetricExamination.getBeneficiaryRegID(), obstetricExamination.getVisitCode()); + if (null != processed && !"N".equals(processed)) { + processed = "U"; + } else { + processed = "N"; + } + r = sysObstetricExaminationRepo.updateSysObstetricExamination(obstetricExamination.getFundalHeight(), + obstetricExamination.getfHAndPOA_Status(), obstetricExamination.getfHAndPOA_Interpretation(), + obstetricExamination.getFetalMovements(), obstetricExamination.getFetalHeartSounds(), + obstetricExamination.getFetalHeartRate_BeatsPerMinute(), + obstetricExamination.getFetalPositionOrLie(), obstetricExamination.getFetalPresentation(), + obstetricExamination.getAbdominalScars(), obstetricExamination.getModifiedBy(), + obstetricExamination.getSfh(), processed, obstetricExamination.getBeneficiaryRegID(), + obstetricExamination.getVisitCode()); + } + return r; + } } diff --git a/src/main/java/com/iemr/mmu/service/labtechnician/LabTechnicianServiceImpl.java b/src/main/java/com/iemr/mmu/service/labtechnician/LabTechnicianServiceImpl.java index 138f626c..1026f63c 100644 --- a/src/main/java/com/iemr/mmu/service/labtechnician/LabTechnicianServiceImpl.java +++ b/src/main/java/com/iemr/mmu/service/labtechnician/LabTechnicianServiceImpl.java @@ -18,7 +18,7 @@ * * You should have received a copy of the GNU General Public License * along with this program. If not, see https://www.gnu.org/licenses/. -*/ + */ package com.iemr.mmu.service.labtechnician; import java.util.ArrayList; @@ -42,248 +42,249 @@ @Service public class LabTechnicianServiceImpl implements LabTechnicianService { - private V_benLabTestOrderedDetailsRepo v_benLabTestOrderedDetailsRepo; - private LabResultEntryRepo labResultEntryRepo; - private CommonBenStatusFlowServiceImpl commonBenStatusFlowServiceImpl; - - @Autowired - public void setCommonBenStatusFlowServiceImpl(CommonBenStatusFlowServiceImpl commonBenStatusFlowServiceImpl) { - this.commonBenStatusFlowServiceImpl = commonBenStatusFlowServiceImpl; - } - - @Autowired - public void setLabResultEntryRepo(LabResultEntryRepo labResultEntryRepo) { - this.labResultEntryRepo = labResultEntryRepo; - } - - @Autowired - public void setV_benLabTestOrderedDetailsRepo(V_benLabTestOrderedDetailsRepo v_benLabTestOrderedDetailsRepo) { - this.v_benLabTestOrderedDetailsRepo = v_benLabTestOrderedDetailsRepo; - } - - public String getBenePrescribedProcedureDetails(Long benRegID, Long visitCode) throws Exception { - Map returnOBJ = new HashMap<>(); - - ArrayList radiologyList; - ArrayList laboratoryList; - - ArrayList resultEnteredProcList = new ArrayList<>(); - - ArrayList procedureResults = getLabResultDataForBen(benRegID, visitCode); - - if (procedureResults != null && procedureResults.size() > 0) { - for (LabResultEntry obj : procedureResults) { - resultEnteredProcList.add(obj.getProcedureID()); - } - } - resultEnteredProcList.add(0); - - ArrayList orderedLabTestListLab = v_benLabTestOrderedDetailsRepo - .findDistinctByBeneficiaryRegIDAndVisitCodeAndProcedureTypeAndProcedureIDNotInOrderByProcedureIDAscTestComponentIDAscResultValueAsc( - benRegID, visitCode, "Laboratory", resultEnteredProcList); - - ArrayList orderedLabTestListRadio = v_benLabTestOrderedDetailsRepo - .findDistinctByBeneficiaryRegIDAndVisitCodeAndProcedureTypeAndProcedureIDNotInOrderByProcedureIDAscTestComponentIDAscResultValueAsc( - benRegID, visitCode, "Radiology", resultEnteredProcList); - - radiologyList = getPrescribedLabTestInJsonFormatRadiology(orderedLabTestListRadio); - laboratoryList = getPrescribedLabTestInJsonFormatlaboratory(orderedLabTestListLab); - - returnOBJ.put("radiologyList", radiologyList); - returnOBJ.put("laboratoryList", laboratoryList); - returnOBJ.put("archive", procedureResults); - - return new Gson().toJson(returnOBJ); - } - - private ArrayList getPrescribedLabTestInJsonFormatlaboratory( - ArrayList orderedLabTestList) { - - ArrayList returnOBJ = new ArrayList<>(); - Map procDetails = null; - ArrayList compList = null; - Map compDetails = null; - Map compOption = null; - ArrayList compOptionList = null; - - if (orderedLabTestList != null && orderedLabTestList.size() > 0) { - for (V_benLabTestOrderedDetails obj : orderedLabTestList) { - - if (procDetails == null || (procDetails.containsKey("procedureID") - && !obj.getProcedureID().equals(procDetails.get("procedureID")))) { - procDetails = new HashMap<>(); - compList = new ArrayList<>(); - - procDetails.put("procedureID", obj.getProcedureID()); - procDetails.put("procedureName", obj.getProcedureName()); - procDetails.put("procedureDesc", obj.getProcedureDesc()); - procDetails.put("procedureType", "Laboratory"); - procDetails.put("prescriptionID", obj.getPrescriptionID()); - - procDetails.put("iotProcedureName", obj.getIotProcedureName()); - procDetails.put("procedureCode", obj.getProcedureCode()); - procDetails.put("procedureStartAPI", obj.getProcedureStartAPI()); - procDetails.put("procedureEndAPI", obj.getProcedureEndAPI()); - procDetails.put("procedureStatusAPI", obj.getProcedureStatusAPI()); - procDetails.put("isLabProcedure", obj.getIsLabProcedure()); - procDetails.put("discoveryCode", obj.getDiscoveryCode()); - procDetails.put("isMandatory", obj.getIsMandatory()); - procDetails.put("calibrationStartAPI", obj.getCalibrationStartAPI()); - procDetails.put("calibrationStatusAPI", obj.getCalibrationStatusAPI()); - procDetails.put("calibrationEndAPI", obj.getCalibrationEndAPI()); - // System.out.println(procDetails.get("procedureID")); + + private V_benLabTestOrderedDetailsRepo v_benLabTestOrderedDetailsRepo; + private LabResultEntryRepo labResultEntryRepo; + private CommonBenStatusFlowServiceImpl commonBenStatusFlowServiceImpl; + + @Autowired + public void setCommonBenStatusFlowServiceImpl(CommonBenStatusFlowServiceImpl commonBenStatusFlowServiceImpl) { + this.commonBenStatusFlowServiceImpl = commonBenStatusFlowServiceImpl; + } + + @Autowired + public void setLabResultEntryRepo(LabResultEntryRepo labResultEntryRepo) { + this.labResultEntryRepo = labResultEntryRepo; + } + + @Autowired + public void setV_benLabTestOrderedDetailsRepo(V_benLabTestOrderedDetailsRepo v_benLabTestOrderedDetailsRepo) { + this.v_benLabTestOrderedDetailsRepo = v_benLabTestOrderedDetailsRepo; + } + + public String getBenePrescribedProcedureDetails(Long benRegID, Long visitCode) throws Exception { + Map returnOBJ = new HashMap<>(); + + ArrayList radiologyList; + ArrayList laboratoryList; + + ArrayList resultEnteredProcList = new ArrayList<>(); + + ArrayList procedureResults = getLabResultDataForBen(benRegID, visitCode); + + if (procedureResults != null && procedureResults.size() > 0) { + for (LabResultEntry obj : procedureResults) { + resultEnteredProcList.add(obj.getProcedureID()); + } + } + resultEnteredProcList.add(0); + + ArrayList orderedLabTestListLab = v_benLabTestOrderedDetailsRepo + .findDistinctByBeneficiaryRegIDAndVisitCodeAndProcedureTypeAndProcedureIDNotInOrderByProcedureIDAscTestComponentIDAscResultValueAsc( + benRegID, visitCode, "Laboratory", resultEnteredProcList); + + ArrayList orderedLabTestListRadio = v_benLabTestOrderedDetailsRepo + .findDistinctByBeneficiaryRegIDAndVisitCodeAndProcedureTypeAndProcedureIDNotInOrderByProcedureIDAscTestComponentIDAscResultValueAsc( + benRegID, visitCode, "Radiology", resultEnteredProcList); + + radiologyList = getPrescribedLabTestInJsonFormatRadiology(orderedLabTestListRadio); + laboratoryList = getPrescribedLabTestInJsonFormatlaboratory(orderedLabTestListLab); + + returnOBJ.put("radiologyList", radiologyList); + returnOBJ.put("laboratoryList", laboratoryList); + returnOBJ.put("archive", procedureResults); + + return new Gson().toJson(returnOBJ); + } + + private ArrayList getPrescribedLabTestInJsonFormatlaboratory( + ArrayList orderedLabTestList) { + + ArrayList returnOBJ = new ArrayList<>(); + Map procDetails = null; + ArrayList compList = null; + Map compDetails = null; + Map compOption = null; + ArrayList compOptionList = null; + + if (orderedLabTestList != null && orderedLabTestList.size() > 0) { + for (V_benLabTestOrderedDetails obj : orderedLabTestList) { + + if (procDetails == null || (procDetails.containsKey("procedureID") + && !obj.getProcedureID().equals(procDetails.get("procedureID")))) { + procDetails = new HashMap<>(); + compList = new ArrayList<>(); + + procDetails.put("procedureID", obj.getProcedureID()); + procDetails.put("procedureName", obj.getProcedureName()); + procDetails.put("procedureDesc", obj.getProcedureDesc()); + procDetails.put("procedureType", "Laboratory"); + procDetails.put("prescriptionID", obj.getPrescriptionID()); + + procDetails.put("iotProcedureName", obj.getIotProcedureName()); + procDetails.put("procedureCode", obj.getProcedureCode()); + procDetails.put("procedureStartAPI", obj.getProcedureStartAPI()); + procDetails.put("procedureEndAPI", obj.getProcedureEndAPI()); + procDetails.put("procedureStatusAPI", obj.getProcedureStatusAPI()); + procDetails.put("isLabProcedure", obj.getIsLabProcedure()); + procDetails.put("discoveryCode", obj.getDiscoveryCode()); + procDetails.put("isMandatory", obj.getIsMandatory()); + procDetails.put("calibrationStartAPI", obj.getCalibrationStartAPI()); + procDetails.put("calibrationStatusAPI", obj.getCalibrationStatusAPI()); + procDetails.put("calibrationEndAPI", obj.getCalibrationEndAPI()); + // System.out.println(procDetails.get("procedureID")); // if (procDetails.get("procedureID") instanceof Integer // && obj.getProcedureID() == procDetails.get("procedureID")) { // //System.out.println("hello"); // } - if (procDetails.containsKey("compListDetails") == false) { - compList = new ArrayList<>(); - compDetails = new HashMap<>(); - compDetails.put("testComponentID", obj.getTestComponentID()); - compDetails.put("testComponentName", obj.getTestComponentName()); - compDetails.put("testComponentDesc", obj.getTestComponentDesc()); - compDetails.put("inputType", obj.getInputType()); - compDetails.put("measurementUnit", obj.getMeasurementUnit()); - compDetails.put("range_min", obj.getRange_min()); - compDetails.put("range_normal_min", obj.getRange_normal_min()); - compDetails.put("range_normal_max", obj.getRange_normal_max()); - compDetails.put("range_max", obj.getRange_max()); - compDetails.put("isDecimal", obj.getIsDecimal()); - - compDetails.put("iotComponentName", obj.getIOTComponentName()); - compDetails.put("componentCode", obj.getComponentCode()); - compDetails.put("iotProcedureID", obj.getIOTProcedureID()); - compDetails.put("componentUnit", obj.getComponentUnit()); - - compOption = new HashMap<>(); - compOptionList = new ArrayList<>(); - - compOption.put("name", obj.getResultValue()); - compOptionList.add(compOption); - - compDetails.put("compOpt", compOptionList); - - compList.add(compDetails); - procDetails.put("compListDetails", compList); - - } else { - compDetails = new HashMap<>(); - compDetails.put("testComponentID", obj.getTestComponentID()); - compDetails.put("testComponentName", obj.getTestComponentName()); - compDetails.put("testComponentDesc", obj.getTestComponentDesc()); - compDetails.put("inputType", obj.getInputType()); - compDetails.put("isDecimal", obj.getIsDecimal()); - compDetails.put("measurementUnit", obj.getMeasurementUnit()); - compDetails.put("range_min", obj.getRange_min()); - compDetails.put("range_normal_min", obj.getRange_normal_min()); - compDetails.put("range_normal_max", obj.getRange_normal_max()); - compDetails.put("range_max", obj.getRange_max()); - - compDetails.put("iotComponentName", obj.getIOTComponentName()); - compDetails.put("componentCode", obj.getComponentCode()); - compDetails.put("iotProcedureID", obj.getIOTProcedureID()); - compDetails.put("componentUnit", obj.getComponentUnit()); - - compOption = new HashMap<>(); - compOptionList = new ArrayList<>(); - - compOption.put("name", obj.getResultValue()); - compOptionList.add(compOption); - - compDetails.put("compOpt", compOptionList); - - compList.add(compDetails); - - } - - returnOBJ.add(procDetails); - - } else { - - if (compDetails == null || (compDetails.containsKey("testComponentID") - && !obj.getTestComponentID().equals(compDetails.get("testComponentID")))) { - - compDetails = new HashMap<>(); - compDetails.put("testComponentID", obj.getTestComponentID()); - compDetails.put("testComponentName", obj.getTestComponentName()); - compDetails.put("testComponentDesc", obj.getTestComponentDesc()); - compDetails.put("inputType", obj.getInputType()); - compDetails.put("isDecimal", obj.getIsDecimal()); - compDetails.put("measurementUnit", obj.getMeasurementUnit()); - compDetails.put("range_min", obj.getRange_min()); - compDetails.put("range_normal_min", obj.getRange_normal_min()); - compDetails.put("range_normal_max", obj.getRange_normal_max()); - compDetails.put("range_max", obj.getRange_max()); - - compDetails.put("iotComponentName", obj.getIOTComponentName()); - compDetails.put("componentCode", obj.getComponentCode()); - compDetails.put("iotProcedureID", obj.getIOTProcedureID()); - compDetails.put("componentUnit", obj.getComponentUnit()); - - compOption = new HashMap<>(); - compOptionList = new ArrayList<>(); - - compOption.put("name", obj.getResultValue()); - compOptionList.add(compOption); - - compDetails.put("compOpt", compOptionList); - - compList.add(compDetails); - } else { - compOption = new HashMap<>(); - compOption.put("name", obj.getResultValue()); - compOptionList.add(compOption); - } - - } - } - } - - return returnOBJ; - } - - public ArrayList getLabResultDataForBen(Long benRegID, Long visitCode) throws Exception { - ArrayList procedureResults = new ArrayList<>(); - procedureResults = labResultEntryRepo.findByBeneficiaryRegIDAndVisitCodeOrderByProcedureIDAsc(benRegID, - visitCode); - procedureResults = LabResultEntry.getLabResultEntry(procedureResults); - return procedureResults; - } + if (procDetails.containsKey("compListDetails") == false) { + compList = new ArrayList<>(); + compDetails = new HashMap<>(); + compDetails.put("testComponentID", obj.getTestComponentID()); + compDetails.put("testComponentName", obj.getTestComponentName()); + compDetails.put("testComponentDesc", obj.getTestComponentDesc()); + compDetails.put("inputType", obj.getInputType()); + compDetails.put("measurementUnit", obj.getMeasurementUnit()); + compDetails.put("range_min", obj.getRange_min()); + compDetails.put("range_normal_min", obj.getRange_normal_min()); + compDetails.put("range_normal_max", obj.getRange_normal_max()); + compDetails.put("range_max", obj.getRange_max()); + compDetails.put("isDecimal", obj.getIsDecimal()); + + compDetails.put("iotComponentName", obj.getIOTComponentName()); + compDetails.put("componentCode", obj.getComponentCode()); + compDetails.put("iotProcedureID", obj.getIOTProcedureID()); + compDetails.put("componentUnit", obj.getComponentUnit()); + + compOption = new HashMap<>(); + compOptionList = new ArrayList<>(); + + compOption.put("name", obj.getResultValue()); + compOptionList.add(compOption); + + compDetails.put("compOpt", compOptionList); + + compList.add(compDetails); + procDetails.put("compListDetails", compList); + + } else { + compDetails = new HashMap<>(); + compDetails.put("testComponentID", obj.getTestComponentID()); + compDetails.put("testComponentName", obj.getTestComponentName()); + compDetails.put("testComponentDesc", obj.getTestComponentDesc()); + compDetails.put("inputType", obj.getInputType()); + compDetails.put("isDecimal", obj.getIsDecimal()); + compDetails.put("measurementUnit", obj.getMeasurementUnit()); + compDetails.put("range_min", obj.getRange_min()); + compDetails.put("range_normal_min", obj.getRange_normal_min()); + compDetails.put("range_normal_max", obj.getRange_normal_max()); + compDetails.put("range_max", obj.getRange_max()); + + compDetails.put("iotComponentName", obj.getIOTComponentName()); + compDetails.put("componentCode", obj.getComponentCode()); + compDetails.put("iotProcedureID", obj.getIOTProcedureID()); + compDetails.put("componentUnit", obj.getComponentUnit()); + + compOption = new HashMap<>(); + compOptionList = new ArrayList<>(); + + compOption.put("name", obj.getResultValue()); + compOptionList.add(compOption); + + compDetails.put("compOpt", compOptionList); + + compList.add(compDetails); + + } + + returnOBJ.add(procDetails); + + } else { + + if (compDetails == null || (compDetails.containsKey("testComponentID") + && !obj.getTestComponentID().equals(compDetails.get("testComponentID")))) { + + compDetails = new HashMap<>(); + compDetails.put("testComponentID", obj.getTestComponentID()); + compDetails.put("testComponentName", obj.getTestComponentName()); + compDetails.put("testComponentDesc", obj.getTestComponentDesc()); + compDetails.put("inputType", obj.getInputType()); + compDetails.put("isDecimal", obj.getIsDecimal()); + compDetails.put("measurementUnit", obj.getMeasurementUnit()); + compDetails.put("range_min", obj.getRange_min()); + compDetails.put("range_normal_min", obj.getRange_normal_min()); + compDetails.put("range_normal_max", obj.getRange_normal_max()); + compDetails.put("range_max", obj.getRange_max()); + + compDetails.put("iotComponentName", obj.getIOTComponentName()); + compDetails.put("componentCode", obj.getComponentCode()); + compDetails.put("iotProcedureID", obj.getIOTProcedureID()); + compDetails.put("componentUnit", obj.getComponentUnit()); + + compOption = new HashMap<>(); + compOptionList = new ArrayList<>(); + + compOption.put("name", obj.getResultValue()); + compOptionList.add(compOption); + + compDetails.put("compOpt", compOptionList); + + compList.add(compDetails); + } else { + compOption = new HashMap<>(); + compOption.put("name", obj.getResultValue()); + compOptionList.add(compOption); + } + + } + } + } + + return returnOBJ; + } + + public ArrayList getLabResultDataForBen(Long benRegID, Long visitCode) throws Exception { + ArrayList procedureResults = new ArrayList<>(); + procedureResults = labResultEntryRepo.findByBeneficiaryRegIDAndVisitCodeOrderByProcedureIDAsc(benRegID, + visitCode); + procedureResults = LabResultEntry.getLabResultEntry(procedureResults); + return procedureResults; + } - private ArrayList getPrescribedLabTestInJsonFormatRadiology( - ArrayList orderedLabTestList) { - ArrayList returnOBJ = new ArrayList<>(); - Map procedureCompDetails; + private ArrayList getPrescribedLabTestInJsonFormatRadiology( + ArrayList orderedLabTestList) { + ArrayList returnOBJ = new ArrayList<>(); + Map procedureCompDetails; - Map compDetails; + Map compDetails; - if (orderedLabTestList != null && orderedLabTestList.size() > 0) { - for (V_benLabTestOrderedDetails obj : orderedLabTestList) { - procedureCompDetails = new HashMap<>(); - compDetails = new HashMap<>(); + if (orderedLabTestList != null && orderedLabTestList.size() > 0) { + for (V_benLabTestOrderedDetails obj : orderedLabTestList) { + procedureCompDetails = new HashMap<>(); + compDetails = new HashMap<>(); - procedureCompDetails.put("procedureID", obj.getProcedureID()); - procedureCompDetails.put("procedureName", obj.getProcedureName()); - procedureCompDetails.put("procedureDesc", obj.getProcedureDesc()); - procedureCompDetails.put("procedureType", "Radiology"); - procedureCompDetails.put("prescriptionID", obj.getPrescriptionID()); + procedureCompDetails.put("procedureID", obj.getProcedureID()); + procedureCompDetails.put("procedureName", obj.getProcedureName()); + procedureCompDetails.put("procedureDesc", obj.getProcedureDesc()); + procedureCompDetails.put("procedureType", "Radiology"); + procedureCompDetails.put("prescriptionID", obj.getPrescriptionID()); + + compDetails.put("testComponentID", obj.getTestComponentID()); + compDetails.put("testComponentName", obj.getTestComponentName()); + compDetails.put("testComponentDesc", obj.getTestComponentDesc()); + compDetails.put("inputType", "File"); - compDetails.put("testComponentID", obj.getTestComponentID()); - compDetails.put("testComponentName", obj.getTestComponentName()); - compDetails.put("testComponentDesc", obj.getTestComponentDesc()); - compDetails.put("inputType", "File"); + procedureCompDetails.put("compDetails", compDetails); - procedureCompDetails.put("compDetails", compDetails); + returnOBJ.add(procedureCompDetails); - returnOBJ.add(procedureCompDetails); + } + } - } - } + return returnOBJ; + } - return returnOBJ; - } - - /* + /* * @Transactional(rollbackFor = Exception.class) public Integer * saveLabTestResult(JsonObject requestOBJ) throws Exception { * @@ -330,193 +331,201 @@ private ArrayList getPrescribedLabTestInJsonFormatRadiology( * labResultsListNew.size() == labResultEntryRes.size()){ labResultSaveFlag = 1; * } }else{ labResultSaveFlag = 1; } }else{ labResultSaveFlag = 1; } return * labResultSaveFlag; } - */ - - @Transactional(rollbackFor = Exception.class) - public Integer saveLabTestResult(JsonObject requestOBJ) throws Exception { - - Integer labResultSaveFlag = null; - if (requestOBJ != null && requestOBJ.has("labTestResults") && null != requestOBJ.get("labTestResults") - && !requestOBJ.get("labTestResults").isJsonNull()) { - - WrapperLabResultEntry wrapperLabResults = InputMapper.gson().fromJson(requestOBJ, - WrapperLabResultEntry.class); - - labResultSaveFlag = saveLabTestResult(wrapperLabResults); - - if (labResultSaveFlag == 1) { - int i = updateBenFlowStatusFlagAfterLabResultEntry(wrapperLabResults.getLabCompleted(), - wrapperLabResults.getBenFlowID(), wrapperLabResults.getBeneficiaryRegID(), - wrapperLabResults.getVisitID(), wrapperLabResults.getNurseFlag(), - wrapperLabResults.getDoctorFlag(), wrapperLabResults.getSpecialist_flag()); - } - - } else { - labResultSaveFlag = 1; - } - - return labResultSaveFlag; - } - - private int updateBenFlowStatusFlagAfterLabResultEntry(Boolean isLabDone, Long benFlowID, Long benRegID, - Long benVisitID, Short nurseFlag, Short doctorFlag, Short specialistFlag) { - int returnOBJ = 0; - short labFlag = (short) 0; - - if (specialistFlag != null && specialistFlag == 2) { - if (isLabDone == true) { - specialistFlag = (short) 3; - } else { - labFlag = (short) 1; - } - - returnOBJ = commonBenStatusFlowServiceImpl.updateFlowAfterLabResultEntryForTCSpecialist(benFlowID, benRegID, - specialistFlag); - } else { - if (isLabDone == true) { - if (nurseFlag == 2) { - nurseFlag = 3; - doctorFlag = 1; - } else { - if (doctorFlag == 2) { - doctorFlag = 3; - } + */ + @Transactional(rollbackFor = Exception.class) + public Integer saveLabTestResult(JsonObject requestOBJ) throws Exception { + + Integer labResultSaveFlag = null; + if (requestOBJ != null && requestOBJ.has("labTestResults") && null != requestOBJ.get("labTestResults") + && !requestOBJ.get("labTestResults").isJsonNull()) { + + WrapperLabResultEntry wrapperLabResults = InputMapper.gson().fromJson(requestOBJ, + WrapperLabResultEntry.class); + + labResultSaveFlag = saveLabTestResult(wrapperLabResults); + + if (labResultSaveFlag == 1) { + int i = updateBenFlowStatusFlagAfterLabResultEntry(wrapperLabResults.getLabCompleted(), + wrapperLabResults.getBenFlowID(), wrapperLabResults.getBeneficiaryRegID(), + wrapperLabResults.getVisitID(), wrapperLabResults.getNurseFlag(), + wrapperLabResults.getDoctorFlag(), wrapperLabResults.getSpecialist_flag()); + } + + } else { + labResultSaveFlag = 1; + } + + return labResultSaveFlag; + } + + private int updateBenFlowStatusFlagAfterLabResultEntry(Boolean isLabDone, Long benFlowID, Long benRegID, + Long benVisitID, Short nurseFlag, Short doctorFlag, Short specialistFlag) { + int returnOBJ = 0; + short labFlag = (short) 0; + + if (specialistFlag != null && specialistFlag == 2) { + if (isLabDone == true) { + specialistFlag = (short) 3; + } else { + labFlag = (short) 1; + } + + returnOBJ = commonBenStatusFlowServiceImpl.updateFlowAfterLabResultEntryForTCSpecialist(benFlowID, benRegID, + specialistFlag); + } else { + if (isLabDone == true) { + if (nurseFlag == 2) { + nurseFlag = 3; + doctorFlag = 1; + } else { + if (doctorFlag == 2) { + doctorFlag = 3; + } + } + + labFlag = (short) 1; + } else { + labFlag = (short) 1; + } + returnOBJ = commonBenStatusFlowServiceImpl.updateFlowAfterLabResultEntry(benFlowID, benRegID, benVisitID, + nurseFlag, doctorFlag, labFlag); + } + + return returnOBJ; + } + + public Integer saveLabTestResult(WrapperLabResultEntry wrapperLabResults) { + Integer labResultSaveFlag = null; + Integer radiologyResultSaveFlag = null; + + List labResultsList = wrapperLabResults.getLabTestResults(); + + if ((null != labResultsList && labResultsList.size() > 0) + || (null != wrapperLabResults.getRadiologyTestResults() + && wrapperLabResults.getRadiologyTestResults().size() > 0)) { + List labResultsListNew = new ArrayList(); + for (LabResultEntry labResult : labResultsList) { + List> compResult = labResult.getCompList(); + if (null != compResult && compResult.size() > 0) { + for (Map comp : compResult) { + LabResultEntry labCompResult = new LabResultEntry(); + labCompResult.setPrescriptionID(labResult.getPrescriptionID()); + labCompResult.setProcedureID(labResult.getProcedureID()); + labCompResult.setStripsNotAvailable(labResult.getStripsNotAvailable()); + + if (null != comp.get("testComponentID") + && !String.valueOf(comp.get("testComponentID")).isEmpty() + && ((null != comp.get("testResultValue") + && !comp.get("testResultValue").toString().isEmpty()) + || (null != comp.get("stripsNotAvailable") && comp.get("stripsNotAvailable") + .toString().equalsIgnoreCase("true")))) { + labCompResult.setTestComponentID( + (int) Double.parseDouble(comp.get("testComponentID").toString())); + + if (comp.containsKey("testResultValue") && comp.get("testResultValue") != null + && !String.valueOf(comp.get("testResultValue")).isEmpty()) { + labCompResult.setTestResultValue(comp.get("testResultValue").toString()); + } + + if (comp.containsKey("testResultUnit") && comp.get("testResultUnit") != null + && !String.valueOf(comp.get("testResultUnit")).isEmpty()) { + labCompResult.setTestResultUnit(String.valueOf(comp.get("testResultUnit"))); + } + + if (comp.containsKey("remarks") && comp.get("remarks") != null + && !String.valueOf(comp.get("remarks")).isEmpty()) { + labCompResult.setRemarks(String.valueOf(comp.get("remarks"))); + } + + if (comp.containsKey("stripsNotAvailable") && comp.get("stripsNotAvailable") != null + && comp.get("stripsNotAvailable").toString().equalsIgnoreCase("true")) { + labCompResult.setStripsNotAvailable( + Boolean.valueOf(String.valueOf(comp.get("stripsNotAvailable")))); + } + + if (comp.containsKey("ecgAbnormalities") && comp.get("ecgAbnormalities") != null) { + List ecgAbnormalitiesList = (List) comp.get("ecgAbnormalities"); + // String[] ecgAbnormalities = (String[]) comp.get("ecgAbnormalities"); + + if (ecgAbnormalitiesList != null && ecgAbnormalitiesList.size() > 0) { + StringBuilder sb = new StringBuilder(); + for (String abnormility : ecgAbnormalitiesList) { + sb.append(abnormility).append("||"); + + } + if (sb.length() > 2) { + labCompResult.setEcgAbnormalitiesDB(sb.substring(0, sb.length() - 2)); + } + + } + } + + labCompResult.setBeneficiaryRegID(wrapperLabResults.getBeneficiaryRegID()); + labCompResult.setBenVisitID(wrapperLabResults.getVisitID()); + labCompResult.setVisitCode(wrapperLabResults.getVisitCode()); + labCompResult.setProviderServiceMapID(wrapperLabResults.getProviderServiceMapID()); + labCompResult.setCreatedBy(wrapperLabResults.getCreatedBy()); + + labCompResult.setVanID(wrapperLabResults.getVanID()); + labCompResult.setParkingPlaceID(wrapperLabResults.getParkingPlaceID()); + + labResultsListNew.add(labCompResult); + } + + } + } + } + for (LabResultEntry labResultEntry : wrapperLabResults.getRadiologyTestResults()) { + labResultEntry.setBeneficiaryRegID(wrapperLabResults.getBeneficiaryRegID()); + labResultEntry.setBenVisitID(wrapperLabResults.getVisitID()); + labResultEntry.setVisitCode(wrapperLabResults.getVisitCode()); + labResultEntry.setProviderServiceMapID(wrapperLabResults.getProviderServiceMapID()); + labResultEntry.setCreatedBy(wrapperLabResults.getCreatedBy()); + + labResultEntry.setVanID(wrapperLabResults.getVanID()); + labResultEntry.setParkingPlaceID(wrapperLabResults.getParkingPlaceID()); + + // add file/doc id + String[] docIdArr = labResultEntry.getFileIDs(); + StringBuilder sb = new StringBuilder(); + if (docIdArr != null && docIdArr.length > 0) { + for (String i : docIdArr) { + sb.append(i + ","); + } + } + labResultEntry.setTestReportFilePath(sb.toString()); + + labResultsListNew.add(labResultEntry); + + } + if (null != labResultsListNew && labResultsListNew.size() > 0) { + List labResultEntryRes = (List) labResultEntryRepo.saveAll(labResultsListNew); + + if (labResultEntryRes != null && labResultsListNew.size() == labResultEntryRes.size()) { + for (LabResultEntry result : labResultEntryRes) { + if (result.getID() != null) { + labResultEntryRepo.updateVanSerialNo(result.getID()); + } + } + labResultSaveFlag = 1; + } + } else { + labResultSaveFlag = 1; + } } + return labResultSaveFlag; + } - labFlag = (short) 1; - } else { - labFlag = (short) 1; - } - returnOBJ = commonBenStatusFlowServiceImpl.updateFlowAfterLabResultEntry(benFlowID, benRegID, benVisitID, - nurseFlag, doctorFlag, labFlag); - } - - return returnOBJ; - } - - public Integer saveLabTestResult(WrapperLabResultEntry wrapperLabResults) { - Integer labResultSaveFlag = null; - Integer radiologyResultSaveFlag = null; - - List labResultsList = wrapperLabResults.getLabTestResults(); - - if ((null != labResultsList && labResultsList.size() > 0) - || (null != wrapperLabResults.getRadiologyTestResults() - && wrapperLabResults.getRadiologyTestResults().size() > 0)) { - List labResultsListNew = new ArrayList(); - for (LabResultEntry labResult : labResultsList) { - List> compResult = labResult.getCompList(); - if (null != compResult && compResult.size() > 0) { - for (Map comp : compResult) { - LabResultEntry labCompResult = new LabResultEntry(); - labCompResult.setPrescriptionID(labResult.getPrescriptionID()); - labCompResult.setProcedureID(labResult.getProcedureID()); - labCompResult.setStripsNotAvailable(labResult.getStripsNotAvailable()); - - if (null != comp.get("testComponentID") - && !String.valueOf(comp.get("testComponentID")).isEmpty() - && ((null != comp.get("testResultValue") - && !comp.get("testResultValue").toString().isEmpty()) - || (null != comp.get("stripsNotAvailable") && comp.get("stripsNotAvailable") - .toString().equalsIgnoreCase("true")))) { - labCompResult.setTestComponentID( - (int) Double.parseDouble(comp.get("testComponentID").toString())); - - if (comp.containsKey("testResultValue") && comp.get("testResultValue") != null - && !String.valueOf(comp.get("testResultValue")).isEmpty()) - labCompResult.setTestResultValue(comp.get("testResultValue").toString()); - - if (comp.containsKey("testResultUnit") && comp.get("testResultUnit") != null - && !String.valueOf(comp.get("testResultUnit")).isEmpty()) - labCompResult.setTestResultUnit(String.valueOf(comp.get("testResultUnit"))); - - if (comp.containsKey("remarks") && comp.get("remarks") != null - && !String.valueOf(comp.get("remarks")).isEmpty()) - labCompResult.setRemarks(String.valueOf(comp.get("remarks"))); - - if (comp.containsKey("stripsNotAvailable") && comp.get("stripsNotAvailable") != null - && comp.get("stripsNotAvailable").toString().equalsIgnoreCase("true")) - labCompResult.setStripsNotAvailable( - Boolean.valueOf(String.valueOf(comp.get("stripsNotAvailable")))); - - if (comp.containsKey("ecgAbnormalities") && comp.get("ecgAbnormalities") != null) { - List ecgAbnormalitiesList = (List) comp.get("ecgAbnormalities"); - // String[] ecgAbnormalities = (String[]) comp.get("ecgAbnormalities"); - - if (ecgAbnormalitiesList != null && ecgAbnormalitiesList.size() > 0) { - StringBuilder sb = new StringBuilder(); - for (String abnormility : ecgAbnormalitiesList) { - sb.append(abnormility).append("||"); - - } - if (sb.length() > 2) - labCompResult.setEcgAbnormalitiesDB(sb.substring(0, sb.length() - 2)); - - } - } - - labCompResult.setBeneficiaryRegID(wrapperLabResults.getBeneficiaryRegID()); - labCompResult.setBenVisitID(wrapperLabResults.getVisitID()); - labCompResult.setVisitCode(wrapperLabResults.getVisitCode()); - labCompResult.setProviderServiceMapID(wrapperLabResults.getProviderServiceMapID()); - labCompResult.setCreatedBy(wrapperLabResults.getCreatedBy()); - - labCompResult.setVanID(wrapperLabResults.getVanID()); - labCompResult.setParkingPlaceID(wrapperLabResults.getParkingPlaceID()); - - labResultsListNew.add(labCompResult); - } - - } - } - } - for (LabResultEntry labResultEntry : wrapperLabResults.getRadiologyTestResults()) { - labResultEntry.setBeneficiaryRegID(wrapperLabResults.getBeneficiaryRegID()); - labResultEntry.setBenVisitID(wrapperLabResults.getVisitID()); - labResultEntry.setVisitCode(wrapperLabResults.getVisitCode()); - labResultEntry.setProviderServiceMapID(wrapperLabResults.getProviderServiceMapID()); - labResultEntry.setCreatedBy(wrapperLabResults.getCreatedBy()); - - labResultEntry.setVanID(wrapperLabResults.getVanID()); - labResultEntry.setParkingPlaceID(wrapperLabResults.getParkingPlaceID()); - - // add file/doc id - String[] docIdArr = labResultEntry.getFileIDs(); - StringBuilder sb = new StringBuilder(); - if (docIdArr != null && docIdArr.length > 0) { - for (String i : docIdArr) { - sb.append(i + ","); - } - } - labResultEntry.setTestReportFilePath(sb.toString()); + - labResultsListNew.add(labResultEntry); + public String getLast_3_ArchivedTestVisitList(Long benRegID, Long visitCode) { + ArrayList visitCodeList = labResultEntryRepo.getLast_3_visitForLabTestDone(benRegID, visitCode); - } - if (null != labResultsListNew && labResultsListNew.size() > 0) { - List labResultEntryRes = (List) labResultEntryRepo - .saveAll(labResultsListNew); - if (null != labResultEntryRes && labResultsListNew.size() == labResultEntryRes.size()) { - labResultSaveFlag = 1; - } - } else { - labResultSaveFlag = 1; - } - } else { - labResultSaveFlag = 1; - } - - return labResultSaveFlag; - } - - public String getLast_3_ArchivedTestVisitList(Long benRegID, Long visitCode) { - ArrayList visitCodeList = labResultEntryRepo.getLast_3_visitForLabTestDone(benRegID, visitCode); - - return new Gson().toJson(LabResultEntry.getVisitCodeAndDate(visitCodeList)); - } - - public String getLabResultForVisitcode(Long benRegID, Long visitCode) throws Exception { - ArrayList labResultList = getLabResultDataForBen(benRegID, visitCode); - return new Gson().toJson(labResultList); - } + return new Gson().toJson(LabResultEntry.getVisitCodeAndDate(visitCodeList)); + } + + public String getLabResultForVisitcode(Long benRegID, Long visitCode) throws Exception { + ArrayList labResultList = getLabResultDataForBen(benRegID, visitCode); + return new Gson().toJson(labResultList); + } } From 0c5481d1d7a7026755a1bee1302c7728adeb127a Mon Sep 17 00:00:00 2001 From: SnehaRH Date: Tue, 14 Oct 2025 19:16:23 +0530 Subject: [PATCH 36/47] fix: aam-1896 prescribed quantity was not coming in the casesheet --- .../transaction/CommonNurseServiceImpl.java | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/iemr/mmu/service/common/transaction/CommonNurseServiceImpl.java b/src/main/java/com/iemr/mmu/service/common/transaction/CommonNurseServiceImpl.java index b2662874..4c735a14 100644 --- a/src/main/java/com/iemr/mmu/service/common/transaction/CommonNurseServiceImpl.java +++ b/src/main/java/com/iemr/mmu/service/common/transaction/CommonNurseServiceImpl.java @@ -2817,7 +2817,8 @@ else if (durationUnit.equalsIgnoreCase("Month(s)")) private double getQtyForOneDay(String form, String dose, String frequency) { double qtyInOneDay = 0; if (form != null && dose != null && frequency != null) { - if (frequency.equalsIgnoreCase("Once Daily(OD)")) { + if (frequency.equalsIgnoreCase("Once Daily(OD)") || frequency.equalsIgnoreCase("Once Daily(OD) Before Food")|| + frequency.equalsIgnoreCase("Once Daily(OD) After Food")|| frequency.equalsIgnoreCase("Once Daily(OD) At Bedtime")) { if (form.equalsIgnoreCase("Tablet")) { if (dose.equalsIgnoreCase("Half Tab")) { qtyInOneDay = .5; @@ -2841,7 +2842,8 @@ private double getQtyForOneDay(String form, String dose, String frequency) { } } } else { - if (frequency.equalsIgnoreCase("Twice Daily(BD)")) { + if (frequency.equalsIgnoreCase("Twice Daily(BD)") || frequency.equalsIgnoreCase("Twice Daily(BD) Before Food")|| + frequency.equalsIgnoreCase("Twice Daily(BD) After Food")) { if (form.equalsIgnoreCase("Tablet")) { if (dose.equalsIgnoreCase("Half Tab")) { qtyInOneDay = 1; @@ -2865,7 +2867,8 @@ private double getQtyForOneDay(String form, String dose, String frequency) { } } } else { - if (frequency.equalsIgnoreCase("Thrice Daily (TID)")) { + if (frequency.equalsIgnoreCase("Thrice Daily (TID)") || frequency.equalsIgnoreCase("Thrice Daily (TID) After Food")|| + frequency.equalsIgnoreCase("Thrice Daily (TID) Before Food")) { if (form.equalsIgnoreCase("Tablet")) { if (dose.equalsIgnoreCase("Half Tab")) { qtyInOneDay = 1.5; @@ -2889,7 +2892,8 @@ private double getQtyForOneDay(String form, String dose, String frequency) { } } } else { - if (frequency.equalsIgnoreCase("Four Times in a Day (QID)")) { + if (frequency.equalsIgnoreCase("Four Times in a Day (QID)") || frequency.equalsIgnoreCase("Four Times in a Day AF")|| + frequency.equalsIgnoreCase("Four Times in a Day BF")) { if (form.equalsIgnoreCase("Tablet")) { if (dose.equalsIgnoreCase("Half Tab")) { qtyInOneDay = 2; @@ -2913,7 +2917,8 @@ private double getQtyForOneDay(String form, String dose, String frequency) { } } } else { - if (frequency.equalsIgnoreCase("Single Dose") || frequency.equalsIgnoreCase("Stat Dose")) { + if (frequency.equalsIgnoreCase("Single Dose") || frequency.equalsIgnoreCase("Stat Dose")|| + frequency.equalsIgnoreCase("Single Dose Before Food") || frequency.equalsIgnoreCase("Single Dose After Food")) { if (form.equalsIgnoreCase("Tablet")) { if (dose.equalsIgnoreCase("Half Tab")) { qtyInOneDay = .5; @@ -2937,7 +2942,8 @@ private double getQtyForOneDay(String form, String dose, String frequency) { } } } else { - if (frequency.equalsIgnoreCase("Once in a Week")) { + if (frequency.equalsIgnoreCase("Once in a Week") || frequency.equalsIgnoreCase("Once in a Week After Food") + || frequency.equalsIgnoreCase("Once in a Week Before Food")) { if (form.equalsIgnoreCase("Tablet")) { if (dose.equalsIgnoreCase("Half Tab")) { qtyInOneDay = .07142; From 5adeb8be0f62eef0f3b3568e663dbf30700e9e72 Mon Sep 17 00:00:00 2001 From: Vishwanath Balkur <118195001+vishwab1@users.noreply.github.com> Date: Fri, 17 Oct 2025 15:51:48 +0530 Subject: [PATCH 37/47] fix:add the response for save doctor data (#132) --- .../mmu/controller/anc/ANCController.java | 47 +++++++++++++++++- .../controller/covid19/CovidController.java | 40 +++++++++++++++- .../generalOPD/GeneralOPDController.java | 43 ++++++++++++++++- .../controller/ncdCare/NCDCareController.java | 40 +++++++++++++++- .../ncdscreening/NCDController.java | 48 +++++++++++++++++-- .../pnc/PostnatalCareController.java | 42 +++++++++++++++- .../quickconsult/QuickConsultController.java | 45 ++++++++++++++++- .../iemr/mmu/service/anc/ANCServiceImpl.java | 23 ++++++++- .../transaction/CommonNurseServiceImpl.java | 15 +++++- .../service/covid19/Covid19ServiceImpl.java | 22 ++++++++- .../generalOPD/GeneralOPDServiceImpl.java | 23 ++++++++- .../service/ncdCare/NCDCareServiceImpl.java | 24 +++++++++- .../NCDSCreeningDoctorServiceImpl.java | 12 ++++- .../ncdscreening/NCDScreeningServiceImpl.java | 29 +++++++++-- .../iemr/mmu/service/pnc/PNCServiceImpl.java | 22 ++++++++- .../QuickConsultationServiceImpl.java | 29 ++++++++++- 16 files changed, 468 insertions(+), 36 deletions(-) diff --git a/src/main/java/com/iemr/mmu/controller/anc/ANCController.java b/src/main/java/com/iemr/mmu/controller/anc/ANCController.java index 178f080b..c60b9bf4 100644 --- a/src/main/java/com/iemr/mmu/controller/anc/ANCController.java +++ b/src/main/java/com/iemr/mmu/controller/anc/ANCController.java @@ -21,6 +21,9 @@ */ package com.iemr.mmu.controller.anc; +import java.util.ArrayList; +import java.util.HashMap; + import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -34,6 +37,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import com.google.gson.Gson; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; @@ -42,6 +46,13 @@ import io.swagger.v3.oas.annotations.Operation; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import com.google.gson.Gson; +import com.google.gson.JsonArray; + /** * @Objective Saving ANC data for Nurse and Doctor. */ @@ -99,7 +110,23 @@ public String saveBenANCDoctorData(@RequestBody String requestObj, if (jsnOBJ != null) { Long r = ancService.saveANCDoctorData(jsnOBJ, authorization); if (r != null && r > 0) { - response.setResponse("Data saved successfully"); + // Extract drug IDs from JsonObject + List prescribedDrugIDs = new ArrayList<>(); + if (jsnOBJ.has("savedDrugIDs") && !jsnOBJ.get("savedDrugIDs").isJsonNull()) { + JsonArray drugIDsArray = jsnOBJ.getAsJsonArray("savedDrugIDs"); + for (int j = 0; j < drugIDsArray.size(); j++) { + prescribedDrugIDs.add(drugIDsArray.get(j).getAsLong()); + } + } + + // Create response with message and IDs + Map responseData = new HashMap<>(); + responseData.put("message", "Data saved successfully"); + responseData.put("prescribedDrugIDs", prescribedDrugIDs); + + Gson gson = new Gson(); + String responseJson = gson.toJson(responseData); + response.setResponse(responseJson); } else { response.setError(5000, "Unable to save data"); } @@ -454,7 +481,23 @@ public String updateANCDoctorData(@RequestBody String requestObj, try { Long result = ancService.updateANCDoctorData(jsnOBJ, authorization); if (null != result && result > 0) { - response.setResponse("Data updated successfully"); + // Extract drug IDs from JsonObject + List prescribedDrugIDs = new ArrayList<>(); + if (jsnOBJ.has("savedDrugIDs") && !jsnOBJ.get("savedDrugIDs").isJsonNull()) { + JsonArray drugIDsArray = jsnOBJ.getAsJsonArray("savedDrugIDs"); + for (int j = 0; j < drugIDsArray.size(); j++) { + prescribedDrugIDs.add(drugIDsArray.get(j).getAsLong()); + } + } + + // Create response with message and IDs + Map responseData = new HashMap<>(); + responseData.put("message", "Data updated successfully"); + responseData.put("prescribedDrugIDs", prescribedDrugIDs); + + Gson gson = new Gson(); + String responseJson = gson.toJson(responseData); + response.setResponse(responseJson); } else { response.setError(500, "Unable to modify data"); } diff --git a/src/main/java/com/iemr/mmu/controller/covid19/CovidController.java b/src/main/java/com/iemr/mmu/controller/covid19/CovidController.java index 959c9cc7..17a03d85 100644 --- a/src/main/java/com/iemr/mmu/controller/covid19/CovidController.java +++ b/src/main/java/com/iemr/mmu/controller/covid19/CovidController.java @@ -21,7 +21,9 @@ */ package com.iemr.mmu.controller.covid19; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import org.json.JSONObject; @@ -36,6 +38,8 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import com.google.gson.Gson; +import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; @@ -109,7 +113,23 @@ public String saveBenCovidDoctorData(@RequestBody String requestObj, if (jsnOBJ != null) { Long ncdCareRes = covid19Service.saveDoctorData(jsnOBJ, authorization); if (null != ncdCareRes && ncdCareRes > 0) { - response.setResponse("Data saved successfully"); + // Extract drug IDs from JsonObject + List prescribedDrugIDs = new ArrayList<>(); + if (jsnOBJ.has("savedDrugIDs") && !jsnOBJ.get("savedDrugIDs").isJsonNull()) { + JsonArray drugIDsArray = jsnOBJ.getAsJsonArray("savedDrugIDs"); + for (int j = 0; j < drugIDsArray.size(); j++) { + prescribedDrugIDs.add(drugIDsArray.get(j).getAsLong()); + } + } + + // Create response with message and IDs + Map responseData = new HashMap<>(); + responseData.put("message", "Data saved successfully"); + responseData.put("prescribedDrugIDs", prescribedDrugIDs); + + Gson gson = new Gson(); + String responseJson = gson.toJson(responseData); + response.setResponse(responseJson); } else { response.setResponse("Unable to save data"); } @@ -313,7 +333,23 @@ public String updateCovid19DoctorData(@RequestBody String requestObj, try { Long result = covid19ServiceImpl.updateCovid19DoctorData(jsnOBJ, authorization); if (null != result && result > 0) { - response.setResponse("Data updated successfully"); + // Extract drug IDs from JsonObject + List prescribedDrugIDs = new ArrayList<>(); + if (jsnOBJ.has("savedDrugIDs") && !jsnOBJ.get("savedDrugIDs").isJsonNull()) { + JsonArray drugIDsArray = jsnOBJ.getAsJsonArray("savedDrugIDs"); + for (int j = 0; j < drugIDsArray.size(); j++) { + prescribedDrugIDs.add(drugIDsArray.get(j).getAsLong()); + } + } + + // Create response with message and IDs + Map responseData = new HashMap<>(); + responseData.put("message", "Data updated successfully"); + responseData.put("prescribedDrugIDs", prescribedDrugIDs); + + Gson gson = new Gson(); + String responseJson = gson.toJson(responseData); + response.setResponse(responseJson); } else { response.setError(500, "Unable to modify data"); } diff --git a/src/main/java/com/iemr/mmu/controller/generalOPD/GeneralOPDController.java b/src/main/java/com/iemr/mmu/controller/generalOPD/GeneralOPDController.java index b7fa65a0..c1e0eccc 100644 --- a/src/main/java/com/iemr/mmu/controller/generalOPD/GeneralOPDController.java +++ b/src/main/java/com/iemr/mmu/controller/generalOPD/GeneralOPDController.java @@ -21,6 +21,11 @@ */ package com.iemr.mmu.controller.generalOPD; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -33,6 +38,8 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import com.google.gson.Gson; +import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; @@ -104,7 +111,23 @@ public String saveBenGenOPDDoctorData(@RequestBody String requestObj, if (jsonRequest != null) { Long genOPDRes = generalOPDServiceImpl.saveDoctorData(jsonRequest, authorization); if (null != genOPDRes && genOPDRes > 0) { - response.setResponse("Data saved successfully"); + // Extract drug IDs from JsonObject + List prescribedDrugIDs = new ArrayList<>(); + if (jsonRequest.has("savedDrugIDs") && !jsonRequest.get("savedDrugIDs").isJsonNull()) { + JsonArray drugIDsArray = jsonRequest.getAsJsonArray("savedDrugIDs"); + for (int j = 0; j < drugIDsArray.size(); j++) { + prescribedDrugIDs.add(drugIDsArray.get(j).getAsLong()); + } + } + + // Create response with message and IDs + Map responseData = new HashMap<>(); + responseData.put("message", "Data saved successfully"); + responseData.put("prescribedDrugIDs", prescribedDrugIDs); + + Gson gson = new Gson(); + String responseJson = gson.toJson(responseData); + response.setResponse(responseJson); } else { response.setResponse("Unable to save data"); } @@ -401,7 +424,23 @@ public String updateGeneralOPDDoctorData(@RequestBody String requestObj, try { Long result = generalOPDServiceImpl.updateGeneralOPDDoctorData(jsonRequest, authorization); if (null != result && result > 0) { - response.setResponse("Data updated successfully"); + // Extract drug IDs from JsonObject + List prescribedDrugIDs = new ArrayList<>(); + if (jsonRequest.has("savedDrugIDs") && !jsonRequest.get("savedDrugIDs").isJsonNull()) { + JsonArray drugIDsArray = jsonRequest.getAsJsonArray("savedDrugIDs"); + for (int j = 0; j < drugIDsArray.size(); j++) { + prescribedDrugIDs.add(drugIDsArray.get(j).getAsLong()); + } + } + + // Create response with message and IDs + Map responseData = new HashMap<>(); + responseData.put("message", "Data updated successfully"); + responseData.put("prescribedDrugIDs", prescribedDrugIDs); + + Gson gson = new Gson(); + String responseJson = gson.toJson(responseData); + response.setResponse(responseJson); } else { response.setError(500, "Unable to modify data"); } diff --git a/src/main/java/com/iemr/mmu/controller/ncdCare/NCDCareController.java b/src/main/java/com/iemr/mmu/controller/ncdCare/NCDCareController.java index 03c4cecc..fa853ad2 100644 --- a/src/main/java/com/iemr/mmu/controller/ncdCare/NCDCareController.java +++ b/src/main/java/com/iemr/mmu/controller/ncdCare/NCDCareController.java @@ -21,7 +21,9 @@ */ package com.iemr.mmu.controller.ncdCare; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; import org.json.JSONObject; @@ -36,6 +38,8 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import com.google.gson.Gson; +import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; @@ -108,7 +112,23 @@ public String saveBenNCDCareDoctorData(@RequestBody String requestObj, if (jsnOBJ != null) { Long ncdCareRes = ncdCareServiceImpl.saveDoctorData(jsnOBJ, authorization); if (null != ncdCareRes && ncdCareRes > 0) { - response.setResponse("Data saved successfully"); + // Extract drug IDs from JsonObject + List prescribedDrugIDs = new ArrayList<>(); + if (jsnOBJ.has("savedDrugIDs") && !jsnOBJ.get("savedDrugIDs").isJsonNull()) { + JsonArray drugIDsArray = jsnOBJ.getAsJsonArray("savedDrugIDs"); + for (int j = 0; j < drugIDsArray.size(); j++) { + prescribedDrugIDs.add(drugIDsArray.get(j).getAsLong()); + } + } + + // Create response with message and IDs + Map responseData = new HashMap<>(); + responseData.put("message", "Data saved successfully"); + responseData.put("prescribedDrugIDs", prescribedDrugIDs); + + Gson gson = new Gson(); + String responseJson = gson.toJson(responseData); + response.setResponse(responseJson); } else { response.setResponse("Unable to save data"); } @@ -316,7 +336,23 @@ public String updateNCDCareDoctorData(@RequestBody String requestObj, try { Long result = ncdCareServiceImpl.updateNCDCareDoctorData(jsnOBJ, authorization); if (null != result && result > 0) { - response.setResponse("Data updated successfully"); + // Extract drug IDs from JsonObject + List prescribedDrugIDs = new ArrayList<>(); + if (jsnOBJ.has("savedDrugIDs") && !jsnOBJ.get("savedDrugIDs").isJsonNull()) { + JsonArray drugIDsArray = jsnOBJ.getAsJsonArray("savedDrugIDs"); + for (int j = 0; j < drugIDsArray.size(); j++) { + prescribedDrugIDs.add(drugIDsArray.get(j).getAsLong()); + } + } + + // Create response with message and IDs + Map responseData = new HashMap<>(); + responseData.put("message", "Data updated successfully"); + responseData.put("prescribedDrugIDs", prescribedDrugIDs); + + Gson gson = new Gson(); + String responseJson = gson.toJson(responseData); + response.setResponse(responseJson); } else { response.setError(500, "Unable to modify data"); } diff --git a/src/main/java/com/iemr/mmu/controller/ncdscreening/NCDController.java b/src/main/java/com/iemr/mmu/controller/ncdscreening/NCDController.java index 39d3531b..5f6ebeab 100644 --- a/src/main/java/com/iemr/mmu/controller/ncdscreening/NCDController.java +++ b/src/main/java/com/iemr/mmu/controller/ncdscreening/NCDController.java @@ -21,6 +21,11 @@ */ package com.iemr.mmu.controller.ncdscreening; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -35,6 +40,8 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import com.google.gson.Gson; +import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; @@ -119,7 +126,23 @@ public String saveBenNCDScreeningDoctorData(@RequestBody String requestObj, if (jsnOBJ != null) { Long ncdCareRes = ncdScreeningServiceImpl.saveDoctorData(jsnOBJ, authorization); if (null != ncdCareRes && ncdCareRes > 0) { - response.setResponse("Data saved successfully"); + // Extract drug IDs from JsonObject + List prescribedDrugIDs = new ArrayList<>(); + if (jsnOBJ.has("savedDrugIDs") && !jsnOBJ.get("savedDrugIDs").isJsonNull()) { + JsonArray drugIDsArray = jsnOBJ.getAsJsonArray("savedDrugIDs"); + for (int j = 0; j < drugIDsArray.size(); j++) { + prescribedDrugIDs.add(drugIDsArray.get(j).getAsLong()); + } + } + + // Create response with message and IDs + Map responseData = new HashMap<>(); + responseData.put("message", "Data saved successfully"); + responseData.put("prescribedDrugIDs", prescribedDrugIDs); + + Gson gson = new Gson(); + String responseJson = gson.toJson(responseData); + response.setResponse(responseJson); } else { response.setResponse("Unable to save data"); } @@ -426,10 +449,27 @@ public String updateDoctorData(@RequestBody String requestObj) { try { JsonObject jsnOBJ = parseJsonRequest(requestObj); int i = ncdSCreeningDoctorService.updateDoctorData(jsnOBJ); - if (i > 0) - response.setResponse("Data updated successfully"); - else + if (i > 0) { + // Extract drug IDs from JsonObject + List prescribedDrugIDs = new ArrayList<>(); + if (jsnOBJ.has("savedDrugIDs") && !jsnOBJ.get("savedDrugIDs").isJsonNull()) { + JsonArray drugIDsArray = jsnOBJ.getAsJsonArray("savedDrugIDs"); + for (int j = 0; j < drugIDsArray.size(); j++) { + prescribedDrugIDs.add(drugIDsArray.get(j).getAsLong()); + } + } + + // Create response with message and IDs + Map responseData = new HashMap<>(); + responseData.put("message", "Data updated successfully"); + responseData.put("prescribedDrugIDs", prescribedDrugIDs); + + Gson gson = new Gson(); + String responseJson = gson.toJson(responseData); + response.setResponse(responseJson); + } else { response.setError(5000, "Error in data update"); + } } catch (Exception e) { response.setError(5000, "Unable to modify data"); logger.error("Error while updating doctor data :" + e); diff --git a/src/main/java/com/iemr/mmu/controller/pnc/PostnatalCareController.java b/src/main/java/com/iemr/mmu/controller/pnc/PostnatalCareController.java index 0e15e43a..1dfa95f1 100644 --- a/src/main/java/com/iemr/mmu/controller/pnc/PostnatalCareController.java +++ b/src/main/java/com/iemr/mmu/controller/pnc/PostnatalCareController.java @@ -21,6 +21,11 @@ */ package com.iemr.mmu.controller.pnc; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -33,6 +38,8 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import com.google.gson.Gson; +import com.google.gson.JsonArray; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; @@ -104,7 +111,23 @@ public String saveBenPNCDoctorData(@RequestBody String requestObj, if (jsnOBJ != null) { Long r = pncServiceImpl.savePNCDoctorData(jsnOBJ, authorization); if (r != null && r > 0) { - response.setResponse("Data saved successfully"); + // Extract drug IDs from JsonObject + List prescribedDrugIDs = new ArrayList<>(); + if (jsnOBJ.has("savedDrugIDs") && !jsnOBJ.get("savedDrugIDs").isJsonNull()) { + JsonArray drugIDsArray = jsnOBJ.getAsJsonArray("savedDrugIDs"); + for (int j = 0; j < drugIDsArray.size(); j++) { + prescribedDrugIDs.add(drugIDsArray.get(j).getAsLong()); + } + } + + // Create response with message and IDs + Map responseData = new HashMap<>(); + responseData.put("message", "Data saved successfully"); + responseData.put("prescribedDrugIDs", prescribedDrugIDs); + + Gson gson = new Gson(); + String responseJson = gson.toJson(responseData); + response.setResponse(responseJson); } else { response.setError(5000, "Unable to save data"); } @@ -427,7 +450,22 @@ public String updatePNCDoctorData(@RequestBody String requestObj, try { Long result = pncServiceImpl.updatePNCDoctorData(jsnOBJ, authorization); if (null != result && result > 0) { - response.setResponse("Data updated successfully"); + List prescribedDrugIDs = new ArrayList<>(); + if (jsnOBJ.has("savedDrugIDs") && !jsnOBJ.get("savedDrugIDs").isJsonNull()) { + JsonArray drugIDsArray = jsnOBJ.getAsJsonArray("savedDrugIDs"); + for (int j = 0; j < drugIDsArray.size(); j++) { + prescribedDrugIDs.add(drugIDsArray.get(j).getAsLong()); + } + } + + // Create response with message and IDs + Map responseData = new HashMap<>(); + responseData.put("message", "Data updated successfully"); + responseData.put("prescribedDrugIDs", prescribedDrugIDs); + + Gson gson = new Gson(); + String responseJson = gson.toJson(responseData); + response.setResponse(responseJson); } else { response.setError(500, "Unable to modify data"); } diff --git a/src/main/java/com/iemr/mmu/controller/quickconsult/QuickConsultController.java b/src/main/java/com/iemr/mmu/controller/quickconsult/QuickConsultController.java index 5b672df5..c7ef2307 100644 --- a/src/main/java/com/iemr/mmu/controller/quickconsult/QuickConsultController.java +++ b/src/main/java/com/iemr/mmu/controller/quickconsult/QuickConsultController.java @@ -33,6 +33,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import com.google.gson.Gson; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; @@ -44,6 +45,10 @@ import io.swagger.annotations.ApiParam; import io.swagger.v3.oas.annotations.Operation; +import java.util.*; +import com.google.gson.Gson; +import com.google.gson.JsonArray; + /** * @Objective Saving general OPD quick consult data for Nurse and Doctor both. */ @@ -124,7 +129,25 @@ public String saveQuickConsultationDetail( Integer i = quickConsultationServiceImpl.quickConsultDoctorDataInsert(quickConsultDoctorOBJ, authorization); if (i != null && i > 0) { - response.setResponse("Data saved successfully"); + // Check if drug IDs were saved and added to the JsonObject + List prescribedDrugIDs = new ArrayList<>(); + if (quickConsultDoctorOBJ.has("savedDrugIDs") + && !quickConsultDoctorOBJ.get("savedDrugIDs").isJsonNull()) { + JsonArray drugIDsArray = quickConsultDoctorOBJ.getAsJsonArray("savedDrugIDs"); + for (int j = 0; j < drugIDsArray.size(); j++) { + prescribedDrugIDs.add(drugIDsArray.get(j).getAsLong()); + } + } + + // Create response data with message and drug IDs + Map responseData = new HashMap<>(); + responseData.put("message", "Data saved successfully"); + responseData.put("prescribedDrugIDs", prescribedDrugIDs); + + // Convert to JSON string and set response + Gson gson = new Gson(); + String responseJson = gson.toJson(responseData); + response.setResponse(responseJson); } else { response.setError(5000, "Unable to save data"); } @@ -241,7 +264,25 @@ public String updateGeneralOPDQCDoctorData(@RequestBody String requestObj, Long result = quickConsultationServiceImpl.updateGeneralOPDQCDoctorData(quickConsultDoctorOBJ, authorization); if (null != result && result > 0) { - response.setResponse("Data updated successfully"); + // Check if drug IDs were saved and added to the JsonObject + List prescribedDrugIDs = new ArrayList<>(); + if (quickConsultDoctorOBJ.has("savedDrugIDs") + && !quickConsultDoctorOBJ.get("savedDrugIDs").isJsonNull()) { + JsonArray drugIDsArray = quickConsultDoctorOBJ.getAsJsonArray("savedDrugIDs"); + for (int j = 0; j < drugIDsArray.size(); j++) { + prescribedDrugIDs.add(drugIDsArray.get(j).getAsLong()); + } + } + + // Create response data with message and drug IDs + Map responseData = new HashMap<>(); + responseData.put("message", "Data updated successfully"); + responseData.put("prescribedDrugIDs", prescribedDrugIDs); + + // Convert to JSON string and set response + Gson gson = new Gson(); + String responseJson = gson.toJson(responseData); + response.setResponse(responseJson); } else { response.setError(500, "Unable to modify data"); } diff --git a/src/main/java/com/iemr/mmu/service/anc/ANCServiceImpl.java b/src/main/java/com/iemr/mmu/service/anc/ANCServiceImpl.java index d9538b62..c40b2189 100644 --- a/src/main/java/com/iemr/mmu/service/anc/ANCServiceImpl.java +++ b/src/main/java/com/iemr/mmu/service/anc/ANCServiceImpl.java @@ -382,7 +382,17 @@ public Long saveANCDoctorData(JsonObject requestOBJ, String Authorization) throw tmpObj.setVisitCode(commonUtilityClass.getVisitCode()); tmpObj.setProviderServiceMapID(commonUtilityClass.getProviderServiceMapID()); } - Integer r = commonNurseServiceImpl.saveBenPrescribedDrugsList(prescribedDrugDetailList); + Map drugSaveResult = commonNurseServiceImpl + .saveBenPrescribedDrugsList(prescribedDrugDetailList); + Integer r = (Integer) drugSaveResult.get("count"); + List prescribedDrugIDs = (List) drugSaveResult.get("prescribedDrugIDs"); + + // Store IDs in JsonObject + if (prescribedDrugIDs != null && !prescribedDrugIDs.isEmpty()) { + Gson gson = new Gson(); + requestOBJ.add("savedDrugIDs", gson.toJsonTree(prescribedDrugIDs)); + } + if (r > 0 && r != null) { prescriptionSuccessFlag = r; } @@ -1597,7 +1607,16 @@ public Long updateANCDoctorData(JsonObject requestOBJ, String Authorization) thr tmpObj.setVisitCode(commonUtilityClass.getVisitCode()); tmpObj.setProviderServiceMapID(commonUtilityClass.getProviderServiceMapID()); } - Integer r = commonNurseServiceImpl.saveBenPrescribedDrugsList(prescribedDrugDetailList); + Map drugSaveResult = commonNurseServiceImpl + .saveBenPrescribedDrugsList(prescribedDrugDetailList); + Integer r = (Integer) drugSaveResult.get("count"); + List prescribedDrugIDs = (List) drugSaveResult.get("prescribedDrugIDs"); + + // Store IDs in JsonObject + if (prescribedDrugIDs != null && !prescribedDrugIDs.isEmpty()) { + Gson gson = new Gson(); + requestOBJ.add("savedDrugIDs", gson.toJsonTree(prescribedDrugIDs)); + } if (r > 0 && r != null) { prescriptionSuccessFlag = r; } diff --git a/src/main/java/com/iemr/mmu/service/common/transaction/CommonNurseServiceImpl.java b/src/main/java/com/iemr/mmu/service/common/transaction/CommonNurseServiceImpl.java index 0fedb10d..947e6754 100644 --- a/src/main/java/com/iemr/mmu/service/common/transaction/CommonNurseServiceImpl.java +++ b/src/main/java/com/iemr/mmu/service/common/transaction/CommonNurseServiceImpl.java @@ -2766,7 +2766,9 @@ public Long saveBeneficiaryLabTestOrderDetails(JsonObject caseSheet, Long prescr return returnOBJ; } - public Integer saveBenPrescribedDrugsList(List prescribedDrugDetailList) { + public Map saveBenPrescribedDrugsList(List prescribedDrugDetailList) { + Map result = new HashMap<>(); + List prescribedDrugIDs = new ArrayList<>(); Integer r = 0; if (prescribedDrugDetailList.size() > 0) { @@ -2782,11 +2784,20 @@ public Integer saveBenPrescribedDrugsList(List prescribedD .saveAll(prescribedDrugDetailList); if (prescribedDrugDetailList.size() == prescribedDrugDetailListRS.size()) { r = prescribedDrugDetailListRS.size(); + // Extract the IDs from saved entities + for (PrescribedDrugDetail savedDrug : prescribedDrugDetailListRS) { + if (savedDrug.getId() != null) { + prescribedDrugIDs.add(savedDrug.getId()); + } + } } } else { r = 1; } - return r; + + result.put("count", r); + result.put("prescribedDrugIDs", prescribedDrugIDs); + return result; } private int calculateQtyPrescribed(String form, String dose, String frequency, String duration, diff --git a/src/main/java/com/iemr/mmu/service/covid19/Covid19ServiceImpl.java b/src/main/java/com/iemr/mmu/service/covid19/Covid19ServiceImpl.java index 0f393503..13c22e4c 100644 --- a/src/main/java/com/iemr/mmu/service/covid19/Covid19ServiceImpl.java +++ b/src/main/java/com/iemr/mmu/service/covid19/Covid19ServiceImpl.java @@ -938,7 +938,16 @@ public Long updateCovid19DoctorData(JsonObject requestOBJ, String Authorization) tmpObj.setVisitCode(commonUtilityClass.getVisitCode()); tmpObj.setProviderServiceMapID(commonUtilityClass.getProviderServiceMapID()); } - Integer r = commonNurseServiceImpl.saveBenPrescribedDrugsList(prescribedDrugDetailList); + Map drugSaveResult = commonNurseServiceImpl + .saveBenPrescribedDrugsList(prescribedDrugDetailList); + Integer r = (Integer) drugSaveResult.get("count"); + List prescribedDrugIDs = (List) drugSaveResult.get("prescribedDrugIDs"); + + // Store IDs in JsonObject + if (prescribedDrugIDs != null && !prescribedDrugIDs.isEmpty()) { + Gson gson = new Gson(); + requestOBJ.add("savedDrugIDs", gson.toJsonTree(prescribedDrugIDs)); + } if (r > 0 && r != null) { prescriptionSuccessFlag = r; } @@ -1233,7 +1242,16 @@ public Long saveDoctorData(JsonObject requestOBJ, String Authorization) throws E tmpObj.setVisitCode(commonUtilityClass.getVisitCode()); tmpObj.setProviderServiceMapID(commonUtilityClass.getProviderServiceMapID()); } - Integer r = commonNurseServiceImpl.saveBenPrescribedDrugsList(prescribedDrugDetailList); + Map drugSaveResult = commonNurseServiceImpl + .saveBenPrescribedDrugsList(prescribedDrugDetailList); + Integer r = (Integer) drugSaveResult.get("count"); + List prescribedDrugIDs = (List) drugSaveResult.get("prescribedDrugIDs"); + + // Store IDs in JsonObject + if (prescribedDrugIDs != null && !prescribedDrugIDs.isEmpty()) { + Gson gson = new Gson(); + requestOBJ.add("savedDrugIDs", gson.toJsonTree(prescribedDrugIDs)); + } if (r > 0 && r != null) { prescriptionSuccessFlag = r; } diff --git a/src/main/java/com/iemr/mmu/service/generalOPD/GeneralOPDServiceImpl.java b/src/main/java/com/iemr/mmu/service/generalOPD/GeneralOPDServiceImpl.java index 6042e57f..e884b9f3 100644 --- a/src/main/java/com/iemr/mmu/service/generalOPD/GeneralOPDServiceImpl.java +++ b/src/main/java/com/iemr/mmu/service/generalOPD/GeneralOPDServiceImpl.java @@ -911,7 +911,17 @@ public Long saveDoctorData(JsonObject requestOBJ, String Authorization) throws E tmpObj.setProviderServiceMapID(commonUtilityClass.getProviderServiceMapID()); } - Integer r = commonNurseServiceImpl.saveBenPrescribedDrugsList(prescribedDrugDetailList); + Map drugSaveResult = commonNurseServiceImpl + .saveBenPrescribedDrugsList(prescribedDrugDetailList); + Integer r = (Integer) drugSaveResult.get("count"); + List prescribedDrugIDs = (List) drugSaveResult.get("prescribedDrugIDs"); + + // Store IDs in JsonObject + if (prescribedDrugIDs != null && !prescribedDrugIDs.isEmpty()) { + Gson gson = new Gson(); + requestOBJ.add("savedDrugIDs", gson.toJsonTree(prescribedDrugIDs)); + } + if (r > 0 && r != null) { prescriptionSuccessFlag = r; } @@ -1550,7 +1560,16 @@ public Long updateGeneralOPDDoctorData(JsonObject requestOBJ, String Authorizati tmpObj.setVisitCode(commonUtilityClass.getVisitCode()); tmpObj.setProviderServiceMapID(commonUtilityClass.getProviderServiceMapID()); } - Integer r = commonNurseServiceImpl.saveBenPrescribedDrugsList(prescribedDrugDetailList); + Map drugSaveResult = commonNurseServiceImpl + .saveBenPrescribedDrugsList(prescribedDrugDetailList); + Integer r = (Integer) drugSaveResult.get("count"); + List prescribedDrugIDs = (List) drugSaveResult.get("prescribedDrugIDs"); + + // Store IDs in JsonObject + if (prescribedDrugIDs != null && !prescribedDrugIDs.isEmpty()) { + Gson gson = new Gson(); + requestOBJ.add("savedDrugIDs", gson.toJsonTree(prescribedDrugIDs)); + } if (r > 0 && r != null) { prescriptionSuccessFlag = r; } diff --git a/src/main/java/com/iemr/mmu/service/ncdCare/NCDCareServiceImpl.java b/src/main/java/com/iemr/mmu/service/ncdCare/NCDCareServiceImpl.java index 9cbe589c..80ec2dcc 100644 --- a/src/main/java/com/iemr/mmu/service/ncdCare/NCDCareServiceImpl.java +++ b/src/main/java/com/iemr/mmu/service/ncdCare/NCDCareServiceImpl.java @@ -106,6 +106,7 @@ public void setCommonDoctorServiceImpl(CommonDoctorServiceImpl commonDoctorServi public void setCommonNurseServiceImpl(CommonNurseServiceImpl commonNurseServiceImpl) { this.commonNurseServiceImpl = commonNurseServiceImpl; } + @Autowired private BeneficiaryFlowStatusRepo beneficiaryFlowStatusRepo; @@ -842,7 +843,17 @@ public Long saveDoctorData(JsonObject requestOBJ, String Authorization) throws E tmpObj.setVisitCode(commonUtilityClass.getVisitCode()); tmpObj.setProviderServiceMapID(commonUtilityClass.getProviderServiceMapID()); } - Integer r = commonNurseServiceImpl.saveBenPrescribedDrugsList(prescribedDrugDetailList); + Map drugSaveResult = commonNurseServiceImpl + .saveBenPrescribedDrugsList(prescribedDrugDetailList); + Integer r = (Integer) drugSaveResult.get("count"); + List prescribedDrugIDs = (List) drugSaveResult.get("prescribedDrugIDs"); + + // Store IDs in JsonObject + if (prescribedDrugIDs != null && !prescribedDrugIDs.isEmpty()) { + Gson gson = new Gson(); + requestOBJ.add("savedDrugIDs", gson.toJsonTree(prescribedDrugIDs)); + } + if (r > 0 && r != null) { prescriptionSuccessFlag = r; } @@ -1266,7 +1277,16 @@ public Long updateNCDCareDoctorData(JsonObject requestOBJ, String Authorization) tmpObj.setVisitCode(commonUtilityClass.getVisitCode()); tmpObj.setProviderServiceMapID(commonUtilityClass.getProviderServiceMapID()); } - Integer r = commonNurseServiceImpl.saveBenPrescribedDrugsList(prescribedDrugDetailList); + Map drugSaveResult = commonNurseServiceImpl + .saveBenPrescribedDrugsList(prescribedDrugDetailList); + Integer r = (Integer) drugSaveResult.get("count"); + List prescribedDrugIDs = (List) drugSaveResult.get("prescribedDrugIDs"); + + // Store IDs in JsonObject + if (prescribedDrugIDs != null && !prescribedDrugIDs.isEmpty()) { + Gson gson = new Gson(); + requestOBJ.add("savedDrugIDs", gson.toJsonTree(prescribedDrugIDs)); + } if (r > 0 && r != null) { prescriptionSuccessFlag = r; } diff --git a/src/main/java/com/iemr/mmu/service/ncdscreening/NCDSCreeningDoctorServiceImpl.java b/src/main/java/com/iemr/mmu/service/ncdscreening/NCDSCreeningDoctorServiceImpl.java index 6e470273..f62b61dc 100644 --- a/src/main/java/com/iemr/mmu/service/ncdscreening/NCDSCreeningDoctorServiceImpl.java +++ b/src/main/java/com/iemr/mmu/service/ncdscreening/NCDSCreeningDoctorServiceImpl.java @@ -24,6 +24,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Map; import java.util.regex.Pattern; import org.springframework.beans.factory.annotation.Autowired; @@ -216,7 +217,16 @@ public int updateDoctorData(JsonObject requestOBJ) throws Exception { tmpObj.setVisitCode(commonUtilityClass.getVisitCode()); tmpObj.setProviderServiceMapID(commonUtilityClass.getProviderServiceMapID()); } - Integer r = commonNurseServiceImpl.saveBenPrescribedDrugsList(prescribedDrugDetailList); + Map drugSaveResult = commonNurseServiceImpl + .saveBenPrescribedDrugsList(prescribedDrugDetailList); + Integer r = (Integer) drugSaveResult.get("count"); + List prescribedDrugIDs = (List) drugSaveResult.get("prescribedDrugIDs"); + + // Store IDs in JsonObject + if (prescribedDrugIDs != null && !prescribedDrugIDs.isEmpty()) { + Gson gson = new Gson(); + requestOBJ.add("savedDrugIDs", gson.toJsonTree(prescribedDrugIDs)); + } if (r > 0 && r != null) { prescriptionSuccessFlag = r; } diff --git a/src/main/java/com/iemr/mmu/service/ncdscreening/NCDScreeningServiceImpl.java b/src/main/java/com/iemr/mmu/service/ncdscreening/NCDScreeningServiceImpl.java index 9f1018a7..383e270c 100644 --- a/src/main/java/com/iemr/mmu/service/ncdscreening/NCDScreeningServiceImpl.java +++ b/src/main/java/com/iemr/mmu/service/ncdscreening/NCDScreeningServiceImpl.java @@ -268,10 +268,20 @@ private Long saveNCDNurseTMReferred(JsonObject requestOBJ, String authorization) tmpObj.setProviderServiceMapID(commonUtilityClass.getProviderServiceMapID()); } - Integer r = commonNurseServiceImpl.saveBenPrescribedDrugsList(prescribedDrugDetailList); - if (r > 0 && r != null) { - prescriptionSuccessFlag = r; - } + Map drugSaveResult = commonNurseServiceImpl + .saveBenPrescribedDrugsList(prescribedDrugDetailList); + Integer r = (Integer) drugSaveResult.get("count"); + List prescribedDrugIDs = (List) drugSaveResult.get("prescribedDrugIDs"); + + // Store IDs in JsonObject + if (prescribedDrugIDs != null && !prescribedDrugIDs.isEmpty()) { + Gson gson = new Gson(); + requestOBJ.add("savedDrugIDs", gson.toJsonTree(prescribedDrugIDs)); + } + + if (r > 0 && r != null) { + prescriptionSuccessFlag = r; + } } else { prescriptionSuccessFlag = 1; @@ -1319,7 +1329,16 @@ public Long saveDoctorData(JsonObject requestOBJ, String Authorization) throws E tmpObj.setProviderServiceMapID(commonUtilityClass.getProviderServiceMapID()); } - Integer r = commonNurseServiceImpl.saveBenPrescribedDrugsList(prescribedDrugDetailList); + Map drugSaveResult = commonNurseServiceImpl + .saveBenPrescribedDrugsList(prescribedDrugDetailList); + Integer r = (Integer) drugSaveResult.get("count"); + List prescribedDrugIDs = (List) drugSaveResult.get("prescribedDrugIDs"); + + // Store IDs in JsonObject + if (prescribedDrugIDs != null && !prescribedDrugIDs.isEmpty()) { + Gson gson = new Gson(); + requestOBJ.add("savedDrugIDs", gson.toJsonTree(prescribedDrugIDs)); + } if (r > 0 && r != null) { prescriptionSuccessFlag = r; } diff --git a/src/main/java/com/iemr/mmu/service/pnc/PNCServiceImpl.java b/src/main/java/com/iemr/mmu/service/pnc/PNCServiceImpl.java index 6ee2a83f..38c1b7f1 100644 --- a/src/main/java/com/iemr/mmu/service/pnc/PNCServiceImpl.java +++ b/src/main/java/com/iemr/mmu/service/pnc/PNCServiceImpl.java @@ -358,7 +358,16 @@ public Long savePNCDoctorData(JsonObject requestOBJ, String Authorization) throw tmpObj.setVisitCode(commonUtilityClass.getVisitCode()); tmpObj.setProviderServiceMapID(commonUtilityClass.getProviderServiceMapID()); } - Integer r = commonNurseServiceImpl.saveBenPrescribedDrugsList(prescribedDrugDetailList); + Map drugSaveResult = commonNurseServiceImpl + .saveBenPrescribedDrugsList(prescribedDrugDetailList); + Integer r = (Integer) drugSaveResult.get("count"); + List prescribedDrugIDs = (List) drugSaveResult.get("prescribedDrugIDs"); + + // Store IDs in JsonObject + if (prescribedDrugIDs != null && !prescribedDrugIDs.isEmpty()) { + Gson gson = new Gson(); + requestOBJ.add("savedDrugIDs", gson.toJsonTree(prescribedDrugIDs)); + } if (r > 0 && r != null) { prescriptionSuccessFlag = r; } @@ -1550,7 +1559,16 @@ public Long updatePNCDoctorData(JsonObject requestOBJ, String Authorization) thr tmpObj.setVisitCode(commonUtilityClass.getVisitCode()); tmpObj.setProviderServiceMapID(commonUtilityClass.getProviderServiceMapID()); } - Integer r = commonNurseServiceImpl.saveBenPrescribedDrugsList(prescribedDrugDetailList); + Map drugSaveResult = commonNurseServiceImpl + .saveBenPrescribedDrugsList(prescribedDrugDetailList); + Integer r = (Integer) drugSaveResult.get("count"); + List prescribedDrugIDs = (List) drugSaveResult.get("prescribedDrugIDs"); + + // Store IDs in JsonObject + if (prescribedDrugIDs != null && !prescribedDrugIDs.isEmpty()) { + Gson gson = new Gson(); + requestOBJ.add("savedDrugIDs", gson.toJsonTree(prescribedDrugIDs)); + } if (r > 0 && r != null) { prescriptionSuccessFlag = r; } diff --git a/src/main/java/com/iemr/mmu/service/quickConsultation/QuickConsultationServiceImpl.java b/src/main/java/com/iemr/mmu/service/quickConsultation/QuickConsultationServiceImpl.java index 0078c596..de19a791 100644 --- a/src/main/java/com/iemr/mmu/service/quickConsultation/QuickConsultationServiceImpl.java +++ b/src/main/java/com/iemr/mmu/service/quickConsultation/QuickConsultationServiceImpl.java @@ -160,6 +160,7 @@ public void setPrescriptionDetailRepo(PrescriptionDetailRepo prescriptionDetailR public void setExternalTestOrderRepo(ExternalTestOrderRepo externalTestOrderRepo) { this.externalTestOrderRepo = externalTestOrderRepo; } + @Autowired private BeneficiaryFlowStatusRepo beneficiaryFlowStatusRepo; @@ -426,7 +427,19 @@ public Integer quickConsultDoctorDataInsert(JsonObject quickConsultDoctorOBJ, St tmpObj.setVisitCode(commonUtilityClass.getVisitCode()); tmpObj.setProviderServiceMapID(commonUtilityClass.getProviderServiceMapID()); } - Integer r = commonNurseServiceImpl.saveBenPrescribedDrugsList(prescribedDrugDetailList); + + // Use the modified method to get both count and IDs + Map drugSaveResult = commonNurseServiceImpl + .saveBenPrescribedDrugsList(prescribedDrugDetailList); + Integer r = (Integer) drugSaveResult.get("count"); + List prescribedDrugIDs = (List) drugSaveResult.get("prescribedDrugIDs"); + + // Store the drug IDs in the JsonObject for later retrieval in controller + if (prescribedDrugIDs != null && !prescribedDrugIDs.isEmpty()) { + Gson gson = new Gson(); + quickConsultDoctorOBJ.add("savedDrugIDs", gson.toJsonTree(prescribedDrugIDs)); + } + if (r > 0 && r != null) { prescriptionSuccessFlag = r; } @@ -645,7 +658,19 @@ public Long updateGeneralOPDQCDoctorData(JsonObject quickConsultDoctorOBJ, Strin tmpObj.setVisitCode(commonUtilityClass.getVisitCode()); tmpObj.setProviderServiceMapID(commonUtilityClass.getProviderServiceMapID()); } - Integer r = commonNurseServiceImpl.saveBenPrescribedDrugsList(prescribedDrugDetailList); + + // Use the modified method to get both count and IDs + Map drugSaveResult = commonNurseServiceImpl + .saveBenPrescribedDrugsList(prescribedDrugDetailList); + Integer r = (Integer) drugSaveResult.get("count"); + List prescribedDrugIDs = (List) drugSaveResult.get("prescribedDrugIDs"); + + // Store the drug IDs in the JsonObject for later retrieval in controller + if (prescribedDrugIDs != null && !prescribedDrugIDs.isEmpty()) { + Gson gson = new Gson(); + quickConsultDoctorOBJ.add("savedDrugIDs", gson.toJsonTree(prescribedDrugIDs)); + } + if (r > 0 && r != null) { prescribedDrugSuccessFlag = new Long(1); } From f83cd435ca39ffa95edf71ec90bc95fb251a51fc Mon Sep 17 00:00:00 2001 From: Vishwanath Balkur <118195001+vishwab1@users.noreply.github.com> Date: Thu, 30 Oct 2025 12:34:08 +0530 Subject: [PATCH 38/47] API changes in Signature enhancement for Casesheet (#133) * fix:casesheet signature * fix: all visit code save data * fix: all visit code save data * fix: print data resposne doctor signature * fix:removed comments --- .../benFlowStatus/BeneficiaryFlowStatus.java | 21 ++++++++++-- .../BeneficiaryFlowStatusRepo.java | 32 ++++++++++++------- .../iemr/mmu/service/anc/ANCServiceImpl.java | 6 +++- .../CommonBenStatusFlowServiceImpl.java | 17 ++++++---- .../cancerScreening/CSServiceImpl.java | 10 ++++-- .../transaction/CommonDoctorServiceImpl.java | 9 ++++-- .../service/covid19/Covid19ServiceImpl.java | 6 +++- .../generalOPD/GeneralOPDServiceImpl.java | 6 +++- .../service/ncdCare/NCDCareServiceImpl.java | 6 +++- .../ncdscreening/NCDScreeningServiceImpl.java | 6 +++- .../iemr/mmu/service/pnc/PNCServiceImpl.java | 6 +++- .../QuickConsultationServiceImpl.java | 7 +++- 12 files changed, 100 insertions(+), 32 deletions(-) diff --git a/src/main/java/com/iemr/mmu/data/benFlowStatus/BeneficiaryFlowStatus.java b/src/main/java/com/iemr/mmu/data/benFlowStatus/BeneficiaryFlowStatus.java index 0cce7849..4493ce9f 100644 --- a/src/main/java/com/iemr/mmu/data/benFlowStatus/BeneficiaryFlowStatus.java +++ b/src/main/java/com/iemr/mmu/data/benFlowStatus/BeneficiaryFlowStatus.java @@ -274,7 +274,11 @@ public class BeneficiaryFlowStatus { @Expose @Column(name = "isCaseSheetdownloaded") private Boolean isCaseSheetdownloaded; - + + @Expose + @Column(name = "doctor_signature_flag") + private Boolean doctorSignatureFlag = false; + @Transient private I_bendemographics i_bendemographics; @Transient @@ -368,8 +372,11 @@ public static BeneficiaryFlowStatus getBeneficiaryFlowStatusForLeftPanel(ArrayLi (String) objArr[3], (String) objArr[4], (Integer) objArr[5], (Short) objArr[6], (String) objArr[7], (String) objArr[8], (String) objArr[9], (Long) objArr[10], (String) objArr[11], (String) objArr[12], (String) objArr[13], (Long) objArr[14], - (Timestamp) objArr[15], (Timestamp) objArr[16], (Long) objArr[17], (Timestamp) objArr[18], + (Timestamp) objArr[15], (Timestamp) objArr[16], (Long) objArr[17], (Timestamp) objArr[18], (String) objArr[19], (String) objArr[20]); + if (objArr.length > 21) { + obj.setDoctorSignatureFlag((Boolean) objArr[21]); + } } } return obj; @@ -972,4 +979,14 @@ public void setAuth(String auth) { Auth = auth; } + // Add getter + public Boolean getDoctorSignatureFlag() { + return doctorSignatureFlag; + } + + // Add setter + public void setDoctorSignatureFlag(Boolean doctorSignatureFlag) { + this.doctorSignatureFlag = doctorSignatureFlag; + } + } diff --git a/src/main/java/com/iemr/mmu/repo/benFlowStatus/BeneficiaryFlowStatusRepo.java b/src/main/java/com/iemr/mmu/repo/benFlowStatus/BeneficiaryFlowStatusRepo.java index 900beccd..da47c69a 100644 --- a/src/main/java/com/iemr/mmu/repo/benFlowStatus/BeneficiaryFlowStatusRepo.java +++ b/src/main/java/com/iemr/mmu/repo/benFlowStatus/BeneficiaryFlowStatusRepo.java @@ -74,9 +74,12 @@ public int updateBenFlowStatusTMReferred(@Param("benFlowID") Long benFlowID, @Pa @Param("specialistFlag") Short specialistFlag, @Param("pharmacistflag") Short pharmacistflag); @Query("SELECT t.benFlowID, t.beneficiaryRegID, t.visitDate, t.benName, t.age, t.ben_age_val, t.genderID, t.genderName, " - + " t.villageName, t.districtName, t.beneficiaryID, t.servicePointName, t.VisitReason, t.VisitCategory, t.benVisitID, " - + " t.registrationDate, t.benVisitDate, t.visitCode, t.consultationDate, t.fatherName, t.preferredPhoneNum FROM BeneficiaryFlowStatus t " - + " Where t.beneficiaryRegID = :benRegID AND t.benFlowID = :benFlowID ") + + " t.villageName, t.districtName, t.beneficiaryID, t.servicePointName, t.VisitReason, t.VisitCategory, " + + " t.benVisitID, t.registrationDate, t.benVisitDate, t.visitCode, t.consultationDate, " + + " t.fatherName, t.preferredPhoneNum, t.doctorSignatureFlag " // <-- added here + + " FROM BeneficiaryFlowStatus t " + + " WHERE t.beneficiaryRegID = :benRegID AND t.benFlowID = :benFlowID ") + public ArrayList getBenDetailsForLeftSidePanel(@Param("benRegID") Long benRegID, @Param("benFlowID") Long benFlowID); @@ -147,17 +150,24 @@ public ArrayList getLabWorklistNew( @Param("providerServiceMapId") Integer providerServiceMapId, @Param("fromDate") Timestamp fromDate, @Param("vanID") Integer vanID); + @Transactional @Modifying - @Query("UPDATE BeneficiaryFlowStatus t set t.doctorFlag = :docFlag , t.pharmacist_flag = :pharmaFlag, " - + " t.oncologist_flag = :oncologistFlag, t.consultationDate = now(), t.processed = 'U', " - + " t.specialist_flag = :tcSpecialistFlag, t.tCSpecialistUserID = :tcSpecialistUserID, t.tCRequestDate = :tcDate " - + " WHERE t.benFlowID = :benFlowID AND " + " t.beneficiaryRegID = :benRegID AND t.beneficiaryID = :benID ") + @Query("UPDATE BeneficiaryFlowStatus t set t.doctorFlag = :docFlag, " + + "t.pharmacist_flag = :pharmaFlag, t.doctorSignatureFlag = :signatureFlag, " + + "t.oncologist_flag = :oncologistFlag, t.consultationDate = now(), t.processed = 'U', " + + "t.specialist_flag = :tcSpecialistFlag, t.tCSpecialistUserID = :tcSpecialistUserID, " + + "t.tCRequestDate = :tcDate WHERE t.benFlowID = :benFlowID AND " + + "t.beneficiaryRegID = :benRegID AND t.beneficiaryID = :benID") public int updateBenFlowStatusAfterDoctorActivity(@Param("benFlowID") Long benFlowID, - @Param("benRegID") Long benRegID, @Param("benID") Long benID, @Param("docFlag") Short docFlag, - @Param("pharmaFlag") Short pharmaFlag, @Param("oncologistFlag") Short oncologistFlag, - @Param("tcSpecialistFlag") Short tcSpecialistFlag, @Param("tcSpecialistUserID") int tcSpecialistUserID, - @Param("tcDate") Timestamp tcDate); + @Param("benRegID") Long benRegID, @Param("benID") Long benID, + @Param("docFlag") Short docFlag, @Param("pharmaFlag") Short pharmaFlag, + @Param("oncologistFlag") Short oncologistFlag, + @Param("tcSpecialistFlag") Short tcSpecialistFlag, + @Param("tcSpecialistUserID") int tcSpecialistUserID, + @Param("tcDate") Timestamp tcDate, + @Param("signatureFlag") Boolean signatureFlag); + @Transactional @Modifying @Query("UPDATE BeneficiaryFlowStatus t set t.doctorFlag = :docFlag , t.pharmacist_flag = :pharmaFlag, " diff --git a/src/main/java/com/iemr/mmu/service/anc/ANCServiceImpl.java b/src/main/java/com/iemr/mmu/service/anc/ANCServiceImpl.java index d9538b62..a21c578d 100644 --- a/src/main/java/com/iemr/mmu/service/anc/ANCServiceImpl.java +++ b/src/main/java/com/iemr/mmu/service/anc/ANCServiceImpl.java @@ -266,6 +266,10 @@ private int updateBenFlowNurseAfterNurseActivityANC(JsonObject investigationData @Transactional(rollbackFor = Exception.class) public Long saveANCDoctorData(JsonObject requestOBJ, String Authorization) throws Exception { + Boolean doctorSignatureFlag = false; + if (requestOBJ.has("doctorSignatureFlag") && !requestOBJ.get("doctorSignatureFlag").isJsonNull()) { + doctorSignatureFlag = requestOBJ.get("doctorSignatureFlag").getAsBoolean(); + } Long saveSuccessFlag = null; Long prescriptionID = null; Long investigationSuccessFlag = null; @@ -415,7 +419,7 @@ public Long saveANCDoctorData(JsonObject requestOBJ, String Authorization) throw // call method to update beneficiary flow table int i = commonDoctorServiceImpl.updateBenFlowtableAfterDocDataSave(commonUtilityClass, isTestPrescribed, - isMedicinePrescribed, tcRequestOBJ); + isMedicinePrescribed, tcRequestOBJ, doctorSignatureFlag); if (i > 0) { saveSuccessFlag = diagnosisSuccessFlag; diff --git a/src/main/java/com/iemr/mmu/service/benFlowStatus/CommonBenStatusFlowServiceImpl.java b/src/main/java/com/iemr/mmu/service/benFlowStatus/CommonBenStatusFlowServiceImpl.java index 148c789d..3296e47d 100644 --- a/src/main/java/com/iemr/mmu/service/benFlowStatus/CommonBenStatusFlowServiceImpl.java +++ b/src/main/java/com/iemr/mmu/service/benFlowStatus/CommonBenStatusFlowServiceImpl.java @@ -261,14 +261,19 @@ private BeneficiaryFlowStatus getBenFlowRecordObj(String requestOBJ, Long benefi return obj; } - public int updateBenFlowAfterDocData(Long benFlowID, Long benRegID, Long benID, Long benVisitID, short docFlag, - short pharmaFlag, short oncologistFlag, short tcSpecialistFlag, int tcUserID, Timestamp tcDate) { + public int updateBenFlowAfterDocData(Long benFlowID, Long benRegID, Long benID, Long benVisitID, + short docFlag, short pharmaFlag, short oncologistFlag, short tcSpecialistFlag, + int tcUserID, Timestamp tcDate, Boolean signatureFlag) throws Exception { int i = 0; try { - i = beneficiaryFlowStatusRepo.updateBenFlowStatusAfterDoctorActivity(benFlowID, benRegID, benID, docFlag, - pharmaFlag, oncologistFlag, tcSpecialistFlag, tcUserID, tcDate); + Short pharmaF = beneficiaryFlowStatusRepo.getPharmaFlag(benFlowID); + Short pharmaF1 = (pharmaF != null && pharmaF == 1) ? pharmaF : pharmaFlag; + + i = beneficiaryFlowStatusRepo.updateBenFlowStatusAfterDoctorActivity(benFlowID, benRegID, benID, + docFlag, pharmaF1, oncologistFlag, tcSpecialistFlag, tcUserID, tcDate, signatureFlag); } catch (Exception e) { - logger.error("Error in ben flow creation = " + e); + logger.error("Error in ben flow update = " + e); + throw new Exception(e); } return i; } @@ -287,7 +292,7 @@ public int updateBenFlowAfterDocDataUpdate(Long benFlowID, Long benRegID, Long b pharmaF1 = pharmaFlag; i = beneficiaryFlowStatusRepo.updateBenFlowStatusAfterDoctorActivity(benFlowID, benRegID, benID, docFlag, - pharmaF1, oncologistFlag, tcSpecialistFlag, tcUserID, tcDate); + pharmaF1, oncologistFlag, tcSpecialistFlag, tcUserID, tcDate, false); } catch (Exception e) { logger.error("Error in ben flow creation = " + e); throw new Exception(e); diff --git a/src/main/java/com/iemr/mmu/service/cancerScreening/CSServiceImpl.java b/src/main/java/com/iemr/mmu/service/cancerScreening/CSServiceImpl.java index 23fdf9d8..85f36174 100644 --- a/src/main/java/com/iemr/mmu/service/cancerScreening/CSServiceImpl.java +++ b/src/main/java/com/iemr/mmu/service/cancerScreening/CSServiceImpl.java @@ -726,6 +726,10 @@ public String getBenDataFrmNurseToDocExaminationScreen(Long benRegID, Long visit // -------Create/save (Doctor)--------------------------- @Transactional(rollbackFor = Exception.class) public Long saveCancerScreeningDoctorData(JsonObject requestOBJ, String Authorization) throws Exception { + Boolean doctorSignatureFlag = false; + if (requestOBJ.has("doctorSignatureFlag") && !requestOBJ.get("doctorSignatureFlag").isJsonNull()) { + doctorSignatureFlag = requestOBJ.get("doctorSignatureFlag").getAsBoolean(); + } Long docDataSuccessFlag = null; Integer tcRequestStatusFlag = null; @@ -809,11 +813,11 @@ public Long saveCancerScreeningDoctorData(JsonObject requestOBJ, String Authoriz tcUserID = tcRequestOBJ.getUserID(); tcDate = tcRequestOBJ.getAllocationDate(); - } - + } + int l = commonBenStatusFlowServiceImpl.updateBenFlowAfterDocData(tmpBenFlowID, tmpbeneficiaryRegID, tmpBeneficiaryID, tmpBenVisitID, docFlag, pharmaFalg, oncologistFlag, tcSpecialistFlag, - tcUserID, tcDate); + tcUserID, tcDate, doctorSignatureFlag); docDataSuccessFlag = diagnosisSuccessFlag; } diff --git a/src/main/java/com/iemr/mmu/service/common/transaction/CommonDoctorServiceImpl.java b/src/main/java/com/iemr/mmu/service/common/transaction/CommonDoctorServiceImpl.java index 11191065..f7e8839d 100644 --- a/src/main/java/com/iemr/mmu/service/common/transaction/CommonDoctorServiceImpl.java +++ b/src/main/java/com/iemr/mmu/service/common/transaction/CommonDoctorServiceImpl.java @@ -764,8 +764,10 @@ public Long updateBenReferDetails(JsonObject referObj) throws IEMRException { */ /// ------Start of beneficiary flow table after doctor data save------------- - public int updateBenFlowtableAfterDocDataSave(CommonUtilityClass commonUtilityClass, Boolean isTestPrescribed, - Boolean isMedicinePrescribed, TeleconsultationRequestOBJ tcRequestOBJ) { + public int updateBenFlowtableAfterDocDataSave(CommonUtilityClass commonUtilityClass, + Boolean isTestPrescribed, Boolean isMedicinePrescribed, + TeleconsultationRequestOBJ tcRequestOBJ, Boolean doctorSignatureFlag) throws Exception { + short pharmaFalg; short docFlag; short tcSpecialistFlag = (short) 0; @@ -807,7 +809,8 @@ public int updateBenFlowtableAfterDocDataSave(CommonUtilityClass commonUtilityCl } int i = commonBenStatusFlowServiceImpl.updateBenFlowAfterDocData(tmpBenFlowID, tmpbeneficiaryRegID, - tmpBeneficiaryID, tmpBenVisitID, docFlag, pharmaFalg, (short) 0, tcSpecialistFlag, tcUserID, tcDate); + tmpBeneficiaryID, tmpBenVisitID, docFlag, pharmaFalg, (short) 0, tcSpecialistFlag, + tcUserID, tcDate, doctorSignatureFlag); return i; } diff --git a/src/main/java/com/iemr/mmu/service/covid19/Covid19ServiceImpl.java b/src/main/java/com/iemr/mmu/service/covid19/Covid19ServiceImpl.java index 0f393503..d4ff81a0 100644 --- a/src/main/java/com/iemr/mmu/service/covid19/Covid19ServiceImpl.java +++ b/src/main/java/com/iemr/mmu/service/covid19/Covid19ServiceImpl.java @@ -1149,6 +1149,10 @@ private String getCovidDiagnosisData(Long benRegID, Long visitCode) { /// --------------- start of saving doctor data ------------------------ @Transactional(rollbackFor = Exception.class) public Long saveDoctorData(JsonObject requestOBJ, String Authorization) throws Exception { + Boolean doctorSignatureFlag = false; + if (requestOBJ.has("doctorSignatureFlag") && !requestOBJ.get("doctorSignatureFlag").isJsonNull()) { + doctorSignatureFlag = requestOBJ.get("doctorSignatureFlag").getAsBoolean(); + } Long saveSuccessFlag = null; Long prescriptionID = null; Long investigationSuccessFlag = null; @@ -1258,7 +1262,7 @@ public Long saveDoctorData(JsonObject requestOBJ, String Authorization) throws E // call method to update beneficiary flow table int i = commonDoctorServiceImpl.updateBenFlowtableAfterDocDataSave(commonUtilityClass, isTestPrescribed, - isMedicinePrescribed, tcRequestOBJ); + isMedicinePrescribed, tcRequestOBJ, doctorSignatureFlag); if (i > 0) { saveSuccessFlag = referSaveSuccessFlag; diff --git a/src/main/java/com/iemr/mmu/service/generalOPD/GeneralOPDServiceImpl.java b/src/main/java/com/iemr/mmu/service/generalOPD/GeneralOPDServiceImpl.java index 6042e57f..bac2f8ed 100644 --- a/src/main/java/com/iemr/mmu/service/generalOPD/GeneralOPDServiceImpl.java +++ b/src/main/java/com/iemr/mmu/service/generalOPD/GeneralOPDServiceImpl.java @@ -784,6 +784,10 @@ public Long saveBenExaminationDetails(JsonObject examinationDetailsOBJ, Long ben @Override @Transactional(rollbackFor = Exception.class) public Long saveDoctorData(JsonObject requestOBJ, String Authorization) throws Exception { + Boolean doctorSignatureFlag = false; + if (requestOBJ.has("doctorSignatureFlag") && !requestOBJ.get("doctorSignatureFlag").isJsonNull()) { + doctorSignatureFlag = requestOBJ.get("doctorSignatureFlag").getAsBoolean(); + } Long saveSuccessFlag = null; Long prescriptionID = null; Long investigationSuccessFlag = null; @@ -939,7 +943,7 @@ public Long saveDoctorData(JsonObject requestOBJ, String Authorization) throws E // call method to update beneficiary flow table int i = commonDoctorServiceImpl.updateBenFlowtableAfterDocDataSave(commonUtilityClass, isTestPrescribed, - isMedicinePrescribed, tcRequestOBJ); + isMedicinePrescribed, tcRequestOBJ, doctorSignatureFlag); if (i > 0) { saveSuccessFlag = investigationSuccessFlag; diff --git a/src/main/java/com/iemr/mmu/service/ncdCare/NCDCareServiceImpl.java b/src/main/java/com/iemr/mmu/service/ncdCare/NCDCareServiceImpl.java index 9cbe589c..db55e967 100644 --- a/src/main/java/com/iemr/mmu/service/ncdCare/NCDCareServiceImpl.java +++ b/src/main/java/com/iemr/mmu/service/ncdCare/NCDCareServiceImpl.java @@ -685,6 +685,10 @@ public String getBeneficiaryVitalDetails(Long beneficiaryRegID, Long visitCode) /// --------------- start of saving doctor data ------------------------ @Transactional(rollbackFor = Exception.class) public Long saveDoctorData(JsonObject requestOBJ, String Authorization) throws Exception { + Boolean doctorSignatureFlag = false; + if (requestOBJ.has("doctorSignatureFlag") && !requestOBJ.get("doctorSignatureFlag").isJsonNull()) { + doctorSignatureFlag = requestOBJ.get("doctorSignatureFlag").getAsBoolean(); + } Long saveSuccessFlag = null; Long prescriptionID = null; Long investigationSuccessFlag = null; @@ -868,7 +872,7 @@ public Long saveDoctorData(JsonObject requestOBJ, String Authorization) throws E // call method to update beneficiary flow table int i = commonDoctorServiceImpl.updateBenFlowtableAfterDocDataSave(commonUtilityClass, isTestPrescribed, - isMedicinePrescribed, tcRequestOBJ); + isMedicinePrescribed, tcRequestOBJ, doctorSignatureFlag); if (i > 0) { saveSuccessFlag = diagnosisSuccessFlag; diff --git a/src/main/java/com/iemr/mmu/service/ncdscreening/NCDScreeningServiceImpl.java b/src/main/java/com/iemr/mmu/service/ncdscreening/NCDScreeningServiceImpl.java index 9f1018a7..a03e9c10 100644 --- a/src/main/java/com/iemr/mmu/service/ncdscreening/NCDScreeningServiceImpl.java +++ b/src/main/java/com/iemr/mmu/service/ncdscreening/NCDScreeningServiceImpl.java @@ -1169,6 +1169,10 @@ public Long UpdateIDRSScreen(JsonObject idrsOBJ) throws Exception { @Transactional(rollbackFor = Exception.class) public Long saveDoctorData(JsonObject requestOBJ, String Authorization) throws Exception { + Boolean doctorSignatureFlag = false; + if (requestOBJ.has("doctorSignatureFlag") && !requestOBJ.get("doctorSignatureFlag").isJsonNull()) { + doctorSignatureFlag = requestOBJ.get("doctorSignatureFlag").getAsBoolean(); + } Long saveSuccessFlag = null; Long prescriptionID = null; Long investigationSuccessFlag = null; @@ -1347,7 +1351,7 @@ public Long saveDoctorData(JsonObject requestOBJ, String Authorization) throws E // call method to update beneficiary flow table int i = commonDoctorServiceImpl.updateBenFlowtableAfterDocDataSave(commonUtilityClass, isTestPrescribed, - isMedicinePrescribed, tcRequestOBJ); + isMedicinePrescribed, tcRequestOBJ, doctorSignatureFlag); if (i > 0) { diff --git a/src/main/java/com/iemr/mmu/service/pnc/PNCServiceImpl.java b/src/main/java/com/iemr/mmu/service/pnc/PNCServiceImpl.java index 6ee2a83f..e1eee098 100644 --- a/src/main/java/com/iemr/mmu/service/pnc/PNCServiceImpl.java +++ b/src/main/java/com/iemr/mmu/service/pnc/PNCServiceImpl.java @@ -237,6 +237,10 @@ private int updateBenStatusFlagAfterNurseSaveSuccess(JsonObject tmpOBJ, Long ben @Transactional(rollbackFor = Exception.class) public Long savePNCDoctorData(JsonObject requestOBJ, String Authorization) throws Exception { + Boolean doctorSignatureFlag = false; + if (requestOBJ.has("doctorSignatureFlag") && !requestOBJ.get("doctorSignatureFlag").isJsonNull()) { + doctorSignatureFlag = requestOBJ.get("doctorSignatureFlag").getAsBoolean(); + } Long saveSuccessFlag = null; Long prescriptionID = null; Long investigationSuccessFlag = null; @@ -383,7 +387,7 @@ public Long savePNCDoctorData(JsonObject requestOBJ, String Authorization) throw // call method to update beneficiary flow table int i = commonDoctorServiceImpl.updateBenFlowtableAfterDocDataSave(commonUtilityClass, isTestPrescribed, - isMedicinePrescribed, tcRequestOBJ); + isMedicinePrescribed, tcRequestOBJ, doctorSignatureFlag); if (i > 0) { saveSuccessFlag = diagnosisSuccessFlag; diff --git a/src/main/java/com/iemr/mmu/service/quickConsultation/QuickConsultationServiceImpl.java b/src/main/java/com/iemr/mmu/service/quickConsultation/QuickConsultationServiceImpl.java index 230c4c5d..fc171805 100644 --- a/src/main/java/com/iemr/mmu/service/quickConsultation/QuickConsultationServiceImpl.java +++ b/src/main/java/com/iemr/mmu/service/quickConsultation/QuickConsultationServiceImpl.java @@ -357,6 +357,11 @@ private int updateBenStatusFlagAfterNurseSaveSuccess(BeneficiaryVisitDetail benV @Override public Integer quickConsultDoctorDataInsert(JsonObject quickConsultDoctorOBJ, String Authorization) throws Exception { + Boolean doctorSignatureFlag = false; + if (quickConsultDoctorOBJ.has("doctorSignatureFlag") + && !quickConsultDoctorOBJ.get("doctorSignatureFlag").isJsonNull()) { + doctorSignatureFlag = quickConsultDoctorOBJ.get("doctorSignatureFlag").getAsBoolean(); + } Integer returnOBJ = 0; Integer prescriptionSuccessFlag = null; Integer investigationSuccessFlag = null; @@ -488,7 +493,7 @@ public Integer quickConsultDoctorDataInsert(JsonObject quickConsultDoctorOBJ, St // call method to update beneficiary flow table int i = commonDoctorServiceImpl.updateBenFlowtableAfterDocDataSave(commonUtilityClass, isTestPrescribed, - isMedicinePrescribed, tcRequestOBJ); + isMedicinePrescribed, tcRequestOBJ, doctorSignatureFlag); if (i > 0) { returnOBJ = 1; From c9f6a59a0fc10295d81b7811303c86f4d33cc240 Mon Sep 17 00:00:00 2001 From: vishwab1 Date: Thu, 30 Oct 2025 14:28:13 +0530 Subject: [PATCH 39/47] fix:update doctor data with sign --- .../BeneficiaryFlowStatusRepo.java | 39 +++++++++++-------- .../iemr/mmu/service/anc/ANCServiceImpl.java | 6 ++- .../CommonBenStatusFlowServiceImpl.java | 20 +++++----- .../transaction/CommonDoctorServiceImpl.java | 12 +++--- .../service/covid19/Covid19ServiceImpl.java | 7 +++- .../generalOPD/GeneralOPDServiceImpl.java | 6 ++- .../service/ncdCare/NCDCareServiceImpl.java | 7 +++- .../NCDSCreeningDoctorServiceImpl.java | 7 +++- .../iemr/mmu/service/pnc/PNCServiceImpl.java | 7 +++- .../QuickConsultationServiceImpl.java | 8 +++- 10 files changed, 81 insertions(+), 38 deletions(-) diff --git a/src/main/java/com/iemr/mmu/repo/benFlowStatus/BeneficiaryFlowStatusRepo.java b/src/main/java/com/iemr/mmu/repo/benFlowStatus/BeneficiaryFlowStatusRepo.java index da47c69a..b3d90026 100644 --- a/src/main/java/com/iemr/mmu/repo/benFlowStatus/BeneficiaryFlowStatusRepo.java +++ b/src/main/java/com/iemr/mmu/repo/benFlowStatus/BeneficiaryFlowStatusRepo.java @@ -170,24 +170,31 @@ public int updateBenFlowStatusAfterDoctorActivity(@Param("benFlowID") Long benFl @Transactional @Modifying - @Query("UPDATE BeneficiaryFlowStatus t set t.doctorFlag = :docFlag , t.pharmacist_flag = :pharmaFlag, " - + " t.oncologist_flag = :oncologistFlag, t.consultationDate = now(), t.processed = 'U', " - + " t.tCSpecialistUserID = :tcSpecialistUserID, t.tCRequestDate = :tcDate " - + " WHERE t.benFlowID = :benFlowID AND " + " t.beneficiaryRegID = :benRegID AND t.beneficiaryID = :benID ") + @Query("UPDATE BeneficiaryFlowStatus t set t.doctorFlag = :docFlag, " + + "t.pharmacist_flag = :pharmaFlag, t.doctorSignatureFlag = :signatureFlag, " + + "t.oncologist_flag = :oncologistFlag, t.consultationDate = now(), t.processed = 'U', " + + "t.tCSpecialistUserID = :tcSpecialistUserID, t.tCRequestDate = :tcDate " + + "WHERE t.benFlowID = :benFlowID AND t.beneficiaryRegID = :benRegID AND t.beneficiaryID = :benID") public int updateBenFlowStatusAfterDoctorActivityWDF(@Param("benFlowID") Long benFlowID, - @Param("benRegID") Long benRegID, @Param("benID") Long benID, @Param("docFlag") Short docFlag, - @Param("pharmaFlag") Short pharmaFlag, @Param("oncologistFlag") Short oncologistFlag, - @Param("tcSpecialistUserID") int tcSpecialistUserID, - @Param("tcDate") Timestamp tcDate); + @Param("benRegID") Long benRegID, @Param("benID") Long benID, + @Param("docFlag") Short docFlag, @Param("pharmaFlag") Short pharmaFlag, + @Param("oncologistFlag") Short oncologistFlag, + @Param("tcSpecialistUserID") int tcSpecialistUserID, + @Param("tcDate") Timestamp tcDate, + @Param("signatureFlag") Boolean signatureFlag); - @Transactional - @Modifying - @Query("UPDATE BeneficiaryFlowStatus t set t.pharmacist_flag = :pharmaFlag, " - + " t.oncologist_flag = :oncologistFlag, t.processed = 'U', t.specialist_flag = :tcSpecialistFlag " - + " WHERE t.benFlowID = :benFlowID AND t.beneficiaryRegID = :benRegID AND t.beneficiaryID = :benID ") - public int updateBenFlowStatusAfterDoctorActivityTCSpecialist(@Param("benFlowID") Long benFlowID, - @Param("benRegID") Long benRegID, @Param("benID") Long benID, @Param("pharmaFlag") Short pharmaFlag, - @Param("oncologistFlag") Short oncologistFlag, @Param("tcSpecialistFlag") Short tcSpecialistFlag); +@Transactional +@Modifying +@Query("UPDATE BeneficiaryFlowStatus t set t.pharmacist_flag = :pharmaFlag, " + + "t.doctorSignatureFlag = :signatureFlag, " + + "t.oncologist_flag = :oncologistFlag, t.processed = 'U', t.specialist_flag = :tcSpecialistFlag " + + "WHERE t.benFlowID = :benFlowID AND t.beneficiaryRegID = :benRegID AND t.beneficiaryID = :benID") +public int updateBenFlowStatusAfterDoctorActivityTCSpecialist(@Param("benFlowID") Long benFlowID, + @Param("benRegID") Long benRegID, @Param("benID") Long benID, + @Param("pharmaFlag") Short pharmaFlag, + @Param("oncologistFlag") Short oncologistFlag, + @Param("tcSpecialistFlag") Short tcSpecialistFlag, + @Param("signatureFlag") Boolean signatureFlag); @Transactional @Modifying diff --git a/src/main/java/com/iemr/mmu/service/anc/ANCServiceImpl.java b/src/main/java/com/iemr/mmu/service/anc/ANCServiceImpl.java index a21c578d..01fcffc0 100644 --- a/src/main/java/com/iemr/mmu/service/anc/ANCServiceImpl.java +++ b/src/main/java/com/iemr/mmu/service/anc/ANCServiceImpl.java @@ -1475,6 +1475,10 @@ public Long updateANCDoctorData(JsonObject requestOBJ, String Authorization) thr Integer prescriptionSuccessFlag = null; Long referSaveSuccessFlag = null; Integer tcRequestStatusFlag = null; + Boolean doctorSignatureFlag = false; + if (requestOBJ.has("doctorSignatureFlag") && !requestOBJ.get("doctorSignatureFlag").isJsonNull()) { + doctorSignatureFlag = requestOBJ.get("doctorSignatureFlag").getAsBoolean(); + } if (requestOBJ != null) { TeleconsultationRequestOBJ tcRequestOBJ = null; @@ -1626,7 +1630,7 @@ public Long updateANCDoctorData(JsonObject requestOBJ, String Authorization) thr // call method to update beneficiary flow table int i = commonDoctorServiceImpl.updateBenFlowtableAfterDocDataUpdate(commonUtilityClass, - isTestPrescribed, isMedicinePrescribed, tcRequestOBJ); + isTestPrescribed, isMedicinePrescribed, tcRequestOBJ, doctorSignatureFlag); if (i > 0) { updateSuccessFlag = investigationSuccessFlag; diff --git a/src/main/java/com/iemr/mmu/service/benFlowStatus/CommonBenStatusFlowServiceImpl.java b/src/main/java/com/iemr/mmu/service/benFlowStatus/CommonBenStatusFlowServiceImpl.java index 3296e47d..0fb6544f 100644 --- a/src/main/java/com/iemr/mmu/service/benFlowStatus/CommonBenStatusFlowServiceImpl.java +++ b/src/main/java/com/iemr/mmu/service/benFlowStatus/CommonBenStatusFlowServiceImpl.java @@ -279,8 +279,8 @@ public int updateBenFlowAfterDocData(Long benFlowID, Long benRegID, Long benID, } public int updateBenFlowAfterDocDataUpdate(Long benFlowID, Long benRegID, Long benID, Long benVisitID, - short docFlag, short pharmaFlag, short oncologistFlag, short tcSpecialistFlag, int tcUserID, - Timestamp tcDate) throws Exception { + short docFlag, short pharmaFlag, short oncologistFlag, short tcSpecialistFlag, + int tcUserID, Timestamp tcDate, Boolean signatureFlag) throws Exception { int i = 0; try { Short pharmaF = beneficiaryFlowStatusRepo.getPharmaFlag(benFlowID); @@ -291,8 +291,8 @@ public int updateBenFlowAfterDocDataUpdate(Long benFlowID, Long benRegID, Long b else pharmaF1 = pharmaFlag; - i = beneficiaryFlowStatusRepo.updateBenFlowStatusAfterDoctorActivity(benFlowID, benRegID, benID, docFlag, - pharmaF1, oncologistFlag, tcSpecialistFlag, tcUserID, tcDate, false); + i = beneficiaryFlowStatusRepo.updateBenFlowStatusAfterDoctorActivity(benFlowID, benRegID, benID, + docFlag, pharmaF1, oncologistFlag, tcSpecialistFlag, tcUserID, tcDate, signatureFlag); } catch (Exception e) { logger.error("Error in ben flow creation = " + e); throw new Exception(e); @@ -302,7 +302,7 @@ public int updateBenFlowAfterDocDataUpdate(Long benFlowID, Long benRegID, Long b public int updateBenFlowAfterDocDataUpdateWDF(Long benFlowID, Long benRegID, Long benID, Long benVisitID, short docFlag, short pharmaFlag, short oncologistFlag, int tcUserID, - Timestamp tcDate) throws Exception { + Timestamp tcDate, Boolean signatureFlag) throws Exception { int i = 0; try { Short pharmaF = beneficiaryFlowStatusRepo.getPharmaFlag(benFlowID); @@ -313,8 +313,8 @@ public int updateBenFlowAfterDocDataUpdateWDF(Long benFlowID, Long benRegID, Lon else pharmaF1 = pharmaFlag; - i = beneficiaryFlowStatusRepo.updateBenFlowStatusAfterDoctorActivityWDF(benFlowID, benRegID, benID, docFlag, - pharmaF1, oncologistFlag, tcUserID, tcDate); + i = beneficiaryFlowStatusRepo.updateBenFlowStatusAfterDoctorActivityWDF(benFlowID, benRegID, benID, + docFlag, pharmaF1, oncologistFlag, tcUserID, tcDate, signatureFlag); } catch (Exception e) { logger.error("Error in ben flow creation = " + e); throw new Exception(e); @@ -323,8 +323,8 @@ public int updateBenFlowAfterDocDataUpdateWDF(Long benFlowID, Long benRegID, Lon } public int updateBenFlowAfterDocDataUpdateTCSpecialist(Long benFlowID, Long benRegID, Long benID, Long benVisitID, - short docFlag, short pharmaFlag, short oncologistFlag, short tcSpecialistFlag, int tcUserID, - Timestamp tcDate) throws Exception { + short docFlag, short pharmaFlag, short oncologistFlag, short tcSpecialistFlag, + int tcUserID, Timestamp tcDate, Boolean signatureFlag) throws Exception { int i = 0; try { Short pharmaF = beneficiaryFlowStatusRepo.getPharmaFlag(benFlowID); @@ -336,7 +336,7 @@ public int updateBenFlowAfterDocDataUpdateTCSpecialist(Long benFlowID, Long benR pharmaF1 = pharmaFlag; i = beneficiaryFlowStatusRepo.updateBenFlowStatusAfterDoctorActivityTCSpecialist(benFlowID, benRegID, benID, - pharmaF1, oncologistFlag, tcSpecialistFlag); + pharmaF1, oncologistFlag, tcSpecialistFlag, signatureFlag); } catch (Exception e) { logger.error("Error in ben flow creation = " + e); throw new Exception(e); diff --git a/src/main/java/com/iemr/mmu/service/common/transaction/CommonDoctorServiceImpl.java b/src/main/java/com/iemr/mmu/service/common/transaction/CommonDoctorServiceImpl.java index f7e8839d..153b7fa0 100644 --- a/src/main/java/com/iemr/mmu/service/common/transaction/CommonDoctorServiceImpl.java +++ b/src/main/java/com/iemr/mmu/service/common/transaction/CommonDoctorServiceImpl.java @@ -825,8 +825,10 @@ public int updateBenFlowtableAfterDocDataSave(CommonUtilityClass commonUtilityCl * @param isMedicinePrescribed * @return */ - public int updateBenFlowtableAfterDocDataUpdate(CommonUtilityClass commonUtilityClass, Boolean isTestPrescribed, - Boolean isMedicinePrescribed, TeleconsultationRequestOBJ tcRequestOBJ) throws Exception { + public int updateBenFlowtableAfterDocDataUpdate(CommonUtilityClass commonUtilityClass, + Boolean isTestPrescribed, Boolean isMedicinePrescribed, + TeleconsultationRequestOBJ tcRequestOBJ, Boolean doctorSignatureFlag) throws Exception { + int i = 0; short pharmaFalg; short docFlag = (short) 0; @@ -852,7 +854,7 @@ public int updateBenFlowtableAfterDocDataUpdate(CommonUtilityClass commonUtility i = commonBenStatusFlowServiceImpl.updateBenFlowAfterDocDataUpdateTCSpecialist(tmpBenFlowID, tmpbeneficiaryRegID, tmpBeneficiaryID, tmpBenVisitID, docFlag, pharmaFalg, (short) 0, - tcSpecialistFlag, tcUserID, tcDate); + tcSpecialistFlag, tcUserID, tcDate, doctorSignatureFlag); } else { if (isTestPrescribed) @@ -880,13 +882,13 @@ public int updateBenFlowtableAfterDocDataUpdate(CommonUtilityClass commonUtility tcSpecialistFlag = (short) 100; i = commonBenStatusFlowServiceImpl.updateBenFlowAfterDocDataUpdate(tmpBenFlowID, tmpbeneficiaryRegID, tmpBeneficiaryID, tmpBenVisitID, docFlag, pharmaFalg, (short) 0, tcSpecialistFlag, tcUserID, - tcDate); + tcDate, doctorSignatureFlag); } else i = commonBenStatusFlowServiceImpl.updateBenFlowAfterDocDataUpdateWDF(tmpBenFlowID, tmpbeneficiaryRegID, tmpBeneficiaryID, tmpBenVisitID, docFlag, pharmaFalg, (short) 0, tcUserID, - tcDate); + tcDate, doctorSignatureFlag); } diff --git a/src/main/java/com/iemr/mmu/service/covid19/Covid19ServiceImpl.java b/src/main/java/com/iemr/mmu/service/covid19/Covid19ServiceImpl.java index d4ff81a0..c2868e44 100644 --- a/src/main/java/com/iemr/mmu/service/covid19/Covid19ServiceImpl.java +++ b/src/main/java/com/iemr/mmu/service/covid19/Covid19ServiceImpl.java @@ -839,6 +839,11 @@ public Long updateCovid19DoctorData(JsonObject requestOBJ, String Authorization) Integer prescriptionSuccessFlag = null; Long referSaveSuccessFlag = null; + Boolean doctorSignatureFlag = false; + if (requestOBJ.has("doctorSignatureFlag") && !requestOBJ.get("doctorSignatureFlag").isJsonNull()) { + doctorSignatureFlag = requestOBJ.get("doctorSignatureFlag").getAsBoolean(); + } + if (requestOBJ != null) { TeleconsultationRequestOBJ tcRequestOBJ = null; // TcSpecialistSlotBookingRequestOBJ tcSpecialistSlotBookingRequestOBJ = null; @@ -962,7 +967,7 @@ public Long updateCovid19DoctorData(JsonObject requestOBJ, String Authorization) // call method to update beneficiary flow table int i = commonDoctorServiceImpl.updateBenFlowtableAfterDocDataUpdate(commonUtilityClass, - isTestPrescribed, isMedicinePrescribed, tcRequestOBJ); + isTestPrescribed, isMedicinePrescribed, tcRequestOBJ, doctorSignatureFlag); if (i > 0) updateSuccessFlag = investigationSuccessFlag; diff --git a/src/main/java/com/iemr/mmu/service/generalOPD/GeneralOPDServiceImpl.java b/src/main/java/com/iemr/mmu/service/generalOPD/GeneralOPDServiceImpl.java index bac2f8ed..aa75eb58 100644 --- a/src/main/java/com/iemr/mmu/service/generalOPD/GeneralOPDServiceImpl.java +++ b/src/main/java/com/iemr/mmu/service/generalOPD/GeneralOPDServiceImpl.java @@ -1426,6 +1426,10 @@ public Long updateGeneralOPDDoctorData(JsonObject requestOBJ, String Authorizati Integer prescriptionSuccessFlag = null; Long referSaveSuccessFlag = null; Integer tcRequestStatusFlag = null; + Boolean doctorSignatureFlag = false; + if (requestOBJ.has("doctorSignatureFlag") && !requestOBJ.get("doctorSignatureFlag").isJsonNull()) { + doctorSignatureFlag = requestOBJ.get("doctorSignatureFlag").getAsBoolean(); + } if (requestOBJ != null) { TeleconsultationRequestOBJ tcRequestOBJ = null; @@ -1584,7 +1588,7 @@ public Long updateGeneralOPDDoctorData(JsonObject requestOBJ, String Authorizati // call method to update beneficiary flow table int i = commonDoctorServiceImpl.updateBenFlowtableAfterDocDataUpdate(commonUtilityClass, - isTestPrescribed, isMedicinePrescribed, tcRequestOBJ); + isTestPrescribed, isMedicinePrescribed, tcRequestOBJ, doctorSignatureFlag); if (i > 0) { updateSuccessFlag = investigationSuccessFlag; diff --git a/src/main/java/com/iemr/mmu/service/ncdCare/NCDCareServiceImpl.java b/src/main/java/com/iemr/mmu/service/ncdCare/NCDCareServiceImpl.java index db55e967..aed7f4ea 100644 --- a/src/main/java/com/iemr/mmu/service/ncdCare/NCDCareServiceImpl.java +++ b/src/main/java/com/iemr/mmu/service/ncdCare/NCDCareServiceImpl.java @@ -1146,6 +1146,11 @@ public Long updateNCDCareDoctorData(JsonObject requestOBJ, String Authorization) Long referSaveSuccessFlag = null; Integer tcRequestStatusFlag = null; + Boolean doctorSignatureFlag = false; + if (requestOBJ.has("doctorSignatureFlag") && !requestOBJ.get("doctorSignatureFlag").isJsonNull()) { + doctorSignatureFlag = requestOBJ.get("doctorSignatureFlag").getAsBoolean(); + } + if (requestOBJ != null) { TeleconsultationRequestOBJ tcRequestOBJ = null; TcSpecialistSlotBookingRequestOBJ tcSpecialistSlotBookingRequestOBJ = null; @@ -1295,7 +1300,7 @@ public Long updateNCDCareDoctorData(JsonObject requestOBJ, String Authorization) // call method to update beneficiary flow table int i = commonDoctorServiceImpl.updateBenFlowtableAfterDocDataUpdate(commonUtilityClass, - isTestPrescribed, isMedicinePrescribed, tcRequestOBJ); + isTestPrescribed, isMedicinePrescribed, tcRequestOBJ, doctorSignatureFlag); if (i > 0) { updateSuccessFlag = investigationSuccessFlag; diff --git a/src/main/java/com/iemr/mmu/service/ncdscreening/NCDSCreeningDoctorServiceImpl.java b/src/main/java/com/iemr/mmu/service/ncdscreening/NCDSCreeningDoctorServiceImpl.java index 6e470273..fad48bf5 100644 --- a/src/main/java/com/iemr/mmu/service/ncdscreening/NCDSCreeningDoctorServiceImpl.java +++ b/src/main/java/com/iemr/mmu/service/ncdscreening/NCDSCreeningDoctorServiceImpl.java @@ -76,6 +76,11 @@ public int updateDoctorData(JsonObject requestOBJ) throws Exception { Long referSaveSuccessFlag = null; // Integer tcRequestStatusFlag = null; + Boolean doctorSignatureFlag = false; + if (requestOBJ.has("doctorSignatureFlag") && !requestOBJ.get("doctorSignatureFlag").isJsonNull()) { + doctorSignatureFlag = requestOBJ.get("doctorSignatureFlag").getAsBoolean(); + } + if (requestOBJ != null) { TeleconsultationRequestOBJ tcRequestOBJ = null; // TcSpecialistSlotBookingRequestOBJ tcSpecialistSlotBookingRequestOBJ = null; @@ -240,7 +245,7 @@ public int updateDoctorData(JsonObject requestOBJ) throws Exception { // call method to update beneficiary flow table int i = commonDoctorServiceImpl.updateBenFlowtableAfterDocDataUpdate(commonUtilityClass, - isTestPrescribed, isMedicinePrescribed, tcRequestOBJ); + isTestPrescribed, isMedicinePrescribed, tcRequestOBJ, doctorSignatureFlag); if (i > 0) { updateSuccessFlag = 1; diff --git a/src/main/java/com/iemr/mmu/service/pnc/PNCServiceImpl.java b/src/main/java/com/iemr/mmu/service/pnc/PNCServiceImpl.java index e1eee098..473151b5 100644 --- a/src/main/java/com/iemr/mmu/service/pnc/PNCServiceImpl.java +++ b/src/main/java/com/iemr/mmu/service/pnc/PNCServiceImpl.java @@ -1432,6 +1432,11 @@ public Long updatePNCDoctorData(JsonObject requestOBJ, String Authorization) thr Long referSaveSuccessFlag = null; Integer tcRequestStatusFlag = null; + Boolean doctorSignatureFlag = false; + if (requestOBJ.has("doctorSignatureFlag") && !requestOBJ.get("doctorSignatureFlag").isJsonNull()) { + doctorSignatureFlag = requestOBJ.get("doctorSignatureFlag").getAsBoolean(); + } + if (requestOBJ != null) { TeleconsultationRequestOBJ tcRequestOBJ = null; TcSpecialistSlotBookingRequestOBJ tcSpecialistSlotBookingRequestOBJ = null; @@ -1580,7 +1585,7 @@ public Long updatePNCDoctorData(JsonObject requestOBJ, String Authorization) thr // call method to update beneficiary flow table int i = commonDoctorServiceImpl.updateBenFlowtableAfterDocDataUpdate(commonUtilityClass, - isTestPrescribed, isMedicinePrescribed, tcRequestOBJ); + isTestPrescribed, isMedicinePrescribed, tcRequestOBJ, doctorSignatureFlag); if (i > 0) { updateSuccessFlag = investigationSuccessFlag; diff --git a/src/main/java/com/iemr/mmu/service/quickConsultation/QuickConsultationServiceImpl.java b/src/main/java/com/iemr/mmu/service/quickConsultation/QuickConsultationServiceImpl.java index fc171805..7cf4801f 100644 --- a/src/main/java/com/iemr/mmu/service/quickConsultation/QuickConsultationServiceImpl.java +++ b/src/main/java/com/iemr/mmu/service/quickConsultation/QuickConsultationServiceImpl.java @@ -572,6 +572,12 @@ public Long updateGeneralOPDQCDoctorData(JsonObject quickConsultDoctorOBJ, Strin Long referupdateSuccessFlag = null; Integer tcRequestStatusFlag = null; + Boolean doctorSignatureFlag = false; + if (quickConsultDoctorOBJ.has("doctorSignatureFlag") + && !quickConsultDoctorOBJ.get("doctorSignatureFlag").isJsonNull()) { + doctorSignatureFlag = quickConsultDoctorOBJ.get("doctorSignatureFlag").getAsBoolean(); + } + TeleconsultationRequestOBJ tcRequestOBJ = null; TcSpecialistSlotBookingRequestOBJ tcSpecialistSlotBookingRequestOBJ = null; CommonUtilityClass commonUtilityClass = InputMapper.gson().fromJson(quickConsultDoctorOBJ, @@ -711,7 +717,7 @@ public Long updateGeneralOPDQCDoctorData(JsonObject quickConsultDoctorOBJ, Strin // call method to update beneficiary flow table int i = commonDoctorServiceImpl.updateBenFlowtableAfterDocDataUpdate(commonUtilityClass, isTestPrescribed, - isMedicinePrescribed, tcRequestOBJ); + isMedicinePrescribed, tcRequestOBJ, doctorSignatureFlag); if (i > 0) { updateSuccessFlag = benChiefComplaintID; From 0fd1bb54c843fb00d95ec804049af3e8991f9495 Mon Sep 17 00:00:00 2001 From: SnehaRH Date: Fri, 31 Oct 2025 13:25:09 +0530 Subject: [PATCH 40/47] fix: amm-1919 fix for update doctor data for higher refferal data --- .../transaction/CommonDoctorServiceImpl.java | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/iemr/mmu/service/common/transaction/CommonDoctorServiceImpl.java b/src/main/java/com/iemr/mmu/service/common/transaction/CommonDoctorServiceImpl.java index e986e374..328ca21d 100644 --- a/src/main/java/com/iemr/mmu/service/common/transaction/CommonDoctorServiceImpl.java +++ b/src/main/java/com/iemr/mmu/service/common/transaction/CommonDoctorServiceImpl.java @@ -721,26 +721,25 @@ public Long updateBenReferDetails(JsonObject referObj) throws IEMRException { if (sm.getServiceName().equalsIgnoreCase(tmReferCheckValue)) { TMReferred = 1; - } - else - { + } else { TMReferred = 0; } - + if (referDetails.getRevisitDate() != null) referDetailsTemp.setRevisitDate(referDetails.getRevisitDate()); - + if (referDetails.getReferralReason() != null) referDetailsTemp.setReferralReason(referDetails.getReferralReason()); referDetailsList.add(referDetailsTemp); } } - } /* - * else { if (referDetails.getReferredToInstituteName() != null || - * referDetails.getRevisitDate() != null || referDetails.getReferralReason() != - * null) referDetailsList.add(referDetails); TMReferred = 0; } - */ + } else { + if (referDetails.getReferredToInstituteName() != null || referDetails.getRevisitDate() != null + || referDetails.getReferralReason() != null) + referDetailsList.add(referDetails); + TMReferred = 0; + } ArrayList res = (ArrayList) benReferDetailsRepo.saveAll(referDetailsList); if (referDetailsList.size() == res.size()) { From 95475bda723f3c596df32820935006090b1814ac Mon Sep 17 00:00:00 2001 From: Vanitha S <116701245+vanitha1822@users.noreply.github.com> Date: Tue, 4 Nov 2025 16:17:12 +0530 Subject: [PATCH 41/47] fix: created date updation issue (#136) --- .../mmu/service/dataSyncActivity/DataSyncRepository.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/iemr/mmu/service/dataSyncActivity/DataSyncRepository.java b/src/main/java/com/iemr/mmu/service/dataSyncActivity/DataSyncRepository.java index bc927104..dc36c7c1 100644 --- a/src/main/java/com/iemr/mmu/service/dataSyncActivity/DataSyncRepository.java +++ b/src/main/java/com/iemr/mmu/service/dataSyncActivity/DataSyncRepository.java @@ -107,16 +107,16 @@ public int updateProcessedFlagInVan(String schemaName, String tableName, List Date: Mon, 17 Nov 2025 17:54:16 +0530 Subject: [PATCH 42/47] fix: amm-1927 http methods shown as options issue fix --- .../mmu/utils/JwtUserIdValidationFilter.java | 72 ++++++++++++++----- .../iemr/mmu/utils/http/HttpInterceptor.java | 30 +++++++- 2 files changed, 83 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/iemr/mmu/utils/JwtUserIdValidationFilter.java b/src/main/java/com/iemr/mmu/utils/JwtUserIdValidationFilter.java index fbeab7ad..550eedf1 100644 --- a/src/main/java/com/iemr/mmu/utils/JwtUserIdValidationFilter.java +++ b/src/main/java/com/iemr/mmu/utils/JwtUserIdValidationFilter.java @@ -5,7 +5,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; import com.iemr.mmu.utils.http.AuthorizationHeaderRequestWrapper; @@ -37,26 +36,56 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo HttpServletResponse response = (HttpServletResponse) servletResponse; String origin = request.getHeader("Origin"); - - if (origin != null && isOriginAllowed(origin)) { - response.setHeader("Access-Control-Allow-Origin", origin); - response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS"); - response.setHeader("Access-Control-Allow-Headers", "Authorization, Content-Type, Accept, Jwttoken,serverAuthorization, ServerAuthorization, serverauthorization, Serverauthorization"); - response.setHeader("Vary", "Origin"); - response.setHeader("Access-Control-Allow-Credentials", "true"); + String method = request.getMethod(); + String uri = request.getRequestURI(); + + logger.debug("Incoming Origin: {}", origin); + logger.debug("Request Method: {}", method); + logger.debug("Request URI: {}", uri); + logger.debug("Allowed Origins Configured: {}", allowedOrigins); + + if ("OPTIONS".equalsIgnoreCase(method)) { + if (origin == null) { + logger.warn("BLOCKED - OPTIONS request without Origin header | Method: {} | URI: {}", method, uri); + response.sendError(HttpServletResponse.SC_FORBIDDEN, "OPTIONS request requires Origin header"); + return; + } + if (!isOriginAllowed(origin)) { + logger.warn("BLOCKED - Unauthorized Origin | Origin: {} | Method: {} | URI: {}", origin, method, uri); + response.sendError(HttpServletResponse.SC_FORBIDDEN, "Origin not allowed"); + return; + } } else { - logger.warn("Origin [{}] is NOT allowed. CORS headers NOT added.", origin); - } - - if ("OPTIONS".equalsIgnoreCase(request.getMethod())) { - logger.info("OPTIONS request - skipping JWT validation"); - response.setStatus(HttpServletResponse.SC_OK); - return; + // For non-OPTIONS requests, validate origin if present + if (origin != null && !isOriginAllowed(origin)) { + logger.warn("BLOCKED - Unauthorized Origin | Origin: {} | Method: {} | URI: {}", origin, method, uri); + response.sendError(HttpServletResponse.SC_FORBIDDEN, "Origin not allowed"); + return; + } } String path = request.getRequestURI(); String contextPath = request.getContextPath(); + // Set CORS headers and handle OPTIONS request only if origin is valid and + // allowed + if (origin != null && isOriginAllowed(origin)) { + addCorsHeaders(response, origin); + logger.info("Origin Validated | Origin: {} | Method: {} | URI: {}", origin, method, uri); + + if ("OPTIONS".equalsIgnoreCase(method)) { + // OPTIONS (preflight) - respond with full allowed methods + response.setStatus(HttpServletResponse.SC_OK); + return; + } + } else { + logger.warn("Origin [{}] is NOT allowed. CORS headers NOT added.", origin); + + if ("OPTIONS".equalsIgnoreCase(method)) { + response.sendError(HttpServletResponse.SC_FORBIDDEN, "Origin not allowed for OPTIONS request"); + return; + } + } // Log cookies for debugging Cookie[] cookies = request.getCookies(); if (cookies != null) { @@ -126,6 +155,15 @@ public void doFilter(ServletRequest servletRequest, ServletResponse servletRespo response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Authorization error: " + e.getMessage()); } } + + private void addCorsHeaders(HttpServletResponse response, String origin) { + response.setHeader("Access-Control-Allow-Origin", origin); // Never use wildcard + response.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, PATCH, DELETE, OPTIONS"); + response.setHeader("Access-Control-Allow-Headers", + "Authorization, Content-Type, Accept, Jwttoken, serverAuthorization, ServerAuthorization, serverauthorization, Serverauthorization"); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Max-Age", "3600"); + } private boolean isOriginAllowed(String origin) { if (origin == null || allowedOrigins == null || allowedOrigins.trim().isEmpty()) { @@ -138,9 +176,7 @@ private boolean isOriginAllowed(String origin) { .anyMatch(pattern -> { String regex = pattern .replace(".", "\\.") - .replace("*", ".*") - .replace("http://localhost:.*", "http://localhost:\\d+"); // special case for wildcard port - + .replace("*", ".*"); boolean matched = origin.matches(regex); return matched; }); diff --git a/src/main/java/com/iemr/mmu/utils/http/HttpInterceptor.java b/src/main/java/com/iemr/mmu/utils/http/HttpInterceptor.java index 9a5adeba..d2cafba9 100644 --- a/src/main/java/com/iemr/mmu/utils/http/HttpInterceptor.java +++ b/src/main/java/com/iemr/mmu/utils/http/HttpInterceptor.java @@ -21,11 +21,14 @@ */ package com.iemr.mmu.utils.http; +import java.util.Arrays; + import javax.ws.rs.core.MediaType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; @@ -43,6 +46,9 @@ public class HttpInterceptor implements HandlerInterceptor { Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName()); + @Value("${cors.allowed-origins}") + private String allowedOrigins; + @Autowired public void setValidator(Validator validator) { this.validator = validator; @@ -111,7 +117,14 @@ public boolean preHandle(HttpServletRequest request, HttpServletResponse respons response.setContentType(MediaType.APPLICATION_JSON); response.setContentLength(output.toString().length()); - response.setHeader("Access-Control-Allow-Origin", "*"); + + String origin = request.getHeader("Origin"); + if (origin != null && isOriginAllowed(origin)) { + response.setHeader("Access-Control-Allow-Origin", origin); + response.setHeader("Access-Control-Allow-Credentials", "true"); + } else if (origin != null) { + logger.warn("CORS headers NOT added for error response | Unauthorized origin: {}", origin); + } response.getOutputStream().print(output.toString()); status = false; @@ -141,4 +154,19 @@ public void afterCompletion(HttpServletRequest request, HttpServletResponse resp logger.debug("In afterCompletion Request Completed"); } + private boolean isOriginAllowed(String origin) { + if (origin == null || allowedOrigins == null || allowedOrigins.trim().isEmpty()) { + return false; + } + + return Arrays.stream(allowedOrigins.split(",")) + .map(String::trim) + .anyMatch(pattern -> { + String regex = pattern + .replace(".", "\\.") + .replace("*", ".*"); + return origin.matches(regex); + }); + } + } From af8cbb18867f2c61b8c657066af74e12f6b41dc0 Mon Sep 17 00:00:00 2001 From: Amoghavarsh <93114621+5Amogh@users.noreply.github.com> Date: Tue, 18 Nov 2025 10:56:31 +0530 Subject: [PATCH 43/47] Update regex handling for localhost in HttpInterceptor --- src/main/java/com/iemr/mmu/utils/http/HttpInterceptor.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/iemr/mmu/utils/http/HttpInterceptor.java b/src/main/java/com/iemr/mmu/utils/http/HttpInterceptor.java index d2cafba9..2eb39c9a 100644 --- a/src/main/java/com/iemr/mmu/utils/http/HttpInterceptor.java +++ b/src/main/java/com/iemr/mmu/utils/http/HttpInterceptor.java @@ -164,7 +164,8 @@ private boolean isOriginAllowed(String origin) { .anyMatch(pattern -> { String regex = pattern .replace(".", "\\.") - .replace("*", ".*"); + .replace("*", ".*") + .replace("http://localhost:.*", "http://localhost:\\d+"); return origin.matches(regex); }); } From 7d283faed8a8ceec8582693aecbee7ce2a0fecda Mon Sep 17 00:00:00 2001 From: Amoghavarsh <93114621+5Amogh@users.noreply.github.com> Date: Tue, 18 Nov 2025 10:57:40 +0530 Subject: [PATCH 44/47] Enhance regex for localhost URL matching --- .../java/com/iemr/mmu/utils/JwtUserIdValidationFilter.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/iemr/mmu/utils/JwtUserIdValidationFilter.java b/src/main/java/com/iemr/mmu/utils/JwtUserIdValidationFilter.java index 550eedf1..4be94681 100644 --- a/src/main/java/com/iemr/mmu/utils/JwtUserIdValidationFilter.java +++ b/src/main/java/com/iemr/mmu/utils/JwtUserIdValidationFilter.java @@ -176,7 +176,8 @@ private boolean isOriginAllowed(String origin) { .anyMatch(pattern -> { String regex = pattern .replace(".", "\\.") - .replace("*", ".*"); + .replace("*", ".*") + .replace("http://localhost:.*", "http://localhost:\\d+"); boolean matched = origin.matches(regex); return matched; }); @@ -210,4 +211,4 @@ private void clearUserIdCookie(HttpServletResponse response) { cookie.setMaxAge(0); // Invalidate the cookie response.addCookie(cookie); } -} \ No newline at end of file +} From db2062944c82b2db18b2f7aff99e0ab515ef9876 Mon Sep 17 00:00:00 2001 From: Vanitha S <116701245+vanitha1822@users.noreply.github.com> Date: Wed, 19 Nov 2025 16:05:14 +0530 Subject: [PATCH 45/47] Fix the WASA Issue : IDOR Vulnerability (#137) * fix: wasa-IDOR Vulnerability * fix: coderabbit comments * fix: remove userid from payload --- pom.xml | 2 +- .../common/main/CommonController.java | 34 ++++++++++++++---- .../location/LocationController.java | 22 ++++++++---- .../login/IemrMmuLoginController.java | 36 +++++++++++++++---- .../TeleConsultationController.java | 15 ++++++-- src/main/java/com/iemr/mmu/utils/JwtUtil.java | 9 +++++ 6 files changed, 95 insertions(+), 23 deletions(-) diff --git a/pom.xml b/pom.xml index b0e8639c..5fac3076 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ 4.0.0 com.iemr.mmu mmu-api - 3.4.0 + 3.6.1 war MMU-API diff --git a/src/main/java/com/iemr/mmu/controller/common/main/CommonController.java b/src/main/java/com/iemr/mmu/controller/common/main/CommonController.java index 137e4455..d05c4655 100644 --- a/src/main/java/com/iemr/mmu/controller/common/main/CommonController.java +++ b/src/main/java/com/iemr/mmu/controller/common/main/CommonController.java @@ -40,6 +40,7 @@ import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import com.iemr.mmu.utils.JwtUtil; import com.iemr.mmu.data.benFlowStatus.BeneficiaryFlowStatus; import com.iemr.mmu.service.common.transaction.CommonDoctorServiceImpl; @@ -50,6 +51,7 @@ import com.iemr.mmu.utils.exception.IEMRException; import com.iemr.mmu.utils.mapper.InputMapper; import com.iemr.mmu.utils.response.OutputResponse; +import com.iemr.mmu.utils.CookieUtil; import io.swagger.annotations.ApiParam; import io.swagger.v3.oas.annotations.Operation; @@ -68,6 +70,9 @@ public class CommonController { @Autowired private ServletContext servletContext; + @Autowired + private JwtUtil jwtUtil; + @Autowired private AESEncryptionDecryption aESEncryptionDecryption; @@ -659,12 +664,20 @@ public String getBeneficiaryCaseSheetHistory( } @Operation(summary = "TC specialist") - @GetMapping(value = { "/getTCSpecialistWorklist/{providerServiceMapID}/{serviceID}/{userID}" }) + @GetMapping(value = { "/getTCSpecialistWorklist/{providerServiceMapID}/{serviceID}" }) public String getTCSpecialistWorkListNew(@PathVariable("providerServiceMapID") Integer providerServiceMapID, - @PathVariable("userID") Integer userID, @PathVariable("serviceID") Integer serviceID) { + @PathVariable("serviceID") Integer serviceID,HttpServletRequest request) { OutputResponse response = new OutputResponse(); try { - if (providerServiceMapID != null && userID != null) { + + String jwtToken = CookieUtil.getJwtTokenFromCookie(request); + String userId = jwtUtil.getUserIdFromToken(jwtToken); + int userID = Integer.parseInt(userId); + if(jwtToken == null || userId == null) { + response.setError(403, "Unauthorized access: Missing or invalid token"); + } + + if (providerServiceMapID != null && userId != null) { String s = commonDoctorServiceImpl.getTCSpecialistWorkListNewForTM(providerServiceMapID, userID, serviceID); if (s != null) @@ -684,13 +697,20 @@ public String getTCSpecialistWorkListNew(@PathVariable("providerServiceMapID") I @Operation(summary = "TC specialist future scheduled") @GetMapping(value = { - "/getTCSpecialistWorklistFutureScheduled/{providerServiceMapID}/{serviceID}/{userID}" }) + "/getTCSpecialistWorklistFutureScheduled/{providerServiceMapID}/{serviceID}" }) public String getTCSpecialistWorklistFutureScheduled( - @PathVariable("providerServiceMapID") Integer providerServiceMapID, @PathVariable("userID") Integer userID, - @PathVariable("serviceID") Integer serviceID) { + @PathVariable("providerServiceMapID") Integer providerServiceMapID, + @PathVariable("serviceID") Integer serviceID, HttpServletRequest request) { OutputResponse response = new OutputResponse(); try { - if (providerServiceMapID != null && userID != null) { + String jwtToken = CookieUtil.getJwtTokenFromCookie(request); + String userId = jwtUtil.getUserIdFromToken(jwtToken); + int userID = Integer.parseInt(userId); + + if(jwtToken == null || userId == null) { + response.setError(403, "Unauthorized access: Missing or invalid token"); + } + if (providerServiceMapID != null && userId != null) { String s = commonDoctorServiceImpl.getTCSpecialistWorkListNewFutureScheduledForTM(providerServiceMapID, userID, serviceID); if (s != null) diff --git a/src/main/java/com/iemr/mmu/controller/location/LocationController.java b/src/main/java/com/iemr/mmu/controller/location/LocationController.java index 71e90724..6559182b 100644 --- a/src/main/java/com/iemr/mmu/controller/location/LocationController.java +++ b/src/main/java/com/iemr/mmu/controller/location/LocationController.java @@ -25,6 +25,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import com.iemr.mmu.utils.JwtUtil; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -33,6 +34,8 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; +import jakarta.servlet.http.HttpServletRequest; +import com.iemr.mmu.utils.CookieUtil; import com.iemr.mmu.controller.common.master.CommonMasterController; import com.iemr.mmu.service.location.LocationServiceImpl; @@ -48,6 +51,9 @@ public class LocationController { private LocationServiceImpl locationServiceImpl; + @Autowired + private JwtUtil jwtUtil; + @Autowired public void setLocationServiceImpl(LocationServiceImpl locationServiceImpl) { this.locationServiceImpl = locationServiceImpl; @@ -137,22 +143,26 @@ public String getVillageMaster(@PathVariable("blockID") Integer blockID) { @Operation(summary = "Get location details based on SP id and PSM id") @PostMapping(value = "/getLocDetailsBasedOnSpIDAndPsmID", consumes = "application/json", produces = "application/json") - public String getLocDetailsBasedOnSpIDAndPsmIDNew(@RequestBody String comingRequest) { + public String getLocDetailsBasedOnSpIDAndPsmIDNew(@RequestBody String comingRequest, HttpServletRequest request) { OutputResponse response = new OutputResponse(); try { JSONObject obj = new JSONObject(comingRequest); + String jwtToken = CookieUtil.getJwtTokenFromCookie(request); + String userId = jwtUtil.getUserIdFromToken(jwtToken); + if(userId != null) { + int userID = Integer.parseInt(userId); if (obj != null && obj.has("spID") && obj.has("spPSMID") && obj.get("spID") != null && obj.get("spPSMID") != null) { - Integer userId = null; - if (obj.has("userId") && null != obj.get("userId")) { - userId = Integer.valueOf(obj.get("userId").toString()); - } - String s = locationServiceImpl.getLocDetailsNew(obj.getInt("spID"), obj.getInt("spPSMID"), userId); + + String s = locationServiceImpl.getLocDetailsNew(obj.getInt("spID"), obj.getInt("spPSMID"), userID); response.setResponse(s); } else { response.setError(5000, "Invalid request"); } + } else { + response.setError(403, "Unauthorized access"); + } } catch (Exception e) { logger.error(e.getMessage()); response.setError(5000, "Error while getting location data"); diff --git a/src/main/java/com/iemr/mmu/controller/login/IemrMmuLoginController.java b/src/main/java/com/iemr/mmu/controller/login/IemrMmuLoginController.java index 08942297..a3fe4869 100644 --- a/src/main/java/com/iemr/mmu/controller/login/IemrMmuLoginController.java +++ b/src/main/java/com/iemr/mmu/controller/login/IemrMmuLoginController.java @@ -33,9 +33,13 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; +import com.iemr.mmu.utils.CookieUtil; + +import jakarta.servlet.http.HttpServletRequest; import com.iemr.mmu.controller.registrar.main.RegistrarController; import com.iemr.mmu.service.login.IemrMmuLoginServiceImpl; +import com.iemr.mmu.utils.JwtUtil; import com.iemr.mmu.utils.mapper.InputMapper; import com.iemr.mmu.utils.response.OutputResponse; @@ -50,6 +54,9 @@ public class IemrMmuLoginController { private IemrMmuLoginServiceImpl iemrMmuLoginServiceImpl; + @Autowired + private JwtUtil jwtUtil; + @Autowired public void setIemrMmuLoginServiceImpl(IemrMmuLoginServiceImpl iemrMmuLoginServiceImpl) { this.iemrMmuLoginServiceImpl = iemrMmuLoginServiceImpl; @@ -57,14 +64,23 @@ public void setIemrMmuLoginServiceImpl(IemrMmuLoginServiceImpl iemrMmuLoginServi @Operation(summary = "Get user service point van details") @GetMapping(value = "/getUserServicePointVanDetails", consumes = "application/json", produces = "application/json") - public String getUserServicePointVanDetails(@RequestBody String comingRequest) { + public String getUserServicePointVanDetails(@RequestBody String comingRequest, HttpServletRequest request) { OutputResponse response = new OutputResponse(); try { + String jwtToken = CookieUtil.getJwtTokenFromCookie(request); + String userId = jwtUtil.getUserIdFromToken(jwtToken); JSONObject obj = new JSONObject(comingRequest); logger.info("getUserServicePointVanDetails request " + comingRequest); - String responseData = iemrMmuLoginServiceImpl.getUserServicePointVanDetails(obj.getInt("userID")); + if(userId != null ) { + String responseData = iemrMmuLoginServiceImpl.getUserServicePointVanDetails(Integer.parseInt(userId)); response.setResponse(responseData); + } + else { + response.setError(403, "Unauthorized access: Missing or invalid token"); + return response.toString(); + } + } catch (Exception e) { response.setError(5000, "Error while getting service points and van data"); logger.error("get User SP and van details failed with " + e.getMessage(), e); @@ -95,19 +111,27 @@ public String getServicepointVillages(@RequestBody String comingRequest) { @Operation(summary = "Get user van details") @PostMapping(value = "/getUserVanSpDetails", consumes = "application/json", produces = "application/json") - public String getUserVanSpDetails(@RequestBody String comingRequest) { + public String getUserVanSpDetails(@RequestBody String comingRequest, HttpServletRequest request) { OutputResponse response = new OutputResponse(); + try { JSONObject obj = new JSONObject(comingRequest); + String jwtToken = CookieUtil.getJwtTokenFromCookie(request); + String userId = jwtUtil.getUserIdFromToken(jwtToken); + int userID = Integer.parseInt(userId); logger.info("getServicepointVillages request " + comingRequest); - if (obj.has("userID") && obj.has("providerServiceMapID")) { - String responseData = iemrMmuLoginServiceImpl.getUserVanSpDetails(obj.getInt("userID"), + if (userId != null && obj.has("providerServiceMapID")) { + String responseData = iemrMmuLoginServiceImpl.getUserVanSpDetails(userID, obj.getInt("providerServiceMapID")); response.setResponse(responseData); + } else if (userId == null || jwtToken == null) { + response.setError(403, "Unauthorized access: Missing or invalid token"); } else { response.setError(5000, "Invalid request"); } + + } catch (Exception e) { response.setError(5000, "Error while getting van and service points data"); logger.error("getUserVanSpDetails failed with " + e.getMessage(), e); @@ -129,7 +153,7 @@ public String getVanMaster(@PathVariable("psmID") Integer psmID) { } catch (Exception e) { logger.info("Error occurred while fetching van master is : " + e); response.setError(5000, "Error occurred while fetching van master is : " + e); - ; + } return response.toString(); } diff --git a/src/main/java/com/iemr/mmu/controller/teleconsultation/TeleConsultationController.java b/src/main/java/com/iemr/mmu/controller/teleconsultation/TeleConsultationController.java index d85158b5..5a5eea00 100644 --- a/src/main/java/com/iemr/mmu/controller/teleconsultation/TeleConsultationController.java +++ b/src/main/java/com/iemr/mmu/controller/teleconsultation/TeleConsultationController.java @@ -24,6 +24,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import com.iemr.mmu.utils.JwtUtil; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -48,6 +49,9 @@ public class TeleConsultationController { @Autowired private TeleConsultationServiceImpl teleConsultationServiceImpl; + + @Autowired + private JwtUtil jwtUtil; @Operation(summary = "Update beneficiary arrival status based on request") @PostMapping(value = { "/update/benArrivalStatus" }) @@ -137,14 +141,19 @@ public String createTCRequestForBeneficiary(@RequestBody String requestOBJ, @Req @Operation(summary = "Get TC request list for a specialist") @PostMapping(value = { "/getTCRequestList" }) - public String getTCSpecialistWorkListNew(@RequestBody String requestOBJ) { + public String getTCSpecialistWorkListNew(@RequestBody String requestOBJ, HttpServletRequest request) { OutputResponse response = new OutputResponse(); try { + String jwtToken = CookieUtil.getJwtTokenFromCookie(request); + String userId = jwtUtil.getUserIdFromToken(jwtToken); if (requestOBJ != null) { JsonObject jsnOBJ = parseJsonRequest(requestOBJ); - + if(userId == null) { + response.setError(403, "Unauthorized access: Missing or invalid token"); + return response.toString(); + } String s = teleConsultationServiceImpl.getTCRequestListBySpecialistIdAndDate( - jsnOBJ.get("psmID").getAsInt(), jsnOBJ.get("userID").getAsInt(), + jsnOBJ.get("psmID").getAsInt(), Integer.parseInt(userId), jsnOBJ.get("date").getAsString()); if (s != null) response.setResponse(s); diff --git a/src/main/java/com/iemr/mmu/utils/JwtUtil.java b/src/main/java/com/iemr/mmu/utils/JwtUtil.java index aaa2b07e..ee6ee025 100644 --- a/src/main/java/com/iemr/mmu/utils/JwtUtil.java +++ b/src/main/java/com/iemr/mmu/utils/JwtUtil.java @@ -66,4 +66,13 @@ private Claims extractAllClaims(String token) { .parseSignedClaims(token) .getPayload(); } + + + public String getUserIdFromToken(String token) { + Claims claims = validateToken(token); + if (claims == null) { + return null; + } + return claims.get("userId", String.class); + } } From aa2d6fcea77e63150a48b8a3bf7ce21eb547e89c Mon Sep 17 00:00:00 2001 From: Vanitha S <116701245+vanitha1822@users.noreply.github.com> Date: Thu, 27 Nov 2025 12:30:04 +0530 Subject: [PATCH 46/47] Role Based Broken Access Control Implementation : WASA (#139) * fix: rebase to resolve the conflicts * fix: coderabbit comments * Fix the WASA Issue : IDOR Vulnerability (#137) * fix: wasa-IDOR Vulnerability * fix: coderabbit comments * fix: remove userid from payload * fix: resolve the conflicts * fix: remove unwanted codes --- pom.xml | 4 + .../mmu/controller/anc/ANCController.java | 17 ++- .../CancerScreeningController.java | 17 +++ .../common/main/CommonController.java | 42 ++++++- .../common/main/InsertCommonController.java | 2 + .../common/master/CommonMasterController.java | 7 ++ .../controller/covid19/CovidController.java | 11 +- .../dataSyncActivity/StartSyncActivity.java | 2 + .../MMUDataSyncVanToServer.java | 2 + .../fileSync/FileSyncController.java | 2 + .../generalOPD/GeneralOPDController.java | 15 ++- .../LabTechnicianController.java | 2 + .../location/LocationController.java | 5 +- .../login/IemrMmuLoginController.java | 2 + .../controller/ncdCare/NCDCareController.java | 11 +- .../ncdscreening/NCDController.java | 18 ++- .../vitals/AnthropometryVitalsController.java | 2 + .../pnc/PostnatalCareController.java | 16 ++- .../quickconsult/QuickConsultController.java | 7 ++ .../registrar/main/RegistrarController.java | 19 +++- .../mmu/controller/reports/ReportGateway.java | 2 + .../controller/snomedct/SnomedController.java | 2 + .../TeleConsultationController.java | 4 +- .../iemr/mmu/repo/login/UserLoginRepo.java | 5 + .../iemr/mmu/utils/JwtAuthenticationUtil.java | 20 ++++ src/main/java/com/iemr/mmu/utils/JwtUtil.java | 4 +- .../exception/CustomAccessDeniedHandler.java | 28 +++++ .../CustomAuthenticationEntryPoint.java | 28 +++++ .../mapper/RoleAuthenticationFilter.java | 103 ++++++++++++++++++ .../iemr/mmu/utils/mapper/SecurityConfig.java | 53 +++++++++ .../iemr/mmu/utils/redis/RedisStorage.java | 26 +++++ 31 files changed, 458 insertions(+), 20 deletions(-) create mode 100644 src/main/java/com/iemr/mmu/utils/exception/CustomAccessDeniedHandler.java create mode 100644 src/main/java/com/iemr/mmu/utils/exception/CustomAuthenticationEntryPoint.java create mode 100644 src/main/java/com/iemr/mmu/utils/mapper/RoleAuthenticationFilter.java create mode 100644 src/main/java/com/iemr/mmu/utils/mapper/SecurityConfig.java diff --git a/pom.xml b/pom.xml index 5fac3076..223fc771 100644 --- a/pom.xml +++ b/pom.xml @@ -64,6 +64,10 @@ slf4j-simple ${slf4j.version} + + org.springframework.boot + spring-boot-starter-security + co.elastic.logging logback-ecs-encoder diff --git a/src/main/java/com/iemr/mmu/controller/anc/ANCController.java b/src/main/java/com/iemr/mmu/controller/anc/ANCController.java index 178f080b..7c135c67 100644 --- a/src/main/java/com/iemr/mmu/controller/anc/ANCController.java +++ b/src/main/java/com/iemr/mmu/controller/anc/ANCController.java @@ -26,6 +26,7 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.repository.query.Param; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.PostMapping; @@ -59,6 +60,7 @@ public class ANCController { */ @Operation(summary = "Save ANC nurse data") @PostMapping(value = { "/save/nurseData" }) + @PreAuthorize("hasRole('NURSE')") public String saveBenANCNurseData(@RequestBody String requestObj) { OutputResponse response = new OutputResponse(); try { @@ -91,6 +93,7 @@ public String saveBenANCNurseData(@RequestBody String requestObj) { */ @Operation(summary = "Save ANC doctor data") @PostMapping(value = { "/save/doctorData" }) + @PreAuthorize(" hasRole('DOCTOR')") public String saveBenANCDoctorData(@RequestBody String requestObj, @RequestHeader(value = "Authorization") String authorization) { OutputResponse response = new OutputResponse(); @@ -116,6 +119,7 @@ public String saveBenANCDoctorData(@RequestBody String requestObj, @Operation(summary = "Get beneficiary visit details from nurse ANC") @PostMapping(value = { "/getBenVisitDetailsFrmNurseANC" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") @Transactional(rollbackFor = Exception.class) public String getBenVisitDetailsFrmNurseANC( @Param(value = "{\"benRegID\":\"Long\", \"visitCode\":\"Long\"}") @RequestBody String comingRequest) { @@ -147,6 +151,7 @@ public String getBenVisitDetailsFrmNurseANC( @Operation(summary = "Get beneficiary ANC care details from nurse ANC") @PostMapping(value = { "/getBenANCDetailsFrmNurseANC" }) @Transactional(rollbackFor = Exception.class) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String getBenANCDetailsFrmNurseANC( @Param(value = "{\"benRegID\":\"Long\", \"visitCode\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -178,7 +183,7 @@ public String getBenANCDetailsFrmNurseANC( */ @Operation(summary = "Get beneficiary ANC history details from nurse to doctor ") @PostMapping(value = { "/getBenANCHistoryDetails" }) - + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String getBenANCHistoryDetails( @Param(value = "{\"benRegID\":\"Long\", \"visitCode\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -209,6 +214,7 @@ public String getBenANCHistoryDetails( */ @Operation(summary = "Get beneficiary ANC vital details from nurse ANC") @PostMapping(value = { "/getBenANCVitalDetailsFrmNurseANC" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String getBenANCVitalDetailsFrmNurseANC( @Param(value = "{\"benRegID\":\"Long\",\"visitCode\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -240,7 +246,7 @@ public String getBenANCVitalDetailsFrmNurseANC( */ @Operation(summary = "Get beneficiary ANC examination details from nurse to doctor ") @PostMapping(value = { "/getBenExaminationDetailsANC" }) - + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String getBenExaminationDetailsANC( @Param(value = "{\"benRegID\":\"Long\",\"visitCode\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -272,6 +278,7 @@ public String getBenExaminationDetailsANC( @Operation(summary = "Get beneficiary doctor entered details") @PostMapping(value = { "/getBenCaseRecordFromDoctorANC" }) @Transactional(rollbackFor = Exception.class) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String getBenCaseRecordFromDoctorANC( @Param(value = "{\"benRegID\":\"Long\",\"visitCode\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -298,6 +305,7 @@ public String getBenCaseRecordFromDoctorANC( @Operation(summary = "Check high risk pregnancy status for ANC beneficiary") @PostMapping(value = { "/getHRPStatus" }) @Transactional(rollbackFor = Exception.class) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String getHRPStatus( @Param(value = "{\"benRegID\":\"Long\",\"visitCode\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -326,6 +334,7 @@ public String getHRPStatus( @Operation(summary = "Update ANC care data in doctor screen") @PostMapping(value = { "/update/ANCScreen" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String updateANCCareNurse(@RequestBody String requestObj) { OutputResponse response = new OutputResponse(); @@ -356,6 +365,7 @@ public String updateANCCareNurse(@RequestBody String requestObj) { */ @Operation(summary = "Update ANC history data in doctor screen") @PostMapping(value = { "/update/historyScreen" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String updateANCHistoryNurse(@RequestBody String requestObj) { OutputResponse response = new OutputResponse(); @@ -385,6 +395,7 @@ public String updateANCHistoryNurse(@RequestBody String requestObj) { */ @Operation(summary = "Update ANC vital data in doctor screen") @PostMapping(value = { "/update/vitalScreen" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String updateANCVitalNurse(@RequestBody String requestObj) { OutputResponse response = new OutputResponse(); @@ -415,6 +426,7 @@ public String updateANCVitalNurse(@RequestBody String requestObj) { */ @Operation(summary = "Update ANC examination data in doctor screen") @PostMapping(value = { "/update/examinationScreen" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String updateANCExaminationNurse(@RequestBody String requestObj) { OutputResponse response = new OutputResponse(); @@ -445,6 +457,7 @@ public String updateANCExaminationNurse(@RequestBody String requestObj) { */ @Operation(summary = "Update ANC doctor data") @PostMapping(value = { "/update/doctorData" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String updateANCDoctorData(@RequestBody String requestObj, @RequestHeader(value = "Authorization") String authorization) { diff --git a/src/main/java/com/iemr/mmu/controller/cancerscreening/CancerScreeningController.java b/src/main/java/com/iemr/mmu/controller/cancerscreening/CancerScreeningController.java index 99428f89..f06acd5d 100644 --- a/src/main/java/com/iemr/mmu/controller/cancerscreening/CancerScreeningController.java +++ b/src/main/java/com/iemr/mmu/controller/cancerscreening/CancerScreeningController.java @@ -25,6 +25,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.PostMapping; @@ -67,6 +68,7 @@ public void setCancerScreeningServiceImpl(CSServiceImpl cSServiceImpl) { */ @Operation(summary = "Save cancer screening nurse data") @PostMapping(value = { "/save/nurseData" }) + @PreAuthorize("hasRole('NURSE')") public String saveBenCancerScreeningNurseData(@RequestBody String requestObj, @RequestHeader(value = "Authorization") String authorization) { OutputResponse response = new OutputResponse(); @@ -106,6 +108,7 @@ else if (nurseDataSaveSuccessFlag == 2) */ @Operation(summary = "Save cancer screening doctor data") @PostMapping(value = { "/save/doctorData" }) + @PreAuthorize("hasRole('DOCTOR')") public String saveBenCancerScreeningDoctorData(@RequestBody String requestObj, @RequestHeader String authorization) { OutputResponse response = new OutputResponse(); @@ -132,6 +135,7 @@ public String saveBenCancerScreeningDoctorData(@RequestBody String requestObj, @Operation(summary = "Get beneficiary visit details from nurse screen") @PostMapping(value = { "/getBenDataFrmNurseToDocVisitDetailsScreen" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String getBenDataFrmNurseScrnToDocScrnVisitDetails( @ApiParam(value = "{\"benRegID\":\"Long\", \"visitCode\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -161,6 +165,7 @@ public String getBenDataFrmNurseScrnToDocScrnVisitDetails( */ @Operation(summary = "Get beneficiary cancer history details from nurse screen") @PostMapping(value = { "/getBenDataFrmNurseToDocHistoryScreen" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String getBenDataFrmNurseScrnToDocScrnHistory( @ApiParam(value = "{\"benRegID\":\"Long\", \"visitCode\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -189,6 +194,7 @@ public String getBenDataFrmNurseScrnToDocScrnHistory( */ @Operation(summary = "Get beneficiary vital details from nurse screen") @PostMapping(value = { "/getBenDataFrmNurseToDocVitalScreen" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String getBenDataFrmNurseScrnToDocScrnVital( @ApiParam(value = "{\"benRegID\":\"Long\", \"visitCode\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -218,6 +224,7 @@ public String getBenDataFrmNurseScrnToDocScrnVital( */ @Operation(summary = "Get beneficiary examination details from nurse screen") @PostMapping(value = { "/getBenDataFrmNurseToDocExaminationScreen" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String getBenDataFrmNurseScrnToDocScrnExamination( @ApiParam(value = "{\"benRegID\":\"Long\", \"visitCode\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -247,6 +254,7 @@ public String getBenDataFrmNurseScrnToDocScrnExamination( */ @Operation(summary = "Get beneficiary cancer family history") @PostMapping(value = { "/getBenCancerFamilyHistory" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String getBenCancerFamilyHistory( @ApiParam(value = "{\"benRegID\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -278,6 +286,7 @@ public String getBenCancerFamilyHistory( */ @Operation(summary = "Get beneficiary cancer personal history") @PostMapping(value = { "/getBenCancerPersonalHistory" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String getBenCancerPersonalHistory( @ApiParam(value = "{\"benRegID\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -309,6 +318,7 @@ public String getBenCancerPersonalHistory( */ @Operation(summary = "Get beneficiary cancer personal diet history") @PostMapping(value = { "/getBenCancerPersonalDietHistory" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String getBenCancerPersonalDietHistory( @ApiParam(value = "{\"benRegID\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -340,6 +350,7 @@ public String getBenCancerPersonalDietHistory( */ @Operation(summary = "Get beneficiary cancer obstetric history") @PostMapping(value = { "/getBenCancerObstetricHistory" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String getBenCancerObstetricHistory( @ApiParam(value = "{\"benRegID\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -370,6 +381,7 @@ public String getBenCancerObstetricHistory( */ @Operation(summary = "Get beneficiary doctor entered details") @PostMapping(value = { "/getBenCaseRecordFromDoctorCS" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") @Transactional(rollbackFor = Exception.class) public String getBenCaseRecordFromDoctorCS( @ApiParam(value = "{\"benRegID\":\"Long\", \"visitCode\":\"Long\"}") @RequestBody String comingRequest) { @@ -396,6 +408,7 @@ public String getBenCaseRecordFromDoctorCS( @Operation(summary = "Update cancer screening history nurse data in doctor screen") @PostMapping(value = { "/update/historyScreen" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String updateCSHistoryNurse( @ApiParam(value = "{\"historyDetails\": {\"familyHistory\":{\"diseases\": [{\"beneficiaryRegID\":\"Long\", \"benVisitID\":\"Long\", " + "\"providerServiceMapID\":\"Integer\", \"cancerDiseaseType\":\"String\", \"otherDiseaseType\":\"String\", \"familyMemberList\":\"List\", " @@ -440,6 +453,7 @@ public String updateCSHistoryNurse( */ @Operation(summary = "Update beneficiary vital detail") @PostMapping(value = { "/update/vitalScreen" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String upodateBenVitalDetail( @ApiParam(value = "{\"ID\": \"Long\", \"beneficiaryRegID\":\"Long\",\"benVisitID\":\"Long\"," + "\"weight_Kg\":\"Double\", \"height_cm\":\"Double\", \"waistCircumference_cm\":\"Double\", \"bloodGlucose_Fasting\":\"Short\"," @@ -476,6 +490,7 @@ public String upodateBenVitalDetail( */ @Operation(summary = "Update beneficiary examination detail") @PostMapping(value = { "/update/examinationScreen" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String upodateBenExaminationDetail(@RequestBody String requestObj) { OutputResponse response = new OutputResponse(); @@ -505,6 +520,7 @@ public String upodateBenExaminationDetail(@RequestBody String requestObj) { */ @Operation(summary = "Update cancer diagnosis details by oncologist") @PostMapping(value = { "/update/examinationScreen/diagnosis" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR') || hasRole('ONCOLOGIST')") public String updateCancerDiagnosisDetailsByOncologist( @ApiParam(value = "{\"beneficiaryRegID\":\"Long\", \"benVisitID\":\"Long\", \"visitCode\":\"Long\", " + "\"provisionalDiagnosisOncologist\":\"String\", \"modifiedBy\":\"string\"}") @RequestBody String requestObj) { @@ -536,6 +552,7 @@ public String updateCancerDiagnosisDetailsByOncologist( */ @Operation(summary = "Update cancer screening doctor data") @PostMapping(value = { "/update/doctorData" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String updateCancerScreeningDoctorData(@RequestBody String requestObj) { OutputResponse response = new OutputResponse(); diff --git a/src/main/java/com/iemr/mmu/controller/common/main/CommonController.java b/src/main/java/com/iemr/mmu/controller/common/main/CommonController.java index d05c4655..c0df03d6 100644 --- a/src/main/java/com/iemr/mmu/controller/common/main/CommonController.java +++ b/src/main/java/com/iemr/mmu/controller/common/main/CommonController.java @@ -32,7 +32,7 @@ import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; - +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; @@ -95,6 +95,7 @@ public void setCommonNurseServiceImpl(CommonNurseServiceImpl commonNurseServiceI @Operation(summary = "Provides doctor worklist") @GetMapping(value = { "/getDocWorklistNew/{providerServiceMapID}/{serviceID}/{vanID}" }) + @PreAuthorize("hasRole('DOCTOR')") public String getDocWorkListNew(@PathVariable("providerServiceMapID") Integer providerServiceMapID, @PathVariable("serviceID") Integer serviceID, @PathVariable("vanID") Integer vanID) { OutputResponse response = new OutputResponse(); @@ -118,6 +119,7 @@ public String getDocWorkListNew(@PathVariable("providerServiceMapID") Integer pr @Operation(summary = "Provides doctor worklist future scheduled for TM") @GetMapping(value = { "/getDocWorkListNewFutureScheduledForTM/{providerServiceMapID}/{serviceID}" }) + @PreAuthorize("hasRole('DOCTOR')") public String getDocWorkListNewFutureScheduledForTM( @PathVariable("providerServiceMapID") Integer providerServiceMapID, @PathVariable("serviceID") Integer serviceID) { @@ -143,6 +145,7 @@ public String getDocWorkListNewFutureScheduledForTM( @Operation(summary = "Get nurse worklist new") @GetMapping(value = { "/getNurseWorklistNew/{providerServiceMapID}/{serviceID}/{vanID}" }) + @PreAuthorize("hasRole('NURSE')") public String getNurseWorkListNew(@PathVariable("providerServiceMapID") Integer providerServiceMapID, @PathVariable("vanID") Integer vanID) { OutputResponse response = new OutputResponse(); @@ -166,6 +169,7 @@ public String getNurseWorkListNew(@PathVariable("providerServiceMapID") Integer */ @Operation(summary = "Get nurse worklist TM referred") @GetMapping(value = { "/getNurseWorklistTMreferred/{providerServiceMapID}/{serviceID}/{vanID}" }) + @PreAuthorize("hasRole('NURSE')") public String getNurseWorklistTMreferred(@PathVariable("providerServiceMapID") Integer providerServiceMapID, @PathVariable("vanID") Integer vanID) { OutputResponse response = new OutputResponse(); @@ -184,6 +188,7 @@ public String getNurseWorklistTMreferred(@PathVariable("providerServiceMapID") I @Operation(summary = "Get doctor entered previous significant Ffindings") @PostMapping(value = { "/getDoctorPreviousSignificantFindings" }) + @PreAuthorize("hasRole('DOCTOR')") public String getDoctorPreviousSignificantFindings( @ApiParam(value = "{\"beneficiaryRegID\": \"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -208,6 +213,7 @@ public String getDoctorPreviousSignificantFindings( @Operation(summary = "Get lab technician worklist new") @GetMapping(value = { "/getLabWorklistNew/{providerServiceMapID}/{serviceID}/{vanID}" }) + @PreAuthorize("hasRole('LAB_TECHNICIAN') || hasRole('LABTECHNICIAN')") public String getLabWorkListNew(@PathVariable("providerServiceMapID") Integer providerServiceMapID, @PathVariable("vanID") Integer vanID) { OutputResponse response = new OutputResponse(); @@ -226,6 +232,7 @@ public String getLabWorkListNew(@PathVariable("providerServiceMapID") Integer pr @Operation(summary = "Get radiologist worklist new") @GetMapping(value = { "/getRadiologist-worklist-New/{providerServiceMapID}/{serviceID}/{vanID}" }) + @PreAuthorize("hasRole('RADIOLOGIST')") public String getRadiologistWorklistNew(@PathVariable("providerServiceMapID") Integer providerServiceMapID, @PathVariable("vanID") Integer vanID) { OutputResponse response = new OutputResponse(); @@ -244,6 +251,7 @@ public String getRadiologistWorklistNew(@PathVariable("providerServiceMapID") In @Operation(summary = "Get oncologist worklist new") @GetMapping(value = { "/getOncologist-worklist-New/{providerServiceMapID}/{serviceID}/{vanID}" }) + @PreAuthorize("hasRole('ONCOLOGIST')") public String getOncologistWorklistNew(@PathVariable("providerServiceMapID") Integer providerServiceMapID, @PathVariable("vanID") Integer vanID) { OutputResponse response = new OutputResponse(); @@ -262,6 +270,7 @@ public String getOncologistWorklistNew(@PathVariable("providerServiceMapID") Int @Operation(summary = "Get pharma worklist new") @GetMapping(value = { "/getPharma-worklist-New/{providerServiceMapID}/{serviceID}/{vanID}" }) + @PreAuthorize("hasRole('PHARMACIST')") public String getPharmaWorklistNew(@PathVariable("providerServiceMapID") Integer providerServiceMapID, @PathVariable("vanID") Integer vanID) { OutputResponse response = new OutputResponse(); @@ -280,6 +289,7 @@ public String getPharmaWorklistNew(@PathVariable("providerServiceMapID") Integer @Operation(summary = "Get case-sheet print data for beneficiary.") @PostMapping(value = { "/get/Case-sheet/printData" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String getCasesheetPrintData(@RequestBody String comingReq, @RequestHeader(value = "Authorization") String authorization) { OutputResponse response = new OutputResponse(); @@ -299,6 +309,7 @@ public String getCasesheetPrintData(@RequestBody String comingReq, @Operation(summary = "Get beneficiary past history") @PostMapping(value = { "/getBenPastHistory" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String getBenPastHistory(@ApiParam(value = "{\"benRegID\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -323,6 +334,7 @@ public String getBenPastHistory(@ApiParam(value = "{\"benRegID\":\"Long\"}") @Re @Operation(summary = "Get beneficiary tobacco history") @PostMapping(value = { "/getBenTobaccoHistory" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String getBenTobaccoHistory(@ApiParam(value = "{\"benRegID\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -347,6 +359,7 @@ public String getBenTobaccoHistory(@ApiParam(value = "{\"benRegID\":\"Long\"}") @Operation(summary = "Get beneficiary alcohol history") @PostMapping(value = { "/getBenAlcoholHistory" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String getBenAlcoholHistory(@ApiParam(value = "{\"benRegID\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -371,6 +384,7 @@ public String getBenAlcoholHistory(@ApiParam(value = "{\"benRegID\":\"Long\"}") @Operation(summary = "Get beneficiary allergy history") @PostMapping(value = { "/getBenAllergyHistory" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String getBenANCAllergyHistory( @ApiParam(value = "{\"benRegID\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -396,6 +410,7 @@ public String getBenANCAllergyHistory( @Operation(summary = "Get beneficiary medication history") @PostMapping(value = { "/getBenMedicationHistory" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String getBenMedicationHistory( @ApiParam(value = "{\"benRegID\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -421,6 +436,7 @@ public String getBenMedicationHistory( @Operation(summary = "Get beneficiary family history") @PostMapping(value = { "/getBenFamilyHistory" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String getBenFamilyHistory(@ApiParam(value = "{\"benRegID\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -445,6 +461,7 @@ public String getBenFamilyHistory(@ApiParam(value = "{\"benRegID\":\"Long\"}") @ @Operation(summary = "Get beneficiary menstrual history") @PostMapping(value = { "/getBenMenstrualHistory" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String getBenMenstrualHistory( @ApiParam(value = "{\"benRegID\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -470,7 +487,8 @@ public String getBenMenstrualHistory( @Operation(summary = "Get beneficiary past obstetric history") @PostMapping(value = { "/getBenPastObstetricHistory" }) - public String getBenPastObstetricHistory( + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") + public String getBenPastObstetricHistory( @ApiParam(value = "{\"benRegID\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -495,6 +513,7 @@ public String getBenPastObstetricHistory( @Operation(summary = "Get beneficiary comorbidity condition details") @PostMapping(value = { "/getBenComorbidityConditionHistory" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String getBenANCComorbidityConditionHistory( @ApiParam(value = "{\"benRegID\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -520,6 +539,7 @@ public String getBenANCComorbidityConditionHistory( @Operation(summary = "Get beneficiary optional vaccine details") @PostMapping(value = { "/getBenOptionalVaccineHistory" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String getBenOptionalVaccineHistory( @ApiParam(value = "{\"benRegID\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -545,6 +565,7 @@ public String getBenOptionalVaccineHistory( @Operation(summary = "Get beneficiary child vaccine(Immunization) details") @PostMapping(value = { "/getBenChildVaccineHistory" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String getBenImmunizationHistory( @ApiParam(value = "{\"benRegID\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -570,6 +591,7 @@ public String getBenImmunizationHistory( @Operation(summary = "Get beneficiary perinatal history details") @PostMapping(value = { "/getBenPerinatalHistory" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String getBenPerinatalHistory( @ApiParam(value = "{\"benRegID\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -595,6 +617,7 @@ public String getBenPerinatalHistory( @Operation(summary = "Get beneficiary child feeding history details") @PostMapping(value = { "/getBenFeedingHistory" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String getBenFeedingHistory(@ApiParam(value = "{\"benRegID\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -619,6 +642,7 @@ public String getBenFeedingHistory(@ApiParam(value = "{\"benRegID\":\"Long\"}") @Operation(summary = "Get beneficiary child development history details") @PostMapping(value = { "/getBenDevelopmentHistory" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String getBenDevelopmentHistory( @ApiParam(value = "{\"benRegID\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -647,6 +671,7 @@ public String getBenDevelopmentHistory( */ @Operation(summary = "Get casesheet history of beneficiary") @PostMapping(value = { "/getBeneficiaryCaseSheetHistory" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String getBeneficiaryCaseSheetHistory( @ApiParam(value = "{\"benRegID\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -665,6 +690,7 @@ public String getBeneficiaryCaseSheetHistory( @Operation(summary = "TC specialist") @GetMapping(value = { "/getTCSpecialistWorklist/{providerServiceMapID}/{serviceID}" }) + @PreAuthorize("hasRole('TC_SPECIALIST') || hasRole('TCSPECIALIST')") public String getTCSpecialistWorkListNew(@PathVariable("providerServiceMapID") Integer providerServiceMapID, @PathVariable("serviceID") Integer serviceID,HttpServletRequest request) { OutputResponse response = new OutputResponse(); @@ -698,6 +724,7 @@ public String getTCSpecialistWorkListNew(@PathVariable("providerServiceMapID") I @Operation(summary = "TC specialist future scheduled") @GetMapping(value = { "/getTCSpecialistWorklistFutureScheduled/{providerServiceMapID}/{serviceID}" }) + @PreAuthorize("hasRole('TC_SPECIALIST') || hasRole('TCSPECIALIST')") public String getTCSpecialistWorklistFutureScheduled( @PathVariable("providerServiceMapID") Integer providerServiceMapID, @PathVariable("serviceID") Integer serviceID, HttpServletRequest request) { @@ -730,6 +757,7 @@ public String getTCSpecialistWorklistFutureScheduled( @Operation(summary = "Download file from file system") @PostMapping(value = { "/downloadFile" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public ResponseEntity downloadFile(@RequestBody String requestOBJ, HttpServletRequest request) throws Exception { JSONObject obj = new JSONObject(requestOBJ); @@ -760,6 +788,7 @@ public ResponseEntity downloadFile(@RequestBody String requ @Operation(summary = "Get beneficiary physical history") @PostMapping(value = { "/getBenPhysicalHistory" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String getBenPhysicalHistory( @ApiParam(value = "{\"benRegID\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -785,6 +814,7 @@ public String getBenPhysicalHistory( @Operation(summary = "Get beneficiary symptomatic questionnaire answer details") @PostMapping(value = { "/getBenSymptomaticQuestionnaireDetails" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String getBenSymptomaticQuestionnaireDetails( @ApiParam(value = "{\"benRegID\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -810,6 +840,7 @@ public String getBenSymptomaticQuestionnaireDetails( @Operation(summary = "Get beneficiary previous diabetes history") @PostMapping(value = { "/getBenPreviousDiabetesHistoryDetails" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String getBenPreviousDiabetesHistoryDetails( @ApiParam(value = "{\"benRegID\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -840,6 +871,7 @@ public String getBenPreviousDiabetesHistoryDetails( */ @Operation(summary = "Get beneficiary TM case record") @PostMapping(value = { "/get/Case-sheet/TMReferredprintData" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String getTMReferredPrintData(@RequestBody String comingRequest, @RequestHeader(value = "Authorization") String authorization, @RequestHeader(value = "ServerAuthorization") String serverAuthorization) { @@ -877,6 +909,7 @@ public String getTMReferredPrintData(@RequestBody String comingRequest, @Operation(summary = "Get beneficiary previous referral history") @PostMapping(value = { "/getBenPreviousReferralHistoryDetails" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String getBenPreviousReferralHistoryDetails( @ApiParam(value = "{\"benRegID\":\"Long\"}") @RequestBody String comingRequest) { @@ -903,6 +936,7 @@ public String getBenPreviousReferralHistoryDetails( @Operation(summary = "Get beneficiary TM case record") @PostMapping(value = { "/get/Case-sheet/centralServerTMCaseSheet" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String getTMCaseSheetFromCentralServer(@RequestBody String comingRequest, @RequestHeader(value = "Authorization") String authorization) { OutputResponse response = new OutputResponse(); @@ -940,6 +974,7 @@ public String getTMCaseSheetFromCentralServer(@RequestBody String comingRequest, */ @Operation(summary = "Calculate beneficiary BMI status") @PostMapping(value = { "/calculateBMIStatus" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String calculateBMIStatus( @ApiParam(value = "{\"bmi\":\"double\",\"yearMonth\":\"String\",\"gender\":\"String\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -957,6 +992,7 @@ public String calculateBMIStatus( @Operation(summary = "Update beneficiary status flag") @PostMapping(value = { "/update/benDetailsAndSubmitToNurse" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String saveBeneficiaryVisitDetail( @ApiParam(value = "{\"beneficiaryRegID\": \"Long\"}") @RequestBody String comingRequest) { @@ -991,6 +1027,7 @@ public String saveBeneficiaryVisitDetail( @Operation(summary = "Extend redis session for 30 minutes") @PostMapping(value = { "/extend/redisSession" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR') || hasRole('PHARMACIST') || hasRole('LAB_TECHNICIAN') || hasRole('RADIOLOGIST') || hasRole('ONCOLOGIST') || hasRole('TC_SPECIALIST') || hasRole('TCSPECIALIST') || hasRole('REGISTRAR')") public String extendRedisSession() { OutputResponse response = new OutputResponse(); try { @@ -1003,6 +1040,7 @@ public String extendRedisSession() { @Operation(summary = "Soft delete prescribed medicine") @PostMapping(value = { "/doctor/delete/prescribedMedicine" }) + @PreAuthorize("hasRole('DOCTOR')") public String deletePrescribedMedicine(@RequestBody String requestOBJ) { OutputResponse response = new OutputResponse(); try { diff --git a/src/main/java/com/iemr/mmu/controller/common/main/InsertCommonController.java b/src/main/java/com/iemr/mmu/controller/common/main/InsertCommonController.java index cd3a7576..faa6b0dc 100644 --- a/src/main/java/com/iemr/mmu/controller/common/main/InsertCommonController.java +++ b/src/main/java/com/iemr/mmu/controller/common/main/InsertCommonController.java @@ -27,6 +27,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -42,6 +43,7 @@ @RestController @RequestMapping(value = "/commonInsert", headers = "Authorization") +@PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public class InsertCommonController { private Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName()); @Autowired diff --git a/src/main/java/com/iemr/mmu/controller/common/master/CommonMasterController.java b/src/main/java/com/iemr/mmu/controller/common/master/CommonMasterController.java index 89e816d1..d37dcdaf 100644 --- a/src/main/java/com/iemr/mmu/controller/common/master/CommonMasterController.java +++ b/src/main/java/com/iemr/mmu/controller/common/master/CommonMasterController.java @@ -24,6 +24,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -55,6 +56,7 @@ public void setCommonMasterServiceImpl(CommonMasterServiceImpl commonMasterServi */ @Operation(summary = "Master data for visit reasons & categories") @GetMapping(value = "/get/visitReasonAndCategories", consumes = "application/json", produces = "application/json") + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String getVisitReasonAndCategories() { logger.info("getVisitReasonAndCategories ..."); OutputResponse response = new OutputResponse(); @@ -68,8 +70,10 @@ public String getVisitReasonAndCategories() { * @param visitCategoryID * @return nurse master data for the provided visitCategoryID */ + @Operation(summary = "Master data API for nurse") @GetMapping(value = "/nurse/masterData/{visitCategoryID}/{providerServiceMapID}/{gender}", consumes = "application/json", produces = "application/json") + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String nurseMasterData(@PathVariable("visitCategoryID") Integer visitCategoryID, @PathVariable("providerServiceMapID") Integer providerServiceMapID, @PathVariable("gender") String gender) { logger.info("Nurse master Data for categoryID:" + visitCategoryID + " and providerServiceMapID:" @@ -87,8 +91,10 @@ public String nurseMasterData(@PathVariable("visitCategoryID") Integer visitCate * @param visitCategoryID * @return doctor master data for the provided visitCategoryID */ + @Operation(summary = "Master data API for doctor") @GetMapping(value = "/doctor/masterData/{visitCategoryID}/{providerServiceMapID}/{gender}/{facilityID}/{vanID}", produces = "application/json") + @PreAuthorize("hasRole('DOCTOR')") public String doctorMasterData(@PathVariable("visitCategoryID") Integer visitCategoryID, @PathVariable("providerServiceMapID") Integer providerServiceMapID, @PathVariable("gender") String gender, @PathVariable("facilityID") Integer facilityID, @PathVariable("vanID") Integer vanID) { @@ -103,6 +109,7 @@ public String doctorMasterData(@PathVariable("visitCategoryID") Integer visitCat @Operation(summary = "Get ECG abnormalities") @GetMapping(value = "/ecgAbnormalities", consumes = "application/json", produces = "application/json") + @PreAuthorize("hasRole('LAB_TECHNICIAN') || hasRole('LABTECHNICIAN')") public String getECGAbnormalities() { OutputResponse response = new OutputResponse(); diff --git a/src/main/java/com/iemr/mmu/controller/covid19/CovidController.java b/src/main/java/com/iemr/mmu/controller/covid19/CovidController.java index 959c9cc7..7eff6468 100644 --- a/src/main/java/com/iemr/mmu/controller/covid19/CovidController.java +++ b/src/main/java/com/iemr/mmu/controller/covid19/CovidController.java @@ -28,6 +28,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.PostMapping; @@ -65,6 +66,7 @@ public class CovidController { @Operation(summary = "Save covid nurse data") @PostMapping(value = { "/save/nurseData" }) + @PreAuthorize("hasRole('NURSE')") public String saveBenCovid19NurseData(@RequestBody String requestObj, @RequestHeader(value = "Authorization") String authorization) { OutputResponse outputResponse = new OutputResponse(); @@ -100,6 +102,7 @@ public String saveBenCovid19NurseData(@RequestBody String requestObj, */ @Operation(summary = "Save covid doctor data") @PostMapping(value = { "/save/doctorData" }) + @PreAuthorize("hasRole('DOCTOR')") public String saveBenCovidDoctorData(@RequestBody String requestObj, @RequestHeader(value = "Authorization") String authorization) { OutputResponse response = new OutputResponse(); @@ -126,6 +129,7 @@ public String saveBenCovidDoctorData(@RequestBody String requestObj, @Operation(summary = "Get beneficiary visit details from nurse covid 19") @PostMapping(value = { "/getBenVisitDetailsFrmNurseCovid" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") @Transactional(rollbackFor = Exception.class) public String getBenVisitDetailsFrmNurseCovid19( @ApiParam(value = "{\"benRegID\":\"Long\",\"visitCode\":\"Long\"}") @RequestBody String comingRequest) { @@ -158,7 +162,7 @@ public String getBenVisitDetailsFrmNurseCovid19( */ @Operation(summary = "Get beneficiary covid 19 history details from nurse to doctor ") @PostMapping(value = { "/getBenCovid19HistoryDetails" }) - + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String getBenCovid19HistoryDetails( @ApiParam(value = "{\"benRegID\":\"Long\",\"visitCode\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -189,6 +193,7 @@ public String getBenCovid19HistoryDetails( */ @Operation(summary = "Get beneficiary covid 19 vital details from nurse NCD care") @PostMapping(value = { "/getBenVitalDetailsFrmNurseCovid" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String getBenVitalDetailsFrmNurseNCDCare( @ApiParam(value = "{\"benRegID\":\"Long\",\"visitCode\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -217,6 +222,7 @@ public String getBenVitalDetailsFrmNurseNCDCare( @Operation(summary = "Get beneficiary doctor entered details") @PostMapping(value = { "/getBenCaseRecordFromDoctorCovid" }) @Transactional(rollbackFor = Exception.class) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String getBenCaseRecordFromDoctorCovid19( @ApiParam(value = "{\"benRegID\":\"Long\",\"visitCode\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -243,6 +249,7 @@ public String getBenCaseRecordFromDoctorCovid19( @Operation(summary = "Update history data in doctor screen") @PostMapping(value = { "/update/historyScreen" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String updateHistoryNurse(@RequestBody String requestObj) { OutputResponse response = new OutputResponse(); @@ -275,6 +282,7 @@ public String updateHistoryNurse(@RequestBody String requestObj) { */ @Operation(summary = "Update covid vital data in doctor screen") @PostMapping(value = { "/update/vitalScreen" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String updateVitalNurse(@RequestBody String requestObj) { OutputResponse response = new OutputResponse(); @@ -304,6 +312,7 @@ public String updateVitalNurse(@RequestBody String requestObj) { */ @Operation(summary = "Update covid 19 doctor data") @PostMapping(value = { "/update/doctorData" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String updateCovid19DoctorData(@RequestBody String requestObj, @RequestHeader(value = "Authorization") String authorization) { diff --git a/src/main/java/com/iemr/mmu/controller/dataSyncActivity/StartSyncActivity.java b/src/main/java/com/iemr/mmu/controller/dataSyncActivity/StartSyncActivity.java index 1e43ed66..83c5dcfe 100644 --- a/src/main/java/com/iemr/mmu/controller/dataSyncActivity/StartSyncActivity.java +++ b/src/main/java/com/iemr/mmu/controller/dataSyncActivity/StartSyncActivity.java @@ -25,6 +25,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -47,6 +48,7 @@ */ @RestController @RequestMapping(value = "/dataSyncActivity", headers = "Authorization", consumes = "application/json", produces = "application/json") +@PreAuthorize("hasRole('DATASYNC') || hasRole('DATA_SYNC') ") public class StartSyncActivity { private Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName()); diff --git a/src/main/java/com/iemr/mmu/controller/dataSyncLayerCentral/MMUDataSyncVanToServer.java b/src/main/java/com/iemr/mmu/controller/dataSyncLayerCentral/MMUDataSyncVanToServer.java index 524094e5..2a9f3450 100644 --- a/src/main/java/com/iemr/mmu/controller/dataSyncLayerCentral/MMUDataSyncVanToServer.java +++ b/src/main/java/com/iemr/mmu/controller/dataSyncLayerCentral/MMUDataSyncVanToServer.java @@ -24,6 +24,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -47,6 +48,7 @@ */ @RestController @RequestMapping(value = "/dataSync", headers = "Authorization") +@PreAuthorize("hasRole('DATASYNC') || hasRole('DATA_SYNC') ") public class MMUDataSyncVanToServer { private Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName()); diff --git a/src/main/java/com/iemr/mmu/controller/fileSync/FileSyncController.java b/src/main/java/com/iemr/mmu/controller/fileSync/FileSyncController.java index b5b1a34a..d902af0d 100644 --- a/src/main/java/com/iemr/mmu/controller/fileSync/FileSyncController.java +++ b/src/main/java/com/iemr/mmu/controller/fileSync/FileSyncController.java @@ -24,6 +24,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestHeader; @@ -38,6 +39,7 @@ @RequestMapping("/fileSyncController") @RestController +@PreAuthorize("hasRole('DATASYNC') || hasRole('DATA_SYNC') ") public class FileSyncController { private final Logger logger = LoggerFactory.getLogger(this.getClass().getName()); diff --git a/src/main/java/com/iemr/mmu/controller/generalOPD/GeneralOPDController.java b/src/main/java/com/iemr/mmu/controller/generalOPD/GeneralOPDController.java index b7fa65a0..18eeef9b 100644 --- a/src/main/java/com/iemr/mmu/controller/generalOPD/GeneralOPDController.java +++ b/src/main/java/com/iemr/mmu/controller/generalOPD/GeneralOPDController.java @@ -25,6 +25,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.PostMapping; @@ -64,6 +65,7 @@ public void setGeneralOPDServiceImpl(GeneralOPDServiceImpl generalOPDServiceImpl */ @Operation(summary = "Save general OPD nurse data") @PostMapping(value = { "/save/nurseData" }) + @PreAuthorize("hasRole('NURSE') ") public String saveBenGenOPDNurseData(@RequestBody String requestObj) { OutputResponse response = new OutputResponse(); try { @@ -96,6 +98,7 @@ public String saveBenGenOPDNurseData(@RequestBody String requestObj) { */ @Operation(summary = "Save general OPD doctor data") @PostMapping(value = { "/save/doctorData" }) + @PreAuthorize("hasRole('DOCTOR') ") public String saveBenGenOPDDoctorData(@RequestBody String requestObj, @RequestHeader(value = "Authorization") String authorization) { OutputResponse response = new OutputResponse(); @@ -122,6 +125,7 @@ public String saveBenGenOPDDoctorData(@RequestBody String requestObj, @Operation(summary = "Get beneficiary visit details from nurse general OPD") @PostMapping(value = { "/getBenVisitDetailsFrmNurseGOPD" }) @Transactional(rollbackFor = Exception.class) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR') ") public String getBenVisitDetailsFrmNurseGOPD( @ApiParam(value = "{\"benRegID\":\"Long\",\"visitCode\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -153,7 +157,7 @@ public String getBenVisitDetailsFrmNurseGOPD( */ @Operation(summary = "Get beneficiary general OPD history details from nurse to doctor ") @PostMapping(value = { "/getBenHistoryDetails" }) - + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR') ") public String getBenHistoryDetails( @ApiParam(value = "{\"benRegID\":\"Long\",\"visitCode\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -184,6 +188,7 @@ public String getBenHistoryDetails( */ @Operation(summary = "Get beneficiary vital details from nurse general OPD") @PostMapping(value = { "/getBenVitalDetailsFrmNurse" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR') ") public String getBenVitalDetailsFrmNurse( @ApiParam(value = "{\"benRegID\":\"Long\",\"visitCode\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -215,7 +220,7 @@ public String getBenVitalDetailsFrmNurse( */ @Operation(summary = "Get beneficiary general OPD examination details from nurse to doctor ") @PostMapping(value = { "/getBenExaminationDetails" }) - + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR') ") public String getBenExaminationDetails( @ApiParam(value = "{\"benRegID\":\"Long\",\"visitCode\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -247,6 +252,7 @@ public String getBenExaminationDetails( @Operation(summary = "Get beneficiary doctor entered details") @PostMapping(value = { "/getBenCaseRecordFromDoctorGeneralOPD" }) @Transactional(rollbackFor = Exception.class) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR') ") public String getBenCaseRecordFromDoctorGeneralOPD( @ApiParam(value = "{\"benRegID\":\"Long\",\"visitCode\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -273,6 +279,7 @@ public String getBenCaseRecordFromDoctorGeneralOPD( @Operation(summary = "Update general OPD visit screen nurse data in doctor screen") @PostMapping(value = { "/update/visitDetailsScreen" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR') ") public String updateVisitNurse(@RequestBody String requestObj) { OutputResponse response = new OutputResponse(); @@ -303,6 +310,7 @@ public String updateVisitNurse(@RequestBody String requestObj) { */ @Operation(summary = "Update history data in doctor Screen") @PostMapping(value = { "/update/historyScreen" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR') ") public String updateHistoryNurse(@RequestBody String requestObj) { OutputResponse response = new OutputResponse(); @@ -333,6 +341,7 @@ public String updateHistoryNurse(@RequestBody String requestObj) { */ @Operation(summary = "Update general OPD vital data in doctor screen") @PostMapping(value = { "/update/vitalScreen" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR') ") public String updateVitalNurse(@RequestBody String requestObj) { OutputResponse response = new OutputResponse(); @@ -363,6 +372,7 @@ public String updateVitalNurse(@RequestBody String requestObj) { */ @Operation(summary = "Update general OPD examination data in doctor screen") @PostMapping(value = { "/update/examinationScreen" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR') ") public String updateGeneralOPDExaminationNurse(@RequestBody String requestObj) { OutputResponse response = new OutputResponse(); @@ -392,6 +402,7 @@ public String updateGeneralOPDExaminationNurse(@RequestBody String requestObj) { */ @Operation(summary = "Update general OPD doctor data") @PostMapping(value = { "/update/doctorData" }) + @PreAuthorize("hasRole('DOCTOR') ") public String updateGeneralOPDDoctorData(@RequestBody String requestObj, @RequestHeader(value = "Authorization") String authorization) { diff --git a/src/main/java/com/iemr/mmu/controller/labtechnician/LabTechnicianController.java b/src/main/java/com/iemr/mmu/controller/labtechnician/LabTechnicianController.java index f30dce3b..152f5029 100644 --- a/src/main/java/com/iemr/mmu/controller/labtechnician/LabTechnicianController.java +++ b/src/main/java/com/iemr/mmu/controller/labtechnician/LabTechnicianController.java @@ -24,6 +24,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -44,6 +45,7 @@ @RestController @RequestMapping(value = "/labTechnician", headers = "Authorization", consumes = "application/json", produces = "application/json") +@PreAuthorize("hasRole('LABTECHNICIAN') || hasRole('LAB_TECHNICIAN') ") public class LabTechnicianController { private Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName()); diff --git a/src/main/java/com/iemr/mmu/controller/location/LocationController.java b/src/main/java/com/iemr/mmu/controller/location/LocationController.java index 6559182b..e7bab71a 100644 --- a/src/main/java/com/iemr/mmu/controller/location/LocationController.java +++ b/src/main/java/com/iemr/mmu/controller/location/LocationController.java @@ -26,13 +26,14 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import com.iemr.mmu.utils.JwtUtil; +import org.springframework.security.access.prepost.PreAuthorize; +import com.iemr.mmu.utils.JwtUtil; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import jakarta.servlet.http.HttpServletRequest; import com.iemr.mmu.utils.CookieUtil; @@ -45,10 +46,10 @@ @RestController @RequestMapping(value = "/location", headers = "Authorization") +@PreAuthorize("hasRole('NURSE') || hasRole('PHARMACIST') || hasRole('LABTECHNICIAN') || hasRole('REGISTRAR') || hasRole('DATASYNC') || hasRole('DATA_SYNC') || hasRole('DOCTOR') || hasRole('LAB_TECHNICIAN') || hasRole('TC_SPECIALIST') || hasRole('ONCOLOGIST') || hasRole('RADIOLOGIST')") public class LocationController { private OutputResponse response; private Logger logger = LoggerFactory.getLogger(CommonMasterController.class); - private LocationServiceImpl locationServiceImpl; @Autowired diff --git a/src/main/java/com/iemr/mmu/controller/login/IemrMmuLoginController.java b/src/main/java/com/iemr/mmu/controller/login/IemrMmuLoginController.java index a3fe4869..f2e0f576 100644 --- a/src/main/java/com/iemr/mmu/controller/login/IemrMmuLoginController.java +++ b/src/main/java/com/iemr/mmu/controller/login/IemrMmuLoginController.java @@ -25,6 +25,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -47,6 +48,7 @@ @RequestMapping(value = "/user", headers = "Authorization") @RestController +@PreAuthorize("hasRole('NURSE') || hasRole('PHARMACIST') || hasRole('LABTECHNICIAN') || hasRole('REGISTRAR') || hasRole('DATASYNC') || hasRole('DATA_SYNC') || hasRole('DOCTOR') || hasRole('LAB_TECHNICIAN') || hasRole('TC_SPECIALIST') || hasRole('ONCOLOGIST') || hasRole('RADIOLOGIST')") public class IemrMmuLoginController { private Logger logger = LoggerFactory.getLogger(RegistrarController.class); diff --git a/src/main/java/com/iemr/mmu/controller/ncdCare/NCDCareController.java b/src/main/java/com/iemr/mmu/controller/ncdCare/NCDCareController.java index 03c4cecc..0e8dd35d 100644 --- a/src/main/java/com/iemr/mmu/controller/ncdCare/NCDCareController.java +++ b/src/main/java/com/iemr/mmu/controller/ncdCare/NCDCareController.java @@ -28,6 +28,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.PostMapping; @@ -66,6 +67,7 @@ public void setNcdCareServiceImpl(NCDCareServiceImpl ncdCareServiceImpl) { */ @Operation(summary = "Save NCD care data collected by nurse") @PostMapping(value = { "/save/nurseData" }) + @PreAuthorize("hasRole('NURSE') ") public String saveBenNCDCareNurseData(@RequestBody String requestObj) { OutputResponse response = new OutputResponse(); try { @@ -99,6 +101,7 @@ public String saveBenNCDCareNurseData(@RequestBody String requestObj) { */ @Operation(summary = "Save NCD care beneficiary case record and referral") @PostMapping(value = { "/save/doctorData" }) + @PreAuthorize("hasRole('DOCTOR') ") public String saveBenNCDCareDoctorData(@RequestBody String requestObj, @RequestHeader(value = "Authorization") String authorization) { OutputResponse response = new OutputResponse(); @@ -125,6 +128,7 @@ public String saveBenNCDCareDoctorData(@RequestBody String requestObj, @Operation(summary = "Get NCD care beneficiary visit details") @PostMapping(value = { "/getBenVisitDetailsFrmNurseNCDCare" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") @Transactional(rollbackFor = Exception.class) public String getBenVisitDetailsFrmNurseNCDCare( @ApiParam(value = "{\"benRegID\":\"Long\",\"visitCode\":\"Long\"}") @RequestBody String comingRequest) { @@ -157,7 +161,7 @@ public String getBenVisitDetailsFrmNurseNCDCare( */ @Operation(summary = "Get NCD care beneficiary history") @PostMapping(value = { "/getBenNCDCareHistoryDetails" }) - + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String getBenNCDCareHistoryDetails( @ApiParam(value = "{\"benRegID\":\"Long\",\"visitCode\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -188,6 +192,7 @@ public String getBenNCDCareHistoryDetails( */ @Operation(summary = "Get NCD care beneficiary vitals") @PostMapping(value = { "/getBenVitalDetailsFrmNurseNCDCare" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String getBenVitalDetailsFrmNurseNCDCare( @ApiParam(value = "{\"benRegID\":\"Long\",\"visitCode\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -220,6 +225,7 @@ public String getBenVitalDetailsFrmNurseNCDCare( @Operation(summary = "Get NCD care beneficiary case record and referral") @PostMapping(value = { "/getBenCaseRecordFromDoctorNCDCare" }) @Transactional(rollbackFor = Exception.class) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String getBenCaseRecordFromDoctorNCDCare( @ApiParam(value = "{\"benRegID\":\"Long\",\"visitCode\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -246,6 +252,7 @@ public String getBenCaseRecordFromDoctorNCDCare( @Operation(summary = "Update NCD care beneficiary history") @PostMapping(value = { "/update/historyScreen" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String updateHistoryNurse(@RequestBody String requestObj) { OutputResponse response = new OutputResponse(); @@ -278,6 +285,7 @@ public String updateHistoryNurse(@RequestBody String requestObj) { */ @Operation(summary = "Update NCD care beneficiary vitals") @PostMapping(value = { "/update/vitalScreen" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String updateVitalNurse(@RequestBody String requestObj) { OutputResponse response = new OutputResponse(); @@ -307,6 +315,7 @@ public String updateVitalNurse(@RequestBody String requestObj) { */ @Operation(summary = "Update NCD care beneficiary case record and referral") @PostMapping(value = { "/update/doctorData" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String updateNCDCareDoctorData(@RequestBody String requestObj, @RequestHeader(value = "Authorization") String authorization) { diff --git a/src/main/java/com/iemr/mmu/controller/ncdscreening/NCDController.java b/src/main/java/com/iemr/mmu/controller/ncdscreening/NCDController.java index 39d3531b..24cb3cb0 100644 --- a/src/main/java/com/iemr/mmu/controller/ncdscreening/NCDController.java +++ b/src/main/java/com/iemr/mmu/controller/ncdscreening/NCDController.java @@ -25,6 +25,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.GetMapping; @@ -73,8 +74,8 @@ public void setNcdScreeningServiceImpl(NCDScreeningServiceImpl ncdScreeningServi * @return success or failure response */ @Operation(summary = "Save beneficiary NCD screening details") - @PostMapping(value = { "/save/nurseData" }) + @PreAuthorize("hasRole('NURSE')") public String saveBeneficiaryNCDScreeningDetails(@RequestBody String requestObj, @RequestHeader(value = "Authorization") String authorization) { @@ -109,6 +110,7 @@ public String saveBeneficiaryNCDScreeningDetails(@RequestBody String requestObj, */ @Operation(summary = "Save NCD screening doctor data") @PostMapping(value = { "/save/doctorData" }) + @PreAuthorize("hasRole('DOCTOR')") public String saveBenNCDScreeningDoctorData(@RequestBody String requestObj, @RequestHeader(value = "Authorization") String authorization) { OutputResponse response = new OutputResponse(); @@ -135,8 +137,8 @@ public String saveBenNCDScreeningDoctorData(@RequestBody String requestObj, } @Operation(summary = "Get NCD screening visit details") - @PostMapping(value = { "/get/nurseData" }) + @PreAuthorize("hasRole('NURSE')") public String getNCDScreenigDetails( @ApiParam(value = "{\"benRegID\":\"Long\",\"visitCode\":\"Long\"}") @RequestBody String comingRequest) { @@ -162,6 +164,7 @@ public String getNCDScreenigDetails( @Operation(summary = "Get NCD screening visit count for beneficiary registration id") @GetMapping(value = { "/getNcdScreeningVisitCount/{beneficiaryRegID}" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String getNcdScreeningVisitCount(@PathVariable("beneficiaryRegID") Long beneficiaryRegID) { OutputResponse response = new OutputResponse(); try { @@ -185,6 +188,7 @@ public String getNcdScreeningVisitCount(@PathVariable("beneficiaryRegID") Long b @Operation(summary = "Get beneficiary visit details from nurse NCD screening") @PostMapping(value = { "/getBenVisitDetailsFrmNurseNCDScreening" }) @Transactional(rollbackFor = Exception.class) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String getBenVisitDetailsFrmNurseGOPD( @ApiParam(value = "{\"benRegID\":\"Long\",\"visitCode\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -211,7 +215,7 @@ public String getBenVisitDetailsFrmNurseGOPD( @Operation(summary = "Get beneficiary general OPD history details from nurse to doctor ") @PostMapping(value = { "/getBenHistoryDetails" }) - + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String getBenHistoryDetails( @ApiParam(value = "{\"benRegID\":\"Long\",\"visitCode\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -237,6 +241,7 @@ public String getBenHistoryDetails( @Operation(summary = "Get beneficiary vital details from nurse general OPD") @PostMapping(value = { "/getBenVitalDetailsFrmNurse" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String getBenVitalDetailsFrmNurse( @ApiParam(value = "{\"benRegID\":\"Long\",\"visitCode\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -263,6 +268,7 @@ public String getBenVitalDetailsFrmNurse( @Operation(summary = "Get beneficiary vital details from nurse general OPD") @PostMapping(value = { "/getBenIdrsDetailsFrmNurse" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String getBenIdrsDetailsFrmNurse( @ApiParam(value = "{\"benRegID\":\"Long\",\"visitCode\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -294,6 +300,7 @@ public String getBenIdrsDetailsFrmNurse( */ @Operation(summary = "Get beneficiary doctor entered details") @PostMapping(value = { "/getBenCaseRecordFromDoctorNCDScreening" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") @Transactional(rollbackFor = Exception.class) public String getBenCaseRecordFromDoctorNCDCare( @ApiParam(value = "{\"benRegID\":\"Long\",\"visitCode\":\"Long\"}") @RequestBody String comingRequest) { @@ -321,6 +328,7 @@ public String getBenCaseRecordFromDoctorNCDCare( @Operation(summary = "Update beneficiary NCD screening details") @PostMapping(value = { "/update/nurseData" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String updateBeneficiaryNCDScreeningDetails(@RequestBody String requestObj) { OutputResponse response = new OutputResponse(); @@ -348,6 +356,7 @@ public String updateBeneficiaryNCDScreeningDetails(@RequestBody String requestOb @Operation(summary = "Update history data in doctor screen") @PostMapping(value = { "/update/historyScreen" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String updateHistoryNurse(@RequestBody String requestObj) { OutputResponse response = new OutputResponse(); @@ -372,6 +381,7 @@ public String updateHistoryNurse(@RequestBody String requestObj) { @Operation(summary = "Update NCD screening vital data in doctor screen") @PostMapping(value = { "/update/vitalScreen" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String updateVitalNurse(@RequestBody String requestObj) { OutputResponse response = new OutputResponse(); @@ -395,6 +405,7 @@ public String updateVitalNurse(@RequestBody String requestObj) { @Operation(summary = "Update history data in doctor screen") @PostMapping(value = { "/update/idrsScreen" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public String updateIDRSScreen(@RequestBody String requestObj) { OutputResponse response = new OutputResponse(); @@ -418,6 +429,7 @@ public String updateIDRSScreen(@RequestBody String requestObj) { @Operation(summary = "Update doctor data") @PostMapping(value = { "/update/doctorData" }) + @PreAuthorize("hasRole('DOCTOR')") public String updateDoctorData(@RequestBody String requestObj) { OutputResponse response = new OutputResponse(); diff --git a/src/main/java/com/iemr/mmu/controller/nurse/vitals/AnthropometryVitalsController.java b/src/main/java/com/iemr/mmu/controller/nurse/vitals/AnthropometryVitalsController.java index f5677647..ef3a5a5a 100644 --- a/src/main/java/com/iemr/mmu/controller/nurse/vitals/AnthropometryVitalsController.java +++ b/src/main/java/com/iemr/mmu/controller/nurse/vitals/AnthropometryVitalsController.java @@ -5,6 +5,7 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.repository.query.Param; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -18,6 +19,7 @@ @RestController @RequestMapping(value = "/anthropometryVitals", headers = "Authorization", consumes = "application/json", produces = "application/json") +@PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR')") public class AnthropometryVitalsController { private Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName()); diff --git a/src/main/java/com/iemr/mmu/controller/pnc/PostnatalCareController.java b/src/main/java/com/iemr/mmu/controller/pnc/PostnatalCareController.java index 0e15e43a..ebc01325 100644 --- a/src/main/java/com/iemr/mmu/controller/pnc/PostnatalCareController.java +++ b/src/main/java/com/iemr/mmu/controller/pnc/PostnatalCareController.java @@ -25,6 +25,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.PostMapping; @@ -63,6 +64,7 @@ public void setPncServiceImpl(PNCServiceImpl pncServiceImpl) { */ @Operation(summary = "Save PNC nurse data") @PostMapping(value = { "/save/nurseData" }) + @PreAuthorize("hasRole('NURSE')") public String saveBenPNCNurseData(@RequestBody String requestObj) { OutputResponse response = new OutputResponse(); try { @@ -96,6 +98,7 @@ public String saveBenPNCNurseData(@RequestBody String requestObj) { */ @Operation(summary = "Save PNC doctor data") @PostMapping(value = { "/save/doctorData" }) + @PreAuthorize("hasRole('DOCTOR') ") public String saveBenPNCDoctorData(@RequestBody String requestObj, @RequestHeader(value = "Authorization") String authorization) { OutputResponse response = new OutputResponse(); @@ -121,6 +124,7 @@ public String saveBenPNCDoctorData(@RequestBody String requestObj, @Operation(summary = "Get PNC beneficiary visit details from nurse") @PostMapping(value = { "/getBenVisitDetailsFrmNursePNC" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR') ") @Transactional(rollbackFor = Exception.class) public String getBenVisitDetailsFrmNursePNC( @ApiParam(value = "{\"benRegID\":\"Long\",\"visitCode\":\"Long\"}") @RequestBody String comingRequest) { @@ -154,6 +158,7 @@ public String getBenVisitDetailsFrmNursePNC( @Operation(summary = "Get PNC beneficiary care details from nurse") @PostMapping(value = { "/getBenPNCDetailsFrmNursePNC" }) @Transactional(rollbackFor = Exception.class) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR') ") public String getBenPNCDetailsFrmNursePNC( @ApiParam(value = "{\"benRegID\":\"Long\",\"visitCode\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -185,7 +190,7 @@ public String getBenPNCDetailsFrmNursePNC( */ @Operation(summary = "Get PNC beneficiary history details from nurse to doctor ") @PostMapping(value = { "/getBenHistoryDetails" }) - + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR') ") public String getBenHistoryDetails( @ApiParam(value = "{\"benRegID\":\"Long\",\"visitCode\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -216,6 +221,7 @@ public String getBenHistoryDetails( */ @Operation(summary = "Get PNC beneficiary vital details from nurse") @PostMapping(value = { "/getBenVitalDetailsFrmNurse" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR') ") public String getBenVitalDetailsFrmNurse( @ApiParam(value = "{\"benRegID\":\"Long\",\"visitCode\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -247,7 +253,7 @@ public String getBenVitalDetailsFrmNurse( */ @Operation(summary = "Get PNC beneficiary examination details from nurse to doctor ") @PostMapping(value = { "/getBenExaminationDetailsPNC" }) - + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR') ") public String getBenExaminationDetailsPNC( @ApiParam(value = "{\"benRegID\":\"Long\",\"visitCode\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -279,6 +285,7 @@ public String getBenExaminationDetailsPNC( @Operation(summary = "Get PNC beneficiary case record") @PostMapping(value = { "/getBenCaseRecordFromDoctorPNC" }) @Transactional(rollbackFor = Exception.class) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR') ") public String getBenCaseRecordFromDoctorPNC( @ApiParam(value = "{\"benRegID\":\"Long\",\"visitCode\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -305,6 +312,7 @@ public String getBenCaseRecordFromDoctorPNC( @Operation(summary = "Update PNC care data in doctor screen") @PostMapping(value = { "/update/PNCScreen" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR') ") public String updatePNCCareNurse(@RequestBody String requestObj) { OutputResponse response = new OutputResponse(); @@ -335,6 +343,7 @@ public String updatePNCCareNurse(@RequestBody String requestObj) { */ @Operation(summary = "Update PNC beneficiary history in doctor screen") @PostMapping(value = { "/update/historyScreen" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR') ") public String updateHistoryNurse(@RequestBody String requestObj) { OutputResponse response = new OutputResponse(); @@ -365,6 +374,7 @@ public String updateHistoryNurse(@RequestBody String requestObj) { */ @Operation(summary = "Update PNC beneficiary vitals in doctor screen") @PostMapping(value = { "/update/vitalScreen" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR') ") public String updateVitalNurse(@RequestBody String requestObj) { OutputResponse response = new OutputResponse(); @@ -395,6 +405,7 @@ public String updateVitalNurse(@RequestBody String requestObj) { */ @Operation(summary = "Update PNC beneficiary examination data in doctor screen") @PostMapping(value = { "/update/examinationScreen" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR') ") public String updateGeneralOPDExaminationNurse(@RequestBody String requestObj) { OutputResponse response = new OutputResponse(); @@ -418,6 +429,7 @@ public String updateGeneralOPDExaminationNurse(@RequestBody String requestObj) { @Operation(summary = "Update PNC doctor data") @PostMapping(value = { "/update/doctorData" }) + @PreAuthorize("hasRole('DOCTOR') ") public String updatePNCDoctorData(@RequestBody String requestObj, @RequestHeader(value = "Authorization") String authorization) { diff --git a/src/main/java/com/iemr/mmu/controller/quickconsult/QuickConsultController.java b/src/main/java/com/iemr/mmu/controller/quickconsult/QuickConsultController.java index 5b672df5..24df556c 100644 --- a/src/main/java/com/iemr/mmu/controller/quickconsult/QuickConsultController.java +++ b/src/main/java/com/iemr/mmu/controller/quickconsult/QuickConsultController.java @@ -25,6 +25,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.PostMapping; @@ -70,6 +71,7 @@ public void setQuickConsultationServiceImpl(QuickConsultationServiceImpl quickCo */ @Operation(summary = "Save quick consult nurse data") @PostMapping(value = { "/save/nurseData" }) + @PreAuthorize("hasRole('NURSE') ") public String saveBenQuickConsultDataNurse(@RequestBody String requestObj) { OutputResponse response = new OutputResponse(); try { @@ -102,6 +104,7 @@ public String saveBenQuickConsultDataNurse(@RequestBody String requestObj) { */ @Operation(summary = "Save quick consultation detail for doctor") @PostMapping(value = { "/save/doctorData" }) + @PreAuthorize("hasRole('DOCTOR') ") public String saveQuickConsultationDetail( @ApiParam(value = "{\"quickConsultation\":{\"beneficiaryRegID\":\"Long\",\"providerServiceMapID\": \"Integer\", \"benVisitID\":\"Long\", \"benChiefComplaint\":[{\"chiefComplaintID\":\"Integer\", " + "\"chiefComplaint\":\"String\", \"duration\":\"Integer\", \"unitOfDuration\":\"String\"}], \"description\":\"String\"" @@ -139,6 +142,7 @@ public String saveQuickConsultationDetail( @Operation(summary = "Get quick consult beneficiary visit details") @PostMapping(value = { "/getBenDataFrmNurseToDocVisitDetailsScreen" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR') ") public String getBenDataFrmNurseScrnToDocScrnVisitDetails( @ApiParam(value = "{\"benRegID\":\"Long\",\"visitCode\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -169,6 +173,7 @@ public String getBenDataFrmNurseScrnToDocScrnVisitDetails( */ @Operation(summary = "Get quick consult beneficiary vital details") @PostMapping(value = { "/getBenVitalDetailsFrmNurse" }) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR') ") public String getBenVitalDetailsFrmNurse( @ApiParam(value = "{\"benRegID\":\"Long\",\"visitCode\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -201,6 +206,7 @@ public String getBenVitalDetailsFrmNurse( @Operation(summary = "Get quick consult beneficiary case record") @PostMapping(value = { "/getBenCaseRecordFromDoctorQuickConsult" }) @Transactional(rollbackFor = Exception.class) + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR') ") public String getBenCaseRecordFromDoctorQuickConsult( @ApiParam(value = "{\"benRegID\":\"Long\",\"visitCode\":\"Long\"}") @RequestBody String comingRequest) { OutputResponse response = new OutputResponse(); @@ -227,6 +233,7 @@ public String getBenCaseRecordFromDoctorQuickConsult( @Operation(summary = "Update quick consult doctor data") @PostMapping(value = { "/update/doctorData" }) + @PreAuthorize("hasRole('DOCTOR') ") public String updateGeneralOPDQCDoctorData(@RequestBody String requestObj, @RequestHeader(value = "Authorization") String authorization) { diff --git a/src/main/java/com/iemr/mmu/controller/registrar/main/RegistrarController.java b/src/main/java/com/iemr/mmu/controller/registrar/main/RegistrarController.java index 89261c5b..ac6cf9c5 100644 --- a/src/main/java/com/iemr/mmu/controller/registrar/main/RegistrarController.java +++ b/src/main/java/com/iemr/mmu/controller/registrar/main/RegistrarController.java @@ -29,6 +29,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -82,6 +83,7 @@ public void setNurseServiceImpl(NurseServiceImpl nurseServiceImpl) { this.nurseServiceImpl = nurseServiceImpl; } + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR') || hasRole('REGISTRAR')") @Operation(summary = "Get registrar worklist data") @PostMapping(value = { "/registrarWorkListData" }) public String getRegistrarWorkList(@ApiParam(value = "{\"spID\": \"Integer\"}") @RequestBody String comingRequest) @@ -100,6 +102,7 @@ public String getRegistrarWorkList(@ApiParam(value = "{\"spID\": \"Integer\"}") return response.toString(); } + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR') || hasRole('REGISTRAR')") @Operation(summary = "Search for the beneficiary by beneficiary id") @PostMapping(value = { "/quickSearch" }) public String quickSearchBeneficiary( @@ -118,6 +121,7 @@ public String quickSearchBeneficiary( return response.toString(); } + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR') || hasRole('REGISTRAR')") @Operation(summary = "Search for the beneficiary based on provided data") @PostMapping(value = { "/advanceSearch" }) public String advanceSearch( @@ -138,6 +142,7 @@ public String advanceSearch( return response.toString(); } + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR') || hasRole('REGISTRAR')") @Operation(summary = "Get beneficiary details of given beneficiary registration id") @PostMapping(value = { "/get/benDetailsByRegID" }) public String getBenDetailsByRegID( @@ -167,6 +172,7 @@ public String getBenDetailsByRegID( return response.toString(); } + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR') || hasRole('LABTECHNICIAN') || hasRole('LAB_TECHNICIAN') || hasRole('PHARMACIST') || hasRole('REGISTRAR')") @Operation(summary = "Get beneficiary details") @PostMapping(value = { "/get/beneficiaryDetails" }) public String getBeneficiaryDetails( @@ -201,6 +207,7 @@ public String getBeneficiaryDetails( return response.toString(); } + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR') || hasRole('LABTECHNICIAN') || hasRole('LAB_TECHNICIAN') || hasRole('PHARMACIST')") @Operation(summary = "Get beneficiary image") @PostMapping(value = { "/get/beneficiaryImage" }) public String getBeneficiaryImage( @@ -226,6 +233,7 @@ public String getBeneficiaryImage( return response.toString(); } + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR') || hasRole('REGISTRAR')") @Operation(summary = "Search beneficiary for beneficiary id or beneficiary phone no") @PostMapping(value = { "/quickSearchNew" }) public String quickSearchNew(@RequestBody String requestObj, @@ -249,6 +257,7 @@ public String quickSearchNew(@RequestBody String requestObj, } + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR') || hasRole('REGISTRAR')") @Operation(summary = "Search beneficiary advance search new") @PostMapping(value = { "/advanceSearchNew" }) public String advanceSearchNew(@RequestBody String requestObj, @@ -272,6 +281,7 @@ public String advanceSearchNew(@RequestBody String requestObj, } + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR') || hasRole('LABTECHNICIAN') || hasRole('LAB_TECHNICIAN') || hasRole('PHARMACIST')") @Operation(summary = "Get beneficiary details for left side panel of given beneficiary registration id") @PostMapping(value = { "/get/benDetailsByRegIDForLeftPanelNew" }) public String getBenDetailsForLeftSidePanelByRegID( @@ -301,7 +311,8 @@ public String getBenDetailsForLeftSidePanelByRegID( } return response.toString(); } - + + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR') || hasRole('LABTECHNICIAN') || hasRole('LAB_TECHNICIAN') || hasRole('PHARMACIST')") @Operation(summary = "Get beneficiary image") @PostMapping(value = { "/getBenImage" }) public String getBenImage(@RequestBody String requestObj, @@ -319,6 +330,7 @@ public String getBenImage(@RequestBody String requestObj, } + @PreAuthorize("hasRole('NURSE') || hasRole('REGISTRAR')") @Operation(summary = "Register a new beneficiary") @PostMapping(value = { "/registrarBeneficaryRegistration" }) public String createBeneficiary( @@ -381,6 +393,7 @@ public String createBeneficiary( return response.toString(); } + @PreAuthorize("hasRole('NURSE') || hasRole('REGISTRAR')") @Operation(summary = "Register a new beneficiary API") @PostMapping(value = { "/registrarBeneficaryRegistrationNew" }) public String registrarBeneficaryRegistrationNew(@RequestBody String comingReq, @@ -399,6 +412,7 @@ public String registrarBeneficaryRegistrationNew(@RequestBody String comingReq, } + @PreAuthorize("hasRole('NURSE') || hasRole('REGISTRAR') || hasRole('DOCTOR')") @Operation(summary = "Update registered beneficiary data") @PostMapping(value = { "/update/BeneficiaryDetails" }) public String updateBeneficiary( @@ -457,6 +471,7 @@ public String updateBeneficiary( return response.toString(); } + @PreAuthorize("hasRole('NURSE') || hasRole('REGISTRAR')") @Operation(summary = "Registrar will submit a beneficiary to nurse for revisit") @PostMapping(value = { "/create/BenReVisitToNurse" }) public String createReVisitForBenToNurse(@RequestBody String requestOBJ) { @@ -478,6 +493,7 @@ public String createReVisitForBenToNurse(@RequestBody String requestOBJ) { return response.toString(); } + @PreAuthorize("hasRole('NURSE') || hasRole('REGISTRAR')") @Operation(summary = "Beneficiary edit, save or submit") @PostMapping(value = { "/update/BeneficiaryUpdate" }) public String beneficiaryUpdate(@RequestBody String requestOBJ, @@ -502,6 +518,7 @@ public String beneficiaryUpdate(@RequestBody String requestOBJ, return response.toString(); } + @PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR') || hasRole('REGISTRAR')") @Operation(summary = "Get master data for registrar") @PostMapping(value = { "/registrarMasterData" }) public String masterDataForRegistration( diff --git a/src/main/java/com/iemr/mmu/controller/reports/ReportGateway.java b/src/main/java/com/iemr/mmu/controller/reports/ReportGateway.java index 87d5c0de..8792b8c3 100644 --- a/src/main/java/com/iemr/mmu/controller/reports/ReportGateway.java +++ b/src/main/java/com/iemr/mmu/controller/reports/ReportGateway.java @@ -24,6 +24,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -41,6 +42,7 @@ @RestController @RequestMapping(value = "/report", headers = "Authorization") +@PreAuthorize("hasRole('NURSE') || hasRole('PHARMACIST') || hasRole('LABTECHNICIAN') || hasRole('DOCTOR') || hasRole('LAB_TECHNICIAN') || hasRole('TC_SPECIALIST') || hasRole('ONCOLOGIST') || hasRole('RADIOLOGIST')") public class ReportGateway { private Logger logger = LoggerFactory.getLogger(RegistrarController.class); diff --git a/src/main/java/com/iemr/mmu/controller/snomedct/SnomedController.java b/src/main/java/com/iemr/mmu/controller/snomedct/SnomedController.java index 8b79db37..38077310 100644 --- a/src/main/java/com/iemr/mmu/controller/snomedct/SnomedController.java +++ b/src/main/java/com/iemr/mmu/controller/snomedct/SnomedController.java @@ -24,6 +24,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -41,6 +42,7 @@ @RequestMapping(value = "/snomed") @RestController +@PreAuthorize("hasRole('NURSE') || hasRole('DOCTOR') ") public class SnomedController { private Logger logger = LoggerFactory.getLogger(SnomedController.class); diff --git a/src/main/java/com/iemr/mmu/controller/teleconsultation/TeleConsultationController.java b/src/main/java/com/iemr/mmu/controller/teleconsultation/TeleConsultationController.java index 5a5eea00..842f1dca 100644 --- a/src/main/java/com/iemr/mmu/controller/teleconsultation/TeleConsultationController.java +++ b/src/main/java/com/iemr/mmu/controller/teleconsultation/TeleConsultationController.java @@ -24,6 +24,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; import com.iemr.mmu.utils.JwtUtil; import org.springframework.web.bind.annotation.PostMapping; @@ -31,7 +32,7 @@ import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; - +import com.iemr.mmu.utils.JwtUtil; import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; @@ -44,6 +45,7 @@ @RestController @RequestMapping(value = "/tc", headers = "Authorization", consumes = "application/json", produces = "application/json") +@PreAuthorize("hasRole('TCSPECIALIST') || hasRole('TC_SPECIALIST') ") public class TeleConsultationController { private Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName()); diff --git a/src/main/java/com/iemr/mmu/repo/login/UserLoginRepo.java b/src/main/java/com/iemr/mmu/repo/login/UserLoginRepo.java index b4cc7fa0..6f6390ee 100644 --- a/src/main/java/com/iemr/mmu/repo/login/UserLoginRepo.java +++ b/src/main/java/com/iemr/mmu/repo/login/UserLoginRepo.java @@ -1,5 +1,7 @@ package com.iemr.mmu.repo.login; +import java.util.List; + import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.query.Param; @@ -13,4 +15,7 @@ public interface UserLoginRepo extends CrudRepository { @Query(" SELECT u FROM Users u WHERE u.userID = :userID AND u.deleted = false ") public Users getUserByUserID(@Param("userID") Long userID); + @Query(nativeQuery = true,value = "select rolename from m_role where roleid in (select roleid from m_userservicerolemapping where userid=:userID)") + List getRoleNamebyUserId(@Param("userID") Long userID); + } diff --git a/src/main/java/com/iemr/mmu/utils/JwtAuthenticationUtil.java b/src/main/java/com/iemr/mmu/utils/JwtAuthenticationUtil.java index 83711a10..9733900e 100644 --- a/src/main/java/com/iemr/mmu/utils/JwtAuthenticationUtil.java +++ b/src/main/java/com/iemr/mmu/utils/JwtAuthenticationUtil.java @@ -2,6 +2,7 @@ import java.util.Optional; import java.util.concurrent.TimeUnit; +import java.util.List; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -76,6 +77,10 @@ public boolean validateUserIdAndJwtToken(String jwtToken) throws IEMRException { // Check if user data is present in Redis Users user = getUserFromCache(userId); + if(user != null) { + // Store roles in security context or cache for authorization + List roles = getUserRoles(user.getUserID()); + } if (user == null) { // If not in Redis, fetch from DB and cache the result user = fetchUserFromDB(userId); @@ -129,4 +134,19 @@ private Users fetchUserFromDB(String userId) { return null; } + + public List getUserRoles(Long userId) throws IEMRException { + if (null == userId || userId <= 0) { + throw new IEMRException("Invalid User ID : " + userId); + } + try { + List role = userLoginRepo.getRoleNamebyUserId(userId); + if (null == role || role.isEmpty()) { + throw new IEMRException("No role found for userId : " + userId); + } + return role; + } catch (Exception e) { + throw new IEMRException("Failed to retrieverole for usedId : " + userId + " error : " + e.getMessage()); + } + } } diff --git a/src/main/java/com/iemr/mmu/utils/JwtUtil.java b/src/main/java/com/iemr/mmu/utils/JwtUtil.java index ee6ee025..4774233c 100644 --- a/src/main/java/com/iemr/mmu/utils/JwtUtil.java +++ b/src/main/java/com/iemr/mmu/utils/JwtUtil.java @@ -2,11 +2,9 @@ import java.util.function.Function; import javax.crypto.SecretKey; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; - import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.security.Keys; @@ -59,7 +57,7 @@ public T extractClaim(String token, Function claimsResolver) { return claims != null ? claimsResolver.apply(claims) : null; } - private Claims extractAllClaims(String token) { + public Claims extractAllClaims(String token) { return Jwts.parser() .verifyWith(getSigningKey()) .build() diff --git a/src/main/java/com/iemr/mmu/utils/exception/CustomAccessDeniedHandler.java b/src/main/java/com/iemr/mmu/utils/exception/CustomAccessDeniedHandler.java new file mode 100644 index 00000000..4a53a12f --- /dev/null +++ b/src/main/java/com/iemr/mmu/utils/exception/CustomAccessDeniedHandler.java @@ -0,0 +1,28 @@ +package com.iemr.mmu.utils.exception; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.web.access.AccessDeniedHandler; +import org.springframework.stereotype.Component; + +import com.fasterxml.jackson.databind.ObjectMapper; + +import java.io.IOException; +import java.util.Map; + +@Component +public class CustomAccessDeniedHandler implements AccessDeniedHandler { + + private static final ObjectMapper mapper = new ObjectMapper(); + @Override + public void handle(HttpServletRequest request, + HttpServletResponse response, + AccessDeniedException accessDeniedException) throws IOException { + response.setStatus(HttpServletResponse.SC_FORBIDDEN); // 403 + response.setContentType("application/json"); + Map errorResponse = Map.of("error" , "Forbidden", + "message","Access denied"); + response.getWriter().write(mapper.writeValueAsString(errorResponse)); + } +} \ No newline at end of file diff --git a/src/main/java/com/iemr/mmu/utils/exception/CustomAuthenticationEntryPoint.java b/src/main/java/com/iemr/mmu/utils/exception/CustomAuthenticationEntryPoint.java new file mode 100644 index 00000000..9a297fa2 --- /dev/null +++ b/src/main/java/com/iemr/mmu/utils/exception/CustomAuthenticationEntryPoint.java @@ -0,0 +1,28 @@ +package com.iemr.mmu.utils.exception; + +import java.io.IOException; + +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.AuthenticationEntryPoint; +import org.springframework.stereotype.Component; + +import com.google.gson.JsonObject; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +@Component +public class CustomAuthenticationEntryPoint implements AuthenticationEntryPoint { + + @Override + public void commence(HttpServletRequest request, + HttpServletResponse response, + AuthenticationException authException) throws IOException { + response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); // 401 + response.setContentType("application/json"); + JsonObject json = new JsonObject(); + json.addProperty("error", "Unauthorized"); + json.addProperty("message", authException.getMessage()); + response.getWriter().write(json.toString()); + } +} \ No newline at end of file diff --git a/src/main/java/com/iemr/mmu/utils/mapper/RoleAuthenticationFilter.java b/src/main/java/com/iemr/mmu/utils/mapper/RoleAuthenticationFilter.java new file mode 100644 index 00000000..a28035e3 --- /dev/null +++ b/src/main/java/com/iemr/mmu/utils/mapper/RoleAuthenticationFilter.java @@ -0,0 +1,103 @@ +package com.iemr.mmu.utils.mapper; + +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; + +import com.iemr.mmu.service.common.transaction.CommonServiceImpl; +import com.iemr.mmu.service.login.IemrMmuLoginServiceImpl; +import com.iemr.mmu.utils.CookieUtil; +import com.iemr.mmu.utils.JwtAuthenticationUtil; +import com.iemr.mmu.utils.JwtUserIdValidationFilter; +import com.iemr.mmu.utils.JwtUtil; +import com.iemr.mmu.utils.redis.RedisStorage; + +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.io.IOException; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.Cookie; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + +@Component +public class RoleAuthenticationFilter extends OncePerRequestFilter { + Logger logger = LoggerFactory.getLogger(this.getClass().getSimpleName()); + + @Autowired + private JwtUtil jwtUtil; + + @Autowired + private RedisStorage redisService; + + @Autowired + private JwtAuthenticationUtil userService; + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) + throws ServletException, IOException, java.io.IOException { + List authRoles = null; + try { + String jwtFromCookie = CookieUtil.getJwtTokenFromCookie(request); + String jwtFromHeader = request.getHeader("Jwttoken"); + + String jwtToken = jwtFromCookie != null ? jwtFromCookie : jwtFromHeader; + if(null == jwtToken || jwtToken.trim().isEmpty()) { + filterChain.doFilter(request, response); + return; + } + Claims extractAllClaims = jwtUtil.extractAllClaims(jwtToken); + if(null == extractAllClaims) { + filterChain.doFilter(request, response); + return; + } + Object userIdObj = extractAllClaims.get("userId"); + String userId = userIdObj != null ? userIdObj.toString() : null; + if (null == userId || userId.trim().isEmpty()) { + filterChain.doFilter(request, response); + return; + } + Long userIdLong; + try { + userIdLong=Long.valueOf(userId); + }catch (NumberFormatException ex) { + logger.warn("Invalid userId format: {}",userId); + filterChain.doFilter(request, response); + return; + } + authRoles = redisService.getUserRoleFromCache(userIdLong); + if (authRoles == null || authRoles.isEmpty()) { + List roles = userService.getUserRoles(userIdLong); // assuming this returns multiple roles + authRoles = roles.stream() + .filter(Objects::nonNull) + .map(String::trim) + .map(role -> "ROLE_" + role.toUpperCase().replace(" ", "_")) + .collect(Collectors.toList()); + redisService.cacheUserRoles(userIdLong, authRoles); + } + + List authorities = authRoles.stream() + .map(SimpleGrantedAuthority::new) + .collect(Collectors.toList()); + + UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(userId, null, authorities); + SecurityContextHolder.getContext().setAuthentication(auth); + } catch (Exception e) { + logger.error("Authentication filter error for request {}: {}", request.getRequestURI(), e.getMessage()); + SecurityContextHolder.clearContext(); + } finally { + filterChain.doFilter(request, response); + } + + } +} \ No newline at end of file diff --git a/src/main/java/com/iemr/mmu/utils/mapper/SecurityConfig.java b/src/main/java/com/iemr/mmu/utils/mapper/SecurityConfig.java new file mode 100644 index 00000000..3fe096d2 --- /dev/null +++ b/src/main/java/com/iemr/mmu/utils/mapper/SecurityConfig.java @@ -0,0 +1,53 @@ +package com.iemr.mmu.utils.mapper; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; +import org.springframework.security.web.csrf.CookieCsrfTokenRepository; + +import com.iemr.mmu.utils.exception.CustomAuthenticationEntryPoint; +import com.iemr.mmu.utils.exception.CustomAccessDeniedHandler; + + +@Configuration +@EnableMethodSecurity +@EnableWebSecurity +public class SecurityConfig { + private final RoleAuthenticationFilter roleAuthenticationFilter; + private final CustomAuthenticationEntryPoint customAuthenticationEntryPoint; + private final CustomAccessDeniedHandler customAccessDeniedHandler; + + public SecurityConfig(RoleAuthenticationFilter roleAuthenticationFilter, + CustomAuthenticationEntryPoint customAuthenticationEntryPoint, + CustomAccessDeniedHandler customAccessDeniedHandler) { + this.roleAuthenticationFilter = roleAuthenticationFilter; + this.customAuthenticationEntryPoint = customAuthenticationEntryPoint; + this.customAccessDeniedHandler = customAccessDeniedHandler; + } + +@Bean +public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { + CookieCsrfTokenRepository csrfTokenRepository = new CookieCsrfTokenRepository(); + csrfTokenRepository.setCookieHttpOnly(true); + csrfTokenRepository.setCookiePath("/"); + http + .csrf(csrf -> csrf.disable()) + .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) + .authorizeHttpRequests(auth -> auth + .requestMatchers("/user/**").permitAll() + .anyRequest().authenticated() + ) + .exceptionHandling(ex -> ex + .authenticationEntryPoint(customAuthenticationEntryPoint) + .accessDeniedHandler(customAccessDeniedHandler) + ) + .addFilterBefore(roleAuthenticationFilter, UsernamePasswordAuthenticationFilter.class); + + return http.build(); +} +} diff --git a/src/main/java/com/iemr/mmu/utils/redis/RedisStorage.java b/src/main/java/com/iemr/mmu/utils/redis/RedisStorage.java index 5e80ac6d..ed8d170e 100644 --- a/src/main/java/com/iemr/mmu/utils/redis/RedisStorage.java +++ b/src/main/java/com/iemr/mmu/utils/redis/RedisStorage.java @@ -21,12 +21,15 @@ */ package com.iemr.mmu.utils.redis; +import java.util.List; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisStringCommands.SetOption; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.types.Expiration; import org.springframework.stereotype.Component; @@ -106,4 +109,27 @@ public String updateObject(String key, String value , int expirationTime) throws return key; } + @Autowired + private RedisTemplate redisTemplate; + + public void cacheUserRoles(Long userId, List roles) { + try { + String key = "roles:" + userId; + redisTemplate.delete(key); // Clear previous cache + redisTemplate.opsForList().rightPushAll(key, roles); + } catch (Exception e) { + logger.warn("Failed to cache role for user {} : {} ", userId, e.getMessage()); + } + + } + + public List getUserRoleFromCache(Long userId) { + try { + return redisTemplate.opsForList().range("roles:" + userId, 0, -1); + } catch (Exception e) { + logger.warn("Failed to retrieve cached role for user {} : {} ", userId, e.getMessage()); + return null; + } + } + } From da3b740ecd143dd963e1164a3ddda88b75cb8c8e Mon Sep 17 00:00:00 2001 From: 5Amogh Date: Thu, 4 Dec 2025 17:34:49 +0530 Subject: [PATCH 47/47] fix: test cases errors fixed --- .../mmu/service/anc/ANCServiceImplTest.java | 43 +++++++++++-------- .../CommonBenStatusFlowServiceImplTest.java | 30 ++++++------- .../generalOPD/GeneralOPDServiceImplTest.java | 18 ++++---- .../QuickConsultationServiceImplTest.java | 18 +++++--- 4 files changed, 62 insertions(+), 47 deletions(-) diff --git a/src/test/java/com/iemr/mmu/service/anc/ANCServiceImplTest.java b/src/test/java/com/iemr/mmu/service/anc/ANCServiceImplTest.java index f901ec9c..524eef0a 100644 --- a/src/test/java/com/iemr/mmu/service/anc/ANCServiceImplTest.java +++ b/src/test/java/com/iemr/mmu/service/anc/ANCServiceImplTest.java @@ -48,6 +48,13 @@ import java.util.*; import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.argThat; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.*; class ANCServiceImplTest { @@ -696,11 +703,11 @@ void testUpdateANCDoctorData_allBranchesSuccess() throws Exception { when(commonDoctorServiceImpl.callTmForSpecialistSlotBook(any(), any())).thenReturn(1); when(teleConsultationServiceImpl.createTCRequest(any())).thenReturn(1); when(commonDoctorServiceImpl.updateDocFindings(any())).thenReturn(1); - when(commonDoctorServiceImpl.updateBenFlowtableAfterDocDataUpdate(any(), anyBoolean(), anyBoolean(), any())).thenReturn(1); + when(commonDoctorServiceImpl.updateBenFlowtableAfterDocDataUpdate(any(), anyBoolean(), anyBoolean(), any(),null)).thenReturn(1); when(commonNurseServiceImpl.updatePrescription(any())).thenReturn(1); when(ancDoctorServiceImpl.updateBenANCDiagnosis(any())).thenReturn(1); when(commonNurseServiceImpl.saveBenInvestigation(any())).thenReturn(1L); - when(commonNurseServiceImpl.saveBenPrescribedDrugsList(any())).thenReturn(1); + when(commonNurseServiceImpl.saveBenPrescribedDrugsList(any())).thenReturn(new HashMap()); when(commonDoctorServiceImpl.updateBenReferDetails(any())).thenReturn(1L); try { @@ -726,11 +733,11 @@ void testUpdateANCDoctorData_failureBranches() throws Exception { when(commonDoctorServiceImpl.callTmForSpecialistSlotBook(any(), any())).thenReturn(0); when(teleConsultationServiceImpl.createTCRequest(any())).thenReturn(0); when(commonDoctorServiceImpl.updateDocFindings(any())).thenReturn(0); - when(commonDoctorServiceImpl.updateBenFlowtableAfterDocDataUpdate(any(), anyBoolean(), anyBoolean(), any())).thenReturn(0); + when(commonDoctorServiceImpl.updateBenFlowtableAfterDocDataUpdate(any(), anyBoolean(), anyBoolean(), any(),null)).thenReturn(0); when(commonNurseServiceImpl.updatePrescription(any())).thenReturn(0); when(ancDoctorServiceImpl.updateBenANCDiagnosis(any())).thenReturn(0); when(commonNurseServiceImpl.saveBenInvestigation(any())).thenReturn(0L); - when(commonNurseServiceImpl.saveBenPrescribedDrugsList(any())).thenReturn(0); + when(commonNurseServiceImpl.saveBenPrescribedDrugsList(any())).thenReturn(new HashMap()); when(commonDoctorServiceImpl.updateBenReferDetails(any())).thenReturn(0L); try { @@ -759,13 +766,13 @@ void testSaveANCDoctorData_allBranchesSuccess() throws Exception { when(commonDoctorServiceImpl.callTmForSpecialistSlotBook(any(), any())).thenReturn(1); when(teleConsultationServiceImpl.createTCRequest(any())).thenReturn(1); when(commonDoctorServiceImpl.saveDocFindings(any())).thenReturn(1); - when(commonDoctorServiceImpl.updateBenFlowtableAfterDocDataSave(any(), anyBoolean(), anyBoolean(), any())).thenReturn(1); + when(commonDoctorServiceImpl.updateBenFlowtableAfterDocDataSave(any(), anyBoolean(), anyBoolean(), any(),null)).thenReturn(1); when(commonNurseServiceImpl.savePrescriptionDetailsAndGetPrescriptionID( any(Long.class), any(Long.class), any(Integer.class), any(String.class), any(String.class), any(Long.class), any(Integer.class), any(Integer.class), any(ArrayList.class) )).thenReturn(1L); when(commonNurseServiceImpl.saveBenInvestigation(any())).thenReturn(1L); - when(commonNurseServiceImpl.saveBenPrescribedDrugsList(any())).thenReturn(1); + when(commonNurseServiceImpl.saveBenPrescribedDrugsList(any())).thenReturn(new HashMap()); when(ancDoctorServiceImpl.saveBenANCDiagnosis(any(), any())).thenReturn(1L); when(commonDoctorServiceImpl.saveBenReferDetails(any())).thenReturn(1L); @@ -793,13 +800,13 @@ void testSaveANCDoctorData_failureBranches() throws Exception { when(commonDoctorServiceImpl.callTmForSpecialistSlotBook(any(), any())).thenReturn(0); when(teleConsultationServiceImpl.createTCRequest(any())).thenReturn(0); when(commonDoctorServiceImpl.saveDocFindings(any())).thenReturn(0); - when(commonDoctorServiceImpl.updateBenFlowtableAfterDocDataSave(any(), anyBoolean(), anyBoolean(), any())).thenReturn(0); + when(commonDoctorServiceImpl.updateBenFlowtableAfterDocDataSave(any(), anyBoolean(), anyBoolean(), any(),null)).thenReturn(0); when(commonNurseServiceImpl.savePrescriptionDetailsAndGetPrescriptionID( any(Long.class), any(Long.class), any(Integer.class), any(String.class), any(String.class), any(Long.class), any(Integer.class), any(Integer.class), any(ArrayList.class) )).thenReturn(0L); when(commonNurseServiceImpl.saveBenInvestigation(any())).thenReturn(0L); - when(commonNurseServiceImpl.saveBenPrescribedDrugsList(any())).thenReturn(0); + when(commonNurseServiceImpl.saveBenPrescribedDrugsList(any())).thenReturn(new HashMap()); when(ancDoctorServiceImpl.saveBenANCDiagnosis(any(), any())).thenReturn(0L); when(commonDoctorServiceImpl.saveBenReferDetails(any())).thenReturn(0L); @@ -1099,10 +1106,10 @@ void testUpdateANCDoctorData_allBranches() throws Exception { // Mock all service calls to return success when(doctorService.updateDocFindings(any())).thenReturn(1); - when(doctorService.updateBenFlowtableAfterDocDataUpdate(any(), anyBoolean(), anyBoolean(), any())).thenReturn(1); + when(doctorService.updateBenFlowtableAfterDocDataUpdate(any(), anyBoolean(), anyBoolean(), any(),null)).thenReturn(1); when(nurseService.savePrescriptionDetailsAndGetPrescriptionID(any(), any(), any(), any(), any(), any(), any(), any(), any())).thenReturn(1L); when(nurseService.saveBenInvestigation(any())).thenReturn(1L); - when(nurseService.saveBenPrescribedDrugsList(any())).thenReturn(1); + when(nurseService.saveBenPrescribedDrugsList(any())).thenReturn(new HashMap()); when(ancDoctorService.updateBenANCDiagnosis(any())).thenReturn(1); when(doctorService.updateBenReferDetails(any())).thenReturn(1L); @@ -1244,10 +1251,10 @@ void testSaveANCDoctorData_comprehensiveSuccess() throws Exception { when(doctorService.callTmForSpecialistSlotBook(any(), any())).thenReturn(1); when(teleService.createTCRequest(any())).thenReturn(1); when(doctorService.saveDocFindings(any())).thenReturn(1); - when(doctorService.updateBenFlowtableAfterDocDataSave(any(), anyBoolean(), anyBoolean(), any())).thenReturn(1); + when(doctorService.updateBenFlowtableAfterDocDataSave(any(), anyBoolean(), anyBoolean(), any(),null)).thenReturn(1); when(nurseService.savePrescriptionDetailsAndGetPrescriptionID(any(), any(), any(), any(), any(), any(), any(), any(), any())).thenReturn(1L); when(nurseService.saveBenInvestigation(any())).thenReturn(1L); - when(nurseService.saveBenPrescribedDrugsList(any())).thenReturn(1); + when(nurseService.saveBenPrescribedDrugsList(any())).thenReturn(new HashMap()); when(ancDoctorService.saveBenANCDiagnosis(any(), any())).thenReturn(1L); when(doctorService.saveBenReferDetails(any())).thenReturn(1L); @@ -1338,9 +1345,9 @@ void testSaveANCDoctorData_prescriptionLogic() throws Exception { when(doctorService.saveDocFindings(any())).thenReturn(1); when(nurseService.savePrescriptionDetailsAndGetPrescriptionID(any(), any(), any(), any(), any(), any(), any(), any(), any())).thenReturn(100L); when(nurseService.saveBenInvestigation(any())).thenReturn(1L); - when(nurseService.saveBenPrescribedDrugsList(any())).thenReturn(1); + when(nurseService.saveBenPrescribedDrugsList(any())).thenReturn(new HashMap()); when(ancDoctorService.saveBenANCDiagnosis(any(), any())).thenReturn(1L); - when(doctorService.updateBenFlowtableAfterDocDataSave(any(), anyBoolean(), anyBoolean(), any())).thenReturn(1); + when(doctorService.updateBenFlowtableAfterDocDataSave(any(), anyBoolean(), anyBoolean(), any(),null)).thenReturn(1); Long result = service.saveANCDoctorData(obj, "auth"); assertNotNull(result); @@ -1405,9 +1412,9 @@ void testSaveANCDoctorData_prescriptionDrugDetailProcessing() throws Exception { when(doctorService.saveDocFindings(any())).thenReturn(1); when(nurseService.savePrescriptionDetailsAndGetPrescriptionID(any(), any(), any(), any(), any(), any(), any(), any(), any())).thenReturn(999L); when(nurseService.saveBenInvestigation(any())).thenReturn(1L); - when(nurseService.saveBenPrescribedDrugsList(any())).thenReturn(2); // Return > 0 + when(nurseService.saveBenPrescribedDrugsList(any())).thenReturn(new HashMap()); when(ancDoctorService.saveBenANCDiagnosis(any(), any())).thenReturn(1L); - when(doctorService.updateBenFlowtableAfterDocDataSave(any(), anyBoolean(), anyBoolean(), any())).thenReturn(1); + when(doctorService.updateBenFlowtableAfterDocDataSave(any(), anyBoolean(), anyBoolean(), any(),null)).thenReturn(1); Long result = service.saveANCDoctorData(obj, "auth"); assertNotNull(result); @@ -1476,9 +1483,9 @@ void testUpdateANCDoctorData_prescriptionCoverage() throws Exception { when(nurseService.updatePrescription(any())).thenReturn(1); when(ancDoctorService.updateBenANCDiagnosis(any())).thenReturn(1); when(nurseService.saveBenInvestigation(any())).thenReturn(1L); - when(nurseService.saveBenPrescribedDrugsList(any())).thenReturn(1); + when(nurseService.saveBenPrescribedDrugsList(any())).thenReturn(new HashMap()); when(doctorService.updateBenReferDetails(any())).thenReturn(1L); - when(doctorService.updateBenFlowtableAfterDocDataUpdate(any(), anyBoolean(), anyBoolean(), any())).thenReturn(1); + when(doctorService.updateBenFlowtableAfterDocDataUpdate(any(), anyBoolean(), anyBoolean(), any(), null)).thenReturn(1); // Call method - should cover prescription array processing service.updateANCDoctorData(obj, "auth"); diff --git a/src/test/java/com/iemr/mmu/service/benFlowStatus/CommonBenStatusFlowServiceImplTest.java b/src/test/java/com/iemr/mmu/service/benFlowStatus/CommonBenStatusFlowServiceImplTest.java index 95ab4418..4c4cc2c4 100644 --- a/src/test/java/com/iemr/mmu/service/benFlowStatus/CommonBenStatusFlowServiceImplTest.java +++ b/src/test/java/com/iemr/mmu/service/benFlowStatus/CommonBenStatusFlowServiceImplTest.java @@ -390,7 +390,7 @@ void testUpdateBenFlowNurseAfterNurseUpdateNCD_Screening_Exception() { @Test @DisplayName("Test updateBenFlowAfterDocData - Success") - void testUpdateBenFlowAfterDocData_Success() { + void testUpdateBenFlowAfterDocData_Success() throws Exception { // Arrange Long benFlowID = 1L; Long benRegID = 1L; @@ -404,12 +404,12 @@ void testUpdateBenFlowAfterDocData_Success() { Timestamp tcDate = new Timestamp(System.currentTimeMillis()); when(beneficiaryFlowStatusRepo.updateBenFlowStatusAfterDoctorActivity( - benFlowID, benRegID, benID, docFlag, pharmaFlag, oncologistFlag, tcSpecialistFlag, tcUserID, tcDate)) + benFlowID, benRegID, benID, docFlag, pharmaFlag, oncologistFlag, tcSpecialistFlag, tcUserID, tcDate, null)) .thenReturn(1); // Act int result = commonBenStatusFlowService.updateBenFlowAfterDocData( - benFlowID, benRegID, benID, benVisitID, docFlag, pharmaFlag, oncologistFlag, tcSpecialistFlag, tcUserID, tcDate); + benFlowID, benRegID, benID, benVisitID, docFlag, pharmaFlag, oncologistFlag, tcSpecialistFlag, tcUserID, tcDate, null); // Assert assertEquals(1, result); @@ -417,7 +417,7 @@ void testUpdateBenFlowAfterDocData_Success() { @Test @DisplayName("Test updateBenFlowAfterDocData - Exception") - void testUpdateBenFlowAfterDocData_Exception() { + void testUpdateBenFlowAfterDocData_Exception() throws Exception { // Arrange Long benFlowID = 1L; Long benRegID = 1L; @@ -431,12 +431,12 @@ void testUpdateBenFlowAfterDocData_Exception() { Timestamp tcDate = new Timestamp(System.currentTimeMillis()); when(beneficiaryFlowStatusRepo.updateBenFlowStatusAfterDoctorActivity( - benFlowID, benRegID, benID, docFlag, pharmaFlag, oncologistFlag, tcSpecialistFlag, tcUserID, tcDate)) + benFlowID, benRegID, benID, docFlag, pharmaFlag, oncologistFlag, tcSpecialistFlag, tcUserID, tcDate, null)) .thenThrow(new RuntimeException("Database error")); // Act int result = commonBenStatusFlowService.updateBenFlowAfterDocData( - benFlowID, benRegID, benID, benVisitID, docFlag, pharmaFlag, oncologistFlag, tcSpecialistFlag, tcUserID, tcDate); + benFlowID, benRegID, benID, benVisitID, docFlag, pharmaFlag, oncologistFlag, tcSpecialistFlag, tcUserID, tcDate, null); // Assert assertEquals(0, result); @@ -459,12 +459,12 @@ void testUpdateBenFlowAfterDocDataUpdate_SuccessWithExistingPharmaFlag() throws when(beneficiaryFlowStatusRepo.getPharmaFlag(benFlowID)).thenReturn((short) 1); when(beneficiaryFlowStatusRepo.updateBenFlowStatusAfterDoctorActivity( - benFlowID, benRegID, benID, docFlag, (short) 1, oncologistFlag, tcSpecialistFlag, tcUserID, tcDate)) + benFlowID, benRegID, benID, docFlag, (short) 1, oncologistFlag, tcSpecialistFlag, tcUserID, tcDate, null)) .thenReturn(1); // Act int result = commonBenStatusFlowService.updateBenFlowAfterDocDataUpdate( - benFlowID, benRegID, benID, benVisitID, docFlag, pharmaFlag, oncologistFlag, tcSpecialistFlag, tcUserID, tcDate); + benFlowID, benRegID, benID, benVisitID, docFlag, pharmaFlag, oncologistFlag, tcSpecialistFlag, tcUserID, tcDate, null); // Assert assertEquals(1, result); @@ -487,12 +487,12 @@ void testUpdateBenFlowAfterDocDataUpdate_SuccessWithNewPharmaFlag() throws Excep when(beneficiaryFlowStatusRepo.getPharmaFlag(benFlowID)).thenReturn((short) 0); when(beneficiaryFlowStatusRepo.updateBenFlowStatusAfterDoctorActivity( - benFlowID, benRegID, benID, docFlag, pharmaFlag, oncologistFlag, tcSpecialistFlag, tcUserID, tcDate)) + benFlowID, benRegID, benID, docFlag, pharmaFlag, oncologistFlag, tcSpecialistFlag, tcUserID, tcDate, null)) .thenReturn(1); // Act int result = commonBenStatusFlowService.updateBenFlowAfterDocDataUpdate( - benFlowID, benRegID, benID, benVisitID, docFlag, pharmaFlag, oncologistFlag, tcSpecialistFlag, tcUserID, tcDate); + benFlowID, benRegID, benID, benVisitID, docFlag, pharmaFlag, oncologistFlag, tcSpecialistFlag, tcUserID, tcDate, null); // Assert assertEquals(1, result); @@ -519,7 +519,7 @@ void testUpdateBenFlowAfterDocDataUpdate_Exception() { // Act & Assert Exception exception = assertThrows(Exception.class, () -> { commonBenStatusFlowService.updateBenFlowAfterDocDataUpdate( - benFlowID, benRegID, benID, benVisitID, docFlag, pharmaFlag, oncologistFlag, tcSpecialistFlag, tcUserID, tcDate); + benFlowID, benRegID, benID, benVisitID, docFlag, pharmaFlag, oncologistFlag, tcSpecialistFlag, tcUserID, tcDate, null); }); assertNotNull(exception); @@ -541,12 +541,12 @@ void testUpdateBenFlowAfterDocDataUpdateWDF_Success() throws Exception { when(beneficiaryFlowStatusRepo.getPharmaFlag(benFlowID)).thenReturn((short) 0); when(beneficiaryFlowStatusRepo.updateBenFlowStatusAfterDoctorActivityWDF( - benFlowID, benRegID, benID, docFlag, pharmaFlag, oncologistFlag, tcUserID, tcDate)) + benFlowID, benRegID, benID, docFlag, pharmaFlag, oncologistFlag, tcUserID, tcDate, null)) .thenReturn(1); // Act int result = commonBenStatusFlowService.updateBenFlowAfterDocDataUpdateWDF( - benFlowID, benRegID, benID, benVisitID, docFlag, pharmaFlag, oncologistFlag, tcUserID, tcDate); + benFlowID, benRegID, benID, benVisitID, docFlag, pharmaFlag, oncologistFlag, tcUserID, tcDate, null); // Assert assertEquals(1, result); @@ -569,12 +569,12 @@ void testUpdateBenFlowAfterDocDataUpdateTCSpecialist_Success() throws Exception when(beneficiaryFlowStatusRepo.getPharmaFlag(benFlowID)).thenReturn((short) 0); when(beneficiaryFlowStatusRepo.updateBenFlowStatusAfterDoctorActivityTCSpecialist( - benFlowID, benRegID, benID, pharmaFlag, oncologistFlag, tcSpecialistFlag)) + benFlowID, benRegID, benID, pharmaFlag, oncologistFlag, tcSpecialistFlag, null)) .thenReturn(1); // Act int result = commonBenStatusFlowService.updateBenFlowAfterDocDataUpdateTCSpecialist( - benFlowID, benRegID, benID, benVisitID, docFlag, pharmaFlag, oncologistFlag, tcSpecialistFlag, tcUserID, tcDate); + benFlowID, benRegID, benID, benVisitID, docFlag, pharmaFlag, oncologistFlag, tcSpecialistFlag, tcUserID, tcDate, null); // Assert assertEquals(1, result); diff --git a/src/test/java/com/iemr/mmu/service/generalOPD/GeneralOPDServiceImplTest.java b/src/test/java/com/iemr/mmu/service/generalOPD/GeneralOPDServiceImplTest.java index 51cc9560..32107a16 100644 --- a/src/test/java/com/iemr/mmu/service/generalOPD/GeneralOPDServiceImplTest.java +++ b/src/test/java/com/iemr/mmu/service/generalOPD/GeneralOPDServiceImplTest.java @@ -777,10 +777,10 @@ void saveDoctorData_success_allBranches() throws Exception { // (Assume InputMapper is static, so skip actual mapping in test) // Mock all service calls to return success - when(docService.updateBenFlowtableAfterDocDataSave(any(), anyBoolean(), anyBoolean(), any())).thenReturn(1); + when(docService.updateBenFlowtableAfterDocDataSave(any(), anyBoolean(), anyBoolean(), any(), null)).thenReturn(1); when(nurseService.saveBenPrescription(any())).thenReturn(2L); when(nurseService.saveBenInvestigation(any())).thenReturn(2L); - when(nurseService.saveBenPrescribedDrugsList(any())).thenReturn(2); + when(nurseService.saveBenPrescribedDrugsList(any())).thenReturn(new HashMap()); when(docService.saveDocFindings(any())).thenReturn(2); when(docService.saveBenReferDetails(any())).thenReturn(2L); @@ -828,10 +828,10 @@ void updateGeneralOPDDoctorData_success_allBranches() throws Exception { when(util.getCreatedBy()).thenReturn("1"); // Mock all service calls to return success - when(docService.updateBenFlowtableAfterDocDataUpdate(any(), anyBoolean(), anyBoolean(), any())).thenReturn(1); + when(docService.updateBenFlowtableAfterDocDataUpdate(any(), anyBoolean(), anyBoolean(), any(), null)).thenReturn(1); when(nurseService.updatePrescription(any())).thenReturn(2); when(nurseService.saveBenInvestigation(any())).thenReturn(2L); - when(nurseService.saveBenPrescribedDrugsList(any())).thenReturn(2); + when(nurseService.saveBenPrescribedDrugsList(any())).thenReturn(new HashMap()); when(docService.updateDocFindings(any())).thenReturn(2); when(docService.updateBenReferDetails(any())).thenReturn(2L); @@ -903,10 +903,10 @@ void updateGeneralOPDDoctorData_teleconsultationBranch_success() throws Exceptio // Mock slot booking and TC request creation when(docService.callTmForSpecialistSlotBook(any(), any())).thenReturn(1); when(teleService.createTCRequest(any())).thenReturn(1); - when(docService.updateBenFlowtableAfterDocDataUpdate(any(), anyBoolean(), anyBoolean(), any())).thenReturn(1); + when(docService.updateBenFlowtableAfterDocDataUpdate(any(), anyBoolean(), anyBoolean(), any(), null)).thenReturn(1); when(nurseService.updatePrescription(any())).thenReturn(2); when(nurseService.saveBenInvestigation(any())).thenReturn(2L); - when(nurseService.saveBenPrescribedDrugsList(any())).thenReturn(2); + when(nurseService.saveBenPrescribedDrugsList(any())).thenReturn(new HashMap()); when(docService.updateDocFindings(any())).thenReturn(2); when(docService.updateBenReferDetails(any())).thenReturn(2L); @@ -1043,10 +1043,10 @@ void saveDoctorData_teleconsultationBranch_success() throws Exception { // Mock service calls to return success values when(docService.callTmForSpecialistSlotBook(any(), any())).thenReturn(1); // Must return > 0 when(teleService.createTCRequest(any())).thenReturn(1); - when(docService.updateBenFlowtableAfterDocDataSave(any(), anyBoolean(), anyBoolean(), any())).thenReturn(1); + when(docService.updateBenFlowtableAfterDocDataSave(any(), anyBoolean(), anyBoolean(), any(), null)).thenReturn(1); when(nurseService.saveBenPrescription(any())).thenReturn(2L); when(nurseService.saveBenInvestigation(any())).thenReturn(2L); - when(nurseService.saveBenPrescribedDrugsList(any())).thenReturn(2); + when(nurseService.saveBenPrescribedDrugsList(any())).thenReturn(new HashMap()); when(docService.saveDocFindings(any())).thenReturn(2); when(docService.saveBenReferDetails(any())).thenReturn(2L); @@ -1173,7 +1173,7 @@ void updateGeneralOPDDoctorData_emptyPrescription_success() throws Exception { // Mock slot booking and TC request creation when(docService.callTmForSpecialistSlotBook(any(), any())).thenReturn(1); when(teleService.createTCRequest(any())).thenReturn(1); - when(docService.updateBenFlowtableAfterDocDataUpdate(any(), anyBoolean(), anyBoolean(), any())).thenReturn(1); + when(docService.updateBenFlowtableAfterDocDataUpdate(any(), anyBoolean(), anyBoolean(), any(), null)).thenReturn(1); when(nurseService.updatePrescription(any())).thenReturn(2); when(nurseService.saveBenInvestigation(any())).thenReturn(2L); when(docService.updateDocFindings(any())).thenReturn(2); diff --git a/src/test/java/com/iemr/mmu/service/quickConsultation/QuickConsultationServiceImplTest.java b/src/test/java/com/iemr/mmu/service/quickConsultation/QuickConsultationServiceImplTest.java index 9f2426e4..00f2c5bb 100644 --- a/src/test/java/com/iemr/mmu/service/quickConsultation/QuickConsultationServiceImplTest.java +++ b/src/test/java/com/iemr/mmu/service/quickConsultation/QuickConsultationServiceImplTest.java @@ -37,6 +37,14 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.anyList; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.ArgumentMatchers.anyShort; +import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.*; import static org.junit.jupiter.api.Assertions.*; import java.util.*; @@ -279,9 +287,9 @@ void testUpdateGeneralOPDQCDoctorData_basicFlow() throws Exception { obj.add("refer", new JsonObject()); // Mocks for TC request block when(commonNurseServiceImpl.updatePrescription(any())).thenReturn(1); - when(commonNurseServiceImpl.saveBenPrescribedDrugsList(anyList())).thenReturn(1); + when(commonNurseServiceImpl.saveBenPrescribedDrugsList(anyList())).thenReturn(new HashMap()); when(commonDoctorServiceImpl.updateBenClinicalObservations(any())).thenReturn(1); - when(commonDoctorServiceImpl.updateBenFlowtableAfterDocDataUpdate(any(), anyBoolean(), anyBoolean(), any())).thenReturn(1); + when(commonDoctorServiceImpl.updateBenFlowtableAfterDocDataUpdate(any(), anyBoolean(), anyBoolean(), any(),null)).thenReturn(1); when(commonDoctorServiceImpl.updateBenReferDetails(any())).thenReturn(1L); when(commonDoctorServiceImpl.callTmForSpecialistSlotBook(any(), anyString())).thenReturn(1); when(teleConsultationServiceImpl.createTCRequest(any())).thenReturn(1); @@ -321,7 +329,7 @@ void testQuickConsultDoctorDataInsert_tcRequestFlow() throws Exception { when(mockObs.getClinicalObservationID()).thenReturn(10L); when(commonNurseServiceImpl.saveBeneficiaryPrescription(any())).thenReturn(10L); when(commonDoctorServiceImpl.saveBenReferDetails(any())).thenReturn(1L); - when(commonDoctorServiceImpl.updateBenFlowtableAfterDocDataSave(any(), anyBoolean(), anyBoolean(), any())).thenReturn(1); + when(commonDoctorServiceImpl.updateBenFlowtableAfterDocDataSave(any(), anyBoolean(), anyBoolean(), any(), null)).thenReturn(1); when(commonDoctorServiceImpl.callTmForSpecialistSlotBook(any(), anyString())).thenReturn(1); when(teleConsultationServiceImpl.createTCRequest(any())).thenReturn(1); Integer result = service.quickConsultDoctorDataInsert(obj, "auth"); @@ -364,9 +372,9 @@ void testQuickConsultDoctorDataInsert_prescriptionBranch() throws Exception { when(mockObs.getClinicalObservationID()).thenReturn(10L); when(commonNurseServiceImpl.saveBeneficiaryPrescription(any())).thenReturn(10L); // Mock the prescription save branch - when(commonNurseServiceImpl.saveBenPrescribedDrugsList(anyList())).thenReturn(1); + when(commonNurseServiceImpl.saveBenPrescribedDrugsList(anyList())).thenReturn(new HashMap()); when(commonDoctorServiceImpl.saveBenReferDetails(any())).thenReturn(1L); - when(commonDoctorServiceImpl.updateBenFlowtableAfterDocDataSave(any(), anyBoolean(), anyBoolean(), any())).thenReturn(1); + when(commonDoctorServiceImpl.updateBenFlowtableAfterDocDataSave(any(), anyBoolean(), anyBoolean(), any(),null)).thenReturn(1); Integer result = service.quickConsultDoctorDataInsert(obj, "auth"); assertEquals(1, result); }