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 01/17] 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 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 02/17] 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 03/17] 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 04/17] 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 05/17] 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 06/17] 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 07/17] 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 08/17] 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 09/17] 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 10/17] 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 11/17] 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 12/17] 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 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 13/17] 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 14/17] 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 15/17] 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 16/17] 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: Tue, 9 Dec 2025 13:48:13 +0530 Subject: [PATCH 17/17] fix: Added proper space in the string --- .../mmu/service/common/transaction/CommonNurseServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 4c735a14..ffa35281 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 @@ -2918,7 +2918,7 @@ private double getQtyForOneDay(String form, String dose, String frequency) { } } else { if (frequency.equalsIgnoreCase("Single Dose") || frequency.equalsIgnoreCase("Stat Dose")|| - frequency.equalsIgnoreCase("Single Dose Before Food") || frequency.equalsIgnoreCase("Single Dose After Food")) { + frequency.equalsIgnoreCase("Single Dose Before Food") || frequency.equalsIgnoreCase("Single Dose After Food")) { if (form.equalsIgnoreCase("Tablet")) { if (dose.equalsIgnoreCase("Half Tab")) { qtyInOneDay = .5;