From fd206c8a8e8757364155233a2c9553c9ef999a81 Mon Sep 17 00:00:00 2001 From: Vanitha Date: Fri, 26 Sep 2025 05:30:04 +0530 Subject: [PATCH 1/9] fix: resolve the i_beneficiarymappig table issue --- .../GetDataFromVanAndSyncToDBImpl.java | 812 +++++++++++++----- 1 file changed, 582 insertions(+), 230 deletions(-) diff --git a/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java b/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java index e338ba17..d3791dd5 100644 --- a/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java +++ b/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java @@ -175,18 +175,49 @@ public String syncDataToServer(String requestOBJ, String Authorization) throws E } } - private boolean syncTablesInGroup(String schemaName, String currentTableName, - SyncUploadDataDigester originalDigester, List syncResults) { - SyncUploadDataDigester tableSpecificDigester = new SyncUploadDataDigester(); - tableSpecificDigester.setSchemaName(schemaName); - tableSpecificDigester.setTableName(currentTableName); - tableSpecificDigester.setSyncedBy(originalDigester.getSyncedBy()); - tableSpecificDigester.setFacilityID(originalDigester.getFacilityID()); - tableSpecificDigester.setVanAutoIncColumnName(originalDigester.getVanAutoIncColumnName()); - tableSpecificDigester.setServerColumns(originalDigester.getServerColumns()); - tableSpecificDigester.setSyncData(originalDigester.getSyncData()); - return performGenericTableSync(tableSpecificDigester, syncResults); +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); + tableSpecificDigester.setSyncedBy(originalDigester.getSyncedBy()); + tableSpecificDigester.setFacilityID(originalDigester.getFacilityID()); + tableSpecificDigester.setVanAutoIncColumnName(originalDigester.getVanAutoIncColumnName()); + tableSpecificDigester.setServerColumns(originalDigester.getServerColumns()); + tableSpecificDigester.setSyncData(filteredData); // Use filtered data + + return performGenericTableSync(tableSpecificDigester, syncResults); +} + + // private boolean syncTablesInGroup(String schemaName, String currentTableName, + // SyncUploadDataDigester originalDigester, List syncResults) { + // SyncUploadDataDigester tableSpecificDigester = new SyncUploadDataDigester(); + // tableSpecificDigester.setSchemaName(schemaName); + // tableSpecificDigester.setTableName(currentTableName); + // tableSpecificDigester.setSyncedBy(originalDigester.getSyncedBy()); + // tableSpecificDigester.setFacilityID(originalDigester.getFacilityID()); + // tableSpecificDigester.setVanAutoIncColumnName(originalDigester.getVanAutoIncColumnName()); + // tableSpecificDigester.setServerColumns(originalDigester.getServerColumns()); + // tableSpecificDigester.setSyncData(originalDigester.getSyncData()); + // return performGenericTableSync(tableSpecificDigester, syncResults); + // } private String update_M_BeneficiaryRegIdMapping_for_provisioned_benID( SyncUploadDataDigester syncUploadDataDigester, List syncResults) { @@ -301,274 +332,595 @@ 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<>(); + + // // 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 + + // boolean overallSuccess = true; + + // 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)); + // } + + // 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; + // } + // 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_itemstockentry": { + // if (cleanRecord.containsKey("FacilityID") && cleanRecord.get("FacilityID") instanceof Number) { + // Number mapFacilityID = (Number) cleanRecord.get("FacilityID"); + // if (mapFacilityID.intValue() == facilityIDFromDigester) { + // cleanRecord.put("Processed", "P"); + // } + // } + // break; + // } + // default: + // 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); + + // // 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 + // } + + // // 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 { + // // 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()); + // } + // } + + // 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); + + // // 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; + // } + // } + + // } 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)); + // } + // } + // } + + // // 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("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)); + // } + // } + // } + + // logger.info("Sync results for table {}: {}", syncTableName, syncResults); + // return insertSuccess && updateSuccess; + // } + +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<>(); + Map updateIndexMap = new HashMap<>(); + + boolean overallSuccess = true; + + if (dataToBesync == null || dataToBesync.isEmpty()) { + logger.info("No data to sync for table: {}", syncUploadDataDigester.getTableName()); + return true; + } - boolean overallSuccess = true; + String syncTableName = syncUploadDataDigester.getTableName(); + String vanAutoIncColumnName = syncUploadDataDigester.getVanAutoIncColumnName(); + String schemaName = syncUploadDataDigester.getSchemaName(); + Integer facilityIDFromDigester = syncUploadDataDigester.getFacilityID(); + String serverColumns = syncUploadDataDigester.getServerColumns(); + + // Clean and normalize server columns + List serverColumnsList = Arrays.asList(serverColumns.split(",")); + List cleanServerColumnsList = new ArrayList<>(); + for (String col : serverColumnsList) { + cleanServerColumnsList.add(col.trim()); + } - if (dataToBesync == null || dataToBesync.isEmpty()) { - logger.info("No data to sync for table: {}", syncUploadDataDigester.getTableName()); - return true; + // Find vanSerialIndex with better error handling + int vanSerialIndex = -1; + String normalizedVanAutoIncColumnName = vanAutoIncColumnName.trim(); + + // Try exact match first + vanSerialIndex = cleanServerColumnsList.indexOf(normalizedVanAutoIncColumnName); + + // If not found, try case-insensitive match + if (vanSerialIndex == -1) { + for (int i = 0; i < cleanServerColumnsList.size(); i++) { + if (cleanServerColumnsList.get(i).equalsIgnoreCase(normalizedVanAutoIncColumnName)) { + vanSerialIndex = i; + break; + } } - - 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(",")); - + } + + // If still not found, log error and return false + if (vanSerialIndex == -1) { + logger.error("VanAutoIncColumnName '{}' not found in serverColumns: {}. Available columns: {}", + vanAutoIncColumnName, serverColumns, cleanServerColumnsList); + + // Add failed sync results for all records 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 vanSerialNo = "UNKNOWN"; + if (map.containsKey(vanAutoIncColumnName)) { + vanSerialNo = String.valueOf(map.get(vanAutoIncColumnName)); + } + syncResults.add(new SyncResult(schemaName, syncTableName, vanSerialNo, + syncUploadDataDigester.getSyncedBy(), false, + "Column mapping error: " + vanAutoIncColumnName + " not found")); + } + return false; + } + + logger.info("Found vanAutoIncColumnName '{}' at index {} in serverColumns", vanAutoIncColumnName, vanSerialIndex); + + 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 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"); - } + // Get vanSerialNo with better error handling + String vanSerialNo = "UNKNOWN"; + if (cleanRecord.containsKey(normalizedVanAutoIncColumnName)) { + Object vanSerialValue = cleanRecord.get(normalizedVanAutoIncColumnName); + vanSerialNo = vanSerialValue != null ? String.valueOf(vanSerialValue) : "NULL"; + } else { + logger.warn("VanAutoIncColumnName '{}' not found in record data. Available keys: {}", + normalizedVanAutoIncColumnName, cleanRecord.keySet()); + } + + 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; } - 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": { + 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); + // Extract SyncFacilityID for checkRecordIsAlreadyPresentOrNot + 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 for vanSerialNo {}: {}", vanSerialNo, 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)); + 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); - } + // Prepare Object array for insert/update + List currentRecordValues = new ArrayList<>(); + for (String column : cleanServerColumnsList) { + Object value = cleanRecord.get(column); + if (value instanceof Boolean) { + currentRecordValues.add(value); + } else if (value != null) { + currentRecordValues.add(String.valueOf(value)); + } else { + currentRecordValues.add(null); } + } - 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(), true, null)); // Initially set as success + // Add to syncResults first, then track the index + int currentSyncResultIndex = syncResults.size(); + syncResults.add(new SyncResult(schemaName, syncTableName, vanSerialNo, + syncUploadDataDigester.getSyncedBy(), true, null)); - if (recordCheck == 0) { - // Record doesn't exist - INSERT - insertIndexMap.put(currentSyncResultIndex, syncDataListInsert.size()); - syncDataListInsert.add(objArr); + if (recordCheck == 0) { + // Record doesn't exist - INSERT + insertIndexMap.put(currentSyncResultIndex, syncDataListInsert.size()); + syncDataListInsert.add(objArr); + } else { + // Record exists - UPDATE + List updateParams = new ArrayList<>(Arrays.asList(objArr)); + updateParams.add(vanSerialNo); // Use the actual vanSerialNo value + + 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 { - // 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()); + updateParams.add(vanID); } + + updateIndexMap.put(currentSyncResultIndex, syncDataListUpdate.size()); + 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); + // Process INSERT operations + 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[] 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) { + logger.info("Successfully inserted record at index {}", insertListIndex); + } else { + // Failed - update the syncResults entry with concise reason + Object[] failedRecord = syncDataListInsert.get(insertListIndex); + String failedVanSerialNo = vanSerialIndex < failedRecord.length ? + String.valueOf(failedRecord[vanSerialIndex]) : "UNKNOWN"; + 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; } + } - } catch (Exception e) { - insertSuccess = false; - logger.error("Exception during insert for table {}: {}", syncTableName, e.getMessage(), e); + } 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); + 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]); + // 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(); + Object[] failedRecord = syncDataListInsert.get(insertListIndex); + String failedVanSerialNo = vanSerialIndex < failedRecord.length ? + String.valueOf(failedRecord[vanSerialIndex]) : "UNKNOWN"; - syncResults.set(syncResultIndex, new SyncResult(schemaName, syncTableName, vanSerialNo, - syncUploadDataDigester.getSyncedBy(), false, "INSERT: " + mainErrorReason)); - } + syncResults.set(syncResultIndex, new SyncResult(schemaName, syncTableName, failedVanSerialNo, + syncUploadDataDigester.getSyncedBy(), false, "INSERT: " + mainErrorReason)); } } + } - // Process UPDATE operations - if (!syncDataListUpdate.isEmpty()) { - String queryUpdate = getQueryToUpdateDataToServerDB(schemaName, serverColumns, syncTableName); + // 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; - } + 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) { + logger.info("Successfully updated record at index {}", updateListIndex); + } else { + // Failed - update the syncResults entry with concise reason + Object[] failedRecord = syncDataListUpdate.get(updateListIndex); + String failedVanSerialNo = vanSerialIndex < failedRecord.length ? + String.valueOf(failedRecord[vanSerialIndex]) : "UNKNOWN"; + 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; } + } - } catch (Exception e) { - updateSuccess = false; - logger.error("Exception during update for table {}: {}", syncTableName, e.getMessage(), e); + } 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); + 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]); + // 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(); + Object[] failedRecord = syncDataListUpdate.get(updateListIndex); + String failedVanSerialNo = vanSerialIndex < failedRecord.length ? + String.valueOf(failedRecord[vanSerialIndex]) : "UNKNOWN"; - syncResults.set(syncResultIndex, new SyncResult(schemaName, syncTableName, vanSerialNo, - syncUploadDataDigester.getSyncedBy(), false, "UPDATE: " + mainErrorReason)); - } + syncResults.set(syncResultIndex, new SyncResult(schemaName, syncTableName, failedVanSerialNo, + syncUploadDataDigester.getSyncedBy(), false, "UPDATE: " + mainErrorReason)); } } - - logger.info("Sync results for table {}: {}", syncTableName, syncResults); - return insertSuccess && updateSuccess; } + logger.info("Sync results for table {}: Total records processed: {}, Inserts: {}, Updates: {}", + syncTableName, syncResults.size(), syncDataListInsert.size(), syncDataListUpdate.size()); + return insertSuccess && updateSuccess; +} + // Helper method to extract concise but meaningful error message private String extractMainErrorReason(Exception e) { if (e == null) { From 9064651d5f11de9634b84c7151acb6ac2ff0b2b7 Mon Sep 17 00:00:00 2001 From: Vanitha Date: Fri, 26 Sep 2025 05:33:13 +0530 Subject: [PATCH 2/9] fix: add logs --- .../dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 d3791dd5..3ea98a54 100644 --- a/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java +++ b/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java @@ -666,7 +666,7 @@ private boolean performGenericTableSync(SyncUploadDataDigester syncUploadDataDig } logger.info("Found vanAutoIncColumnName '{}' at index {} in serverColumns", vanAutoIncColumnName, vanSerialIndex); - +logger.info("Check failure reason"); for (Map map : dataToBesync) { // Create a new map with clean column names as keys Map cleanRecord = new HashMap<>(); From 9ddd70e500a6045d33c44a4cc4454aa6b9a4c614 Mon Sep 17 00:00:00 2001 From: Vanitha Date: Fri, 26 Sep 2025 06:12:15 +0530 Subject: [PATCH 3/9] fix: update function --- .../UploadDataToServerImpl.java | 1 + .../GetDataFromVanAndSyncToDBImpl.java | 137 ++++++++---------- 2 files changed, 63 insertions(+), 75 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 266d3d28..1646a5bb 100644 --- a/src/main/java/com/iemr/mmu/service/dataSyncActivity/UploadDataToServerImpl.java +++ b/src/main/java/com/iemr/mmu/service/dataSyncActivity/UploadDataToServerImpl.java @@ -438,6 +438,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/GetDataFromVanAndSyncToDBImpl.java b/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java index 3ea98a54..d379eaaa 100644 --- a/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java +++ b/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java @@ -623,52 +623,18 @@ private boolean performGenericTableSync(SyncUploadDataDigester syncUploadDataDig Integer facilityIDFromDigester = syncUploadDataDigester.getFacilityID(); String serverColumns = syncUploadDataDigester.getServerColumns(); - // Clean and normalize server columns + // ORIGINAL LOGIC - Keep this as it was working + int vanSerialIndex = Arrays.asList(serverColumns.split(",")).indexOf(vanAutoIncColumnName); List serverColumnsList = Arrays.asList(serverColumns.split(",")); - List cleanServerColumnsList = new ArrayList<>(); - for (String col : serverColumnsList) { - cleanServerColumnsList.add(col.trim()); - } - // Find vanSerialIndex with better error handling - int vanSerialIndex = -1; - String normalizedVanAutoIncColumnName = vanAutoIncColumnName.trim(); - - // Try exact match first - vanSerialIndex = cleanServerColumnsList.indexOf(normalizedVanAutoIncColumnName); - - // If not found, try case-insensitive match + // ONLY ADD: Log warning for debugging but continue processing if (vanSerialIndex == -1) { - for (int i = 0; i < cleanServerColumnsList.size(); i++) { - if (cleanServerColumnsList.get(i).equalsIgnoreCase(normalizedVanAutoIncColumnName)) { - vanSerialIndex = i; - break; - } - } - } - - // If still not found, log error and return false - if (vanSerialIndex == -1) { - logger.error("VanAutoIncColumnName '{}' not found in serverColumns: {}. Available columns: {}", - vanAutoIncColumnName, serverColumns, cleanServerColumnsList); - - // Add failed sync results for all records - for (Map map : dataToBesync) { - String vanSerialNo = "UNKNOWN"; - if (map.containsKey(vanAutoIncColumnName)) { - vanSerialNo = String.valueOf(map.get(vanAutoIncColumnName)); - } - syncResults.add(new SyncResult(schemaName, syncTableName, vanSerialNo, - syncUploadDataDigester.getSyncedBy(), false, - "Column mapping error: " + vanAutoIncColumnName + " not found")); - } - return false; + logger.warn("VanAutoIncColumnName '{}' not found in serverColumns for table '{}'. This is normal for auto-increment primary keys.", + vanAutoIncColumnName, syncTableName); } - logger.info("Found vanAutoIncColumnName '{}' at index {} in serverColumns", vanAutoIncColumnName, vanSerialIndex); -logger.info("Check failure reason"); for (Map map : dataToBesync) { - // Create a new map with clean column names as keys + // ORIGINAL LOGIC - Create a new map with clean column names as keys Map cleanRecord = new HashMap<>(); for (String key : map.keySet()) { String cleanKey = key; @@ -685,16 +651,8 @@ private boolean performGenericTableSync(SyncUploadDataDigester syncUploadDataDig cleanRecord.put(cleanKey.trim(), map.get(key)); } - // Get vanSerialNo with better error handling - String vanSerialNo = "UNKNOWN"; - if (cleanRecord.containsKey(normalizedVanAutoIncColumnName)) { - Object vanSerialValue = cleanRecord.get(normalizedVanAutoIncColumnName); - vanSerialNo = vanSerialValue != null ? String.valueOf(vanSerialValue) : "NULL"; - } else { - logger.warn("VanAutoIncColumnName '{}' not found in record data. Available keys: {}", - normalizedVanAutoIncColumnName, cleanRecord.keySet()); - } - + // ORIGINAL LOGIC - Extract vanSerialNo + String vanSerialNo = String.valueOf(cleanRecord.get(vanAutoIncColumnName)); String vanID = String.valueOf(cleanRecord.get("VanID")); int syncFacilityID = 0; @@ -759,21 +717,23 @@ private boolean performGenericTableSync(SyncUploadDataDigester syncUploadDataDig try { recordCheck = dataSyncRepositoryCentral.checkRecordIsAlreadyPresentOrNot( schemaName, syncTableName, vanSerialNo, vanID, vanAutoIncColumnName, syncFacilityID); - logger.info("Record check result for vanSerialNo {}: {}", vanSerialNo, recordCheck); + 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); + // 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; + continue; // Skip to next record } - // Prepare Object array for insert/update + // ORIGINAL LOGIC - Prepare Object array for insert/update List currentRecordValues = new ArrayList<>(); - for (String column : cleanServerColumnsList) { - Object value = cleanRecord.get(column); + for (String column : serverColumnsList) { + Object value = cleanRecord.get(column.trim()); if (value instanceof Boolean) { currentRecordValues.add(value); } else if (value != null) { @@ -788,7 +748,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)); + syncUploadDataDigester.getSyncedBy(), true, null)); // Initially set as success if (recordCheck == 0) { // Record doesn't exist - INSERT @@ -797,7 +757,7 @@ private boolean performGenericTableSync(SyncUploadDataDigester syncUploadDataDig } else { // Record exists - UPDATE List updateParams = new ArrayList<>(Arrays.asList(objArr)); - updateParams.add(vanSerialNo); // Use the actual vanSerialNo value + updateParams.add(String.valueOf(vanSerialNo)); if (Arrays.asList("t_patientissue", "t_physicalstockentry", "t_stockadjustment", "t_saitemmapping", "t_stocktransfer", "t_patientreturn", "t_facilityconsumption", "t_indent", @@ -805,7 +765,7 @@ private boolean performGenericTableSync(SyncUploadDataDigester syncUploadDataDig .contains(syncTableName.toLowerCase()) && cleanRecord.containsKey("SyncFacilityID")) { updateParams.add(String.valueOf(cleanRecord.get("SyncFacilityID"))); } else { - updateParams.add(vanID); + updateParams.add(String.valueOf(vanID)); } updateIndexMap.put(currentSyncResultIndex, syncDataListUpdate.size()); @@ -830,12 +790,19 @@ private boolean performGenericTableSync(SyncUploadDataDigester syncUploadDataDig 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 - Object[] failedRecord = syncDataListInsert.get(insertListIndex); - String failedVanSerialNo = vanSerialIndex < failedRecord.length ? - String.valueOf(failedRecord[vanSerialIndex]) : "UNKNOWN"; + // SAFETY CHECK - Prevent ArrayIndexOutOfBoundsException + String failedVanSerialNo = "UNKNOWN"; + if (vanSerialIndex >= 0 && vanSerialIndex < syncDataListInsert.get(insertListIndex).length) { + failedVanSerialNo = String.valueOf(syncDataListInsert.get(insertListIndex)[vanSerialIndex]); + } else { + // Fallback: get from original syncResult + SyncResult originalResult = syncResults.get(syncResultIndex); + failedVanSerialNo = originalResult.getVanSerialNo(); + } + String conciseReason = "Insert failed (code: " + (insertListIndex < insertResults.length ? insertResults[insertListIndex] : "unknown") + ")"; @@ -856,9 +823,16 @@ private boolean performGenericTableSync(SyncUploadDataDigester syncUploadDataDig for (Map.Entry entry : insertIndexMap.entrySet()) { int syncResultIndex = entry.getKey(); int insertListIndex = entry.getValue(); - Object[] failedRecord = syncDataListInsert.get(insertListIndex); - String failedVanSerialNo = vanSerialIndex < failedRecord.length ? - String.valueOf(failedRecord[vanSerialIndex]) : "UNKNOWN"; + + // SAFETY CHECK - Prevent ArrayIndexOutOfBoundsException + String failedVanSerialNo = "UNKNOWN"; + if (vanSerialIndex >= 0 && vanSerialIndex < syncDataListInsert.get(insertListIndex).length) { + failedVanSerialNo = String.valueOf(syncDataListInsert.get(insertListIndex)[vanSerialIndex]); + } else { + // Fallback: get from original syncResult + SyncResult originalResult = syncResults.get(syncResultIndex); + failedVanSerialNo = originalResult.getVanSerialNo(); + } syncResults.set(syncResultIndex, new SyncResult(schemaName, syncTableName, failedVanSerialNo, syncUploadDataDigester.getSyncedBy(), false, "INSERT: " + mainErrorReason)); @@ -866,7 +840,7 @@ private boolean performGenericTableSync(SyncUploadDataDigester syncUploadDataDig } } - // Process UPDATE operations + // Process UPDATE operations if (!syncDataListUpdate.isEmpty()) { String queryUpdate = getQueryToUpdateDataToServerDB(schemaName, serverColumns, syncTableName); @@ -880,12 +854,19 @@ private boolean performGenericTableSync(SyncUploadDataDigester syncUploadDataDig 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 - Object[] failedRecord = syncDataListUpdate.get(updateListIndex); - String failedVanSerialNo = vanSerialIndex < failedRecord.length ? - String.valueOf(failedRecord[vanSerialIndex]) : "UNKNOWN"; + // SAFETY CHECK - Prevent ArrayIndexOutOfBoundsException + String failedVanSerialNo = "UNKNOWN"; + if (vanSerialIndex >= 0 && vanSerialIndex < syncDataListUpdate.get(updateListIndex).length) { + failedVanSerialNo = String.valueOf(syncDataListUpdate.get(updateListIndex)[vanSerialIndex]); + } else { + // Fallback: get from original syncResult + SyncResult originalResult = syncResults.get(syncResultIndex); + failedVanSerialNo = originalResult.getVanSerialNo(); + } + String conciseReason = "Update failed (code: " + (updateListIndex < updateResults.length ? updateResults[updateListIndex] : "unknown") + ")"; @@ -906,9 +887,16 @@ private boolean performGenericTableSync(SyncUploadDataDigester syncUploadDataDig for (Map.Entry entry : updateIndexMap.entrySet()) { int syncResultIndex = entry.getKey(); int updateListIndex = entry.getValue(); - Object[] failedRecord = syncDataListUpdate.get(updateListIndex); - String failedVanSerialNo = vanSerialIndex < failedRecord.length ? - String.valueOf(failedRecord[vanSerialIndex]) : "UNKNOWN"; + + // SAFETY CHECK - Prevent ArrayIndexOutOfBoundsException + String failedVanSerialNo = "UNKNOWN"; + if (vanSerialIndex >= 0 && vanSerialIndex < syncDataListUpdate.get(updateListIndex).length) { + failedVanSerialNo = String.valueOf(syncDataListUpdate.get(updateListIndex)[vanSerialIndex]); + } else { + // Fallback: get from original syncResult + SyncResult originalResult = syncResults.get(syncResultIndex); + failedVanSerialNo = originalResult.getVanSerialNo(); + } syncResults.set(syncResultIndex, new SyncResult(schemaName, syncTableName, failedVanSerialNo, syncUploadDataDigester.getSyncedBy(), false, "UPDATE: " + mainErrorReason)); @@ -916,8 +904,7 @@ private boolean performGenericTableSync(SyncUploadDataDigester syncUploadDataDig } } - logger.info("Sync results for table {}: Total records processed: {}, Inserts: {}, Updates: {}", - syncTableName, syncResults.size(), syncDataListInsert.size(), syncDataListUpdate.size()); + logger.info("Sync results for table {}: {}", syncTableName, syncResults); return insertSuccess && updateSuccess; } From 669ec876c21be2bff5097b01bc4aad01bc821297 Mon Sep 17 00:00:00 2001 From: Vanitha Date: Fri, 26 Sep 2025 09:32:04 +0530 Subject: [PATCH 4/9] fix: update server functionality --- .../GetDataFromVanAndSyncToDBImpl.java | 808 ++++++------------ 1 file changed, 239 insertions(+), 569 deletions(-) diff --git a/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java b/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java index d379eaaa..74202ab2 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; @@ -175,49 +174,36 @@ 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); + 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); + tableSpecificDigester.setSyncedBy(originalDigester.getSyncedBy()); + tableSpecificDigester.setFacilityID(originalDigester.getFacilityID()); + tableSpecificDigester.setVanAutoIncColumnName(originalDigester.getVanAutoIncColumnName()); + tableSpecificDigester.setServerColumns(originalDigester.getServerColumns()); + tableSpecificDigester.setSyncData(filteredData); // Use filtered data + + return performGenericTableSync(tableSpecificDigester, syncResults); } - - 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); - tableSpecificDigester.setSyncedBy(originalDigester.getSyncedBy()); - tableSpecificDigester.setFacilityID(originalDigester.getFacilityID()); - tableSpecificDigester.setVanAutoIncColumnName(originalDigester.getVanAutoIncColumnName()); - tableSpecificDigester.setServerColumns(originalDigester.getServerColumns()); - tableSpecificDigester.setSyncData(filteredData); // Use filtered data - - return performGenericTableSync(tableSpecificDigester, syncResults); -} - - // private boolean syncTablesInGroup(String schemaName, String currentTableName, - // SyncUploadDataDigester originalDigester, List syncResults) { - // SyncUploadDataDigester tableSpecificDigester = new SyncUploadDataDigester(); - // tableSpecificDigester.setSchemaName(schemaName); - // tableSpecificDigester.setTableName(currentTableName); - // tableSpecificDigester.setSyncedBy(originalDigester.getSyncedBy()); - // tableSpecificDigester.setFacilityID(originalDigester.getFacilityID()); - // tableSpecificDigester.setVanAutoIncColumnName(originalDigester.getVanAutoIncColumnName()); - // tableSpecificDigester.setServerColumns(originalDigester.getServerColumns()); - // tableSpecificDigester.setSyncData(originalDigester.getSyncData()); - // return performGenericTableSync(tableSpecificDigester, syncResults); - // } private String update_M_BeneficiaryRegIdMapping_for_provisioned_benID( SyncUploadDataDigester syncUploadDataDigester, List syncResults) { @@ -332,582 +318,267 @@ 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 - - // boolean overallSuccess = true; - - // 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)); - // } - - // 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; - // } - // 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_itemstockentry": { - // if (cleanRecord.containsKey("FacilityID") && cleanRecord.get("FacilityID") instanceof Number) { - // Number mapFacilityID = (Number) cleanRecord.get("FacilityID"); - // if (mapFacilityID.intValue() == facilityIDFromDigester) { - // cleanRecord.put("Processed", "P"); - // } - // } - // break; - // } - // default: - // 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); - - // // 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 - // } - - // // 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 { - // // 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()); - // } - // } - - // 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); - - // // 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; - // } - // } - - // } 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)); - // } - // } - // } - - // // 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("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)); - // } - // } - // } - - // logger.info("Sync results for table {}: {}", syncTableName, syncResults); - // return insertSuccess && updateSuccess; - // } - -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<>(); - Map updateIndexMap = new HashMap<>(); - - boolean overallSuccess = true; - - if (dataToBesync == null || dataToBesync.isEmpty()) { - logger.info("No data to sync for table: {}", syncUploadDataDigester.getTableName()); - return true; - } + private boolean performGenericTableSync(SyncUploadDataDigester syncUploadDataDigester, + List syncResults) { + List> dataToBesync = syncUploadDataDigester.getSyncData(); + List syncDataListInsert = new ArrayList<>(); + List syncDataListUpdate = new ArrayList<>(); - String syncTableName = syncUploadDataDigester.getTableName(); - String vanAutoIncColumnName = syncUploadDataDigester.getVanAutoIncColumnName(); - String schemaName = syncUploadDataDigester.getSchemaName(); - Integer facilityIDFromDigester = syncUploadDataDigester.getFacilityID(); - String serverColumns = syncUploadDataDigester.getServerColumns(); + // 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 - // ORIGINAL LOGIC - Keep this as it was working - int vanSerialIndex = Arrays.asList(serverColumns.split(",")).indexOf(vanAutoIncColumnName); - List serverColumnsList = Arrays.asList(serverColumns.split(",")); + boolean overallSuccess = true; - // ONLY ADD: Log warning for debugging but continue processing - if (vanSerialIndex == -1) { - logger.warn("VanAutoIncColumnName '{}' not found in serverColumns for table '{}'. This is normal for auto-increment primary keys.", - vanAutoIncColumnName, syncTableName); - } + if (dataToBesync == null || dataToBesync.isEmpty()) { + logger.info("No data to sync for table: {}", syncUploadDataDigester.getTableName()); + return true; + } - for (Map map : dataToBesync) { - // ORIGINAL LOGIC - 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(); + + 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)); - } - // ORIGINAL LOGIC - Extract vanSerialNo - 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; + + // 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: - 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); - 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); + 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); - // Store the main error reason from record check failure - String mainErrorReason = "Record check failed: " + extractMainErrorReason(e); + // 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 - } + syncResults.add(new SyncResult(schemaName, syncTableName, vanSerialNo, + syncUploadDataDigester.getSyncedBy(), false, mainErrorReason)); + continue; // Skip to next record + } - // ORIGINAL LOGIC - 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); + // 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(); + 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 + // 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 { - // 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"))); + 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()); + updateIndexMap.put(currentSyncResultIndex, syncDataListUpdate.size()); + syncDataListUpdate.add(updateParams.toArray()); + } } - } - - boolean insertSuccess = true; - boolean updateSuccess = true; - // Process INSERT operations - if (!syncDataListInsert.isEmpty()) { - String queryInsert = getQueryToInsertDataToServerDB(schemaName, syncTableName, serverColumns); + boolean insertSuccess = true; + boolean updateSuccess = true; - try { - int[] insertResults = dataSyncRepositoryCentral.syncDataToCentralDB(schemaName, syncTableName, - serverColumns, queryInsert, syncDataListInsert); + // Process INSERT operations + if (!syncDataListInsert.isEmpty()) { + String queryInsert = getQueryToInsertDataToServerDB(schemaName, syncTableName, serverColumns); - // 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 { - // SAFETY CHECK - Prevent ArrayIndexOutOfBoundsException - String failedVanSerialNo = "UNKNOWN"; - if (vanSerialIndex >= 0 && vanSerialIndex < syncDataListInsert.get(insertListIndex).length) { - failedVanSerialNo = String.valueOf(syncDataListInsert.get(insertListIndex)[vanSerialIndex]); - } else { - // Fallback: get from original syncResult - SyncResult originalResult = syncResults.get(syncResultIndex); - failedVanSerialNo = originalResult.getVanSerialNo(); + 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; } - - 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; } - } - } catch (Exception e) { - insertSuccess = false; - logger.error("Exception during insert for table {}: {}", syncTableName, e.getMessage(), e); - - 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(); - - // SAFETY CHECK - Prevent ArrayIndexOutOfBoundsException - String failedVanSerialNo = "UNKNOWN"; - if (vanSerialIndex >= 0 && vanSerialIndex < syncDataListInsert.get(insertListIndex).length) { - failedVanSerialNo = String.valueOf(syncDataListInsert.get(insertListIndex)[vanSerialIndex]); - } else { - // Fallback: get from original syncResult - SyncResult originalResult = syncResults.get(syncResultIndex); - failedVanSerialNo = originalResult.getVanSerialNo(); + } catch (Exception e) { + // Row-level error handling for all insert rows + String mainErrorReason = extractMainErrorReason(e); + for (Map.Entry entry : insertIndexMap.entrySet()) { + int syncResultIndex = entry.getKey(); + int insertListIndex = entry.getValue(); + String failedVanSerialNo = getVanSerialNo(syncDataListInsert.get(insertListIndex), vanSerialIndex, + syncResults.get(syncResultIndex)); + syncResults.set(syncResultIndex, new SyncResult(schemaName, syncTableName, failedVanSerialNo, + syncUploadDataDigester.getSyncedBy(), false, "INSERT: " + mainErrorReason)); } - - syncResults.set(syncResultIndex, new SyncResult(schemaName, syncTableName, failedVanSerialNo, - syncUploadDataDigester.getSyncedBy(), false, "INSERT: " + mainErrorReason)); + insertSuccess = false; } } - } - // Process UPDATE operations - if (!syncDataListUpdate.isEmpty()) { - String queryUpdate = getQueryToUpdateDataToServerDB(schemaName, serverColumns, syncTableName); + 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 { - // SAFETY CHECK - Prevent ArrayIndexOutOfBoundsException - String failedVanSerialNo = "UNKNOWN"; - if (vanSerialIndex >= 0 && vanSerialIndex < syncDataListUpdate.get(updateListIndex).length) { - failedVanSerialNo = String.valueOf(syncDataListUpdate.get(updateListIndex)[vanSerialIndex]); - } else { - // Fallback: get from original syncResult - SyncResult originalResult = syncResults.get(syncResultIndex); - failedVanSerialNo = originalResult.getVanSerialNo(); + 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; } - - String conciseReason = "Update failed (code: " + - (updateListIndex < updateResults.length ? updateResults[updateListIndex] : "unknown") - + ")"; + } + } catch (Exception e) { + String mainErrorReason = extractMainErrorReason(e); + for (Map.Entry entry : updateIndexMap.entrySet()) { + int syncResultIndex = entry.getKey(); + int updateListIndex = entry.getValue(); + String failedVanSerialNo = getVanSerialNo(syncDataListUpdate.get(updateListIndex), vanSerialIndex, + syncResults.get(syncResultIndex)); syncResults.set(syncResultIndex, new SyncResult(schemaName, syncTableName, failedVanSerialNo, - syncUploadDataDigester.getSyncedBy(), false, conciseReason)); - updateSuccess = false; + syncUploadDataDigester.getSyncedBy(), false, "UPDATE: " + mainErrorReason)); } + updateSuccess = false; } + } - } catch (Exception e) { - updateSuccess = false; - logger.error("Exception during update for table {}: {}", syncTableName, e.getMessage(), e); - - 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(); - - // SAFETY CHECK - Prevent ArrayIndexOutOfBoundsException - String failedVanSerialNo = "UNKNOWN"; - if (vanSerialIndex >= 0 && vanSerialIndex < syncDataListUpdate.get(updateListIndex).length) { - failedVanSerialNo = String.valueOf(syncDataListUpdate.get(updateListIndex)[vanSerialIndex]); - } else { - // Fallback: get from original syncResult - SyncResult originalResult = syncResults.get(syncResultIndex); - failedVanSerialNo = originalResult.getVanSerialNo(); - } + logger.info("Sync results for table {}: {}", syncTableName, syncResults); + return insertSuccess && updateSuccess; + } - syncResults.set(syncResultIndex, new SyncResult(schemaName, syncTableName, failedVanSerialNo, - syncUploadDataDigester.getSyncedBy(), false, "UPDATE: " + mainErrorReason)); - } + 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"; } - logger.info("Sync results for table {}: {}", syncTableName, syncResults); - return insertSuccess && updateSuccess; -} - // Helper method to extract concise but meaningful error message private String extractMainErrorReason(Exception e) { if (e == null) { @@ -1021,7 +692,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 b5f5cb283e98c82753a0658c711c7e6cc86b8bba Mon Sep 17 00:00:00 2001 From: Vanitha Date: Fri, 26 Sep 2025 10:19:05 +0530 Subject: [PATCH 5/9] fix: update else block --- .../GetDataFromVanAndSyncToDBImpl.java | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java b/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java index 74202ab2..3c4a35cd 100644 --- a/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java +++ b/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java @@ -458,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 @@ -483,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()) { @@ -511,6 +511,12 @@ private boolean performGenericTableSync(SyncUploadDataDigester syncUploadDataDig 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) { @@ -552,6 +558,12 @@ private boolean performGenericTableSync(SyncUploadDataDigester syncUploadDataDig 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) { From 0fe496bbe86dd9ea37086f97928682fe450498a8 Mon Sep 17 00:00:00 2001 From: Vanitha Date: Fri, 26 Sep 2025 10:41:14 +0530 Subject: [PATCH 6/9] fix: update the catch block --- .../GetDataFromVanAndSyncToDBImpl.java | 105 ++++++++++++++---- 1 file changed, 84 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java b/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java index 3c4a35cd..1f648198 100644 --- a/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java +++ b/src/main/java/com/iemr/mmu/service/dataSyncLayerCentral/GetDataFromVanAndSyncToDBImpl.java @@ -520,19 +520,50 @@ private boolean performGenericTableSync(SyncUploadDataDigester syncUploadDataDig } } catch (Exception e) { - // Row-level error handling for all insert rows - String mainErrorReason = extractMainErrorReason(e); - for (Map.Entry entry : insertIndexMap.entrySet()) { - int syncResultIndex = entry.getKey(); - int insertListIndex = entry.getValue(); - String failedVanSerialNo = getVanSerialNo(syncDataListInsert.get(insertListIndex), vanSerialIndex, - syncResults.get(syncResultIndex)); - syncResults.set(syncResultIndex, new SyncResult(schemaName, syncTableName, failedVanSerialNo, - syncUploadDataDigester.getSyncedBy(), false, "INSERT: " + mainErrorReason)); - } - insertSuccess = false; + 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; +} + } if (!syncDataListUpdate.isEmpty()) { String queryUpdate = getQueryToUpdateDataToServerDB(schemaName, serverColumns, syncTableName); @@ -567,18 +598,50 @@ private boolean performGenericTableSync(SyncUploadDataDigester syncUploadDataDig } } catch (Exception e) { - String mainErrorReason = extractMainErrorReason(e); - for (Map.Entry entry : updateIndexMap.entrySet()) { - int syncResultIndex = entry.getKey(); - int updateListIndex = entry.getValue(); - String failedVanSerialNo = getVanSerialNo(syncDataListUpdate.get(updateListIndex), vanSerialIndex, - syncResults.get(syncResultIndex)); - syncResults.set(syncResultIndex, new SyncResult(schemaName, syncTableName, failedVanSerialNo, - syncUploadDataDigester.getSyncedBy(), false, "UPDATE: " + mainErrorReason)); - } - updateSuccess = false; + 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; From 2bb14b53cb7a43b768fa6488180d1f22f394a980 Mon Sep 17 00:00:00 2001 From: Vanitha Date: Fri, 26 Sep 2025 18:30:22 +0530 Subject: [PATCH 7/9] fix: corrected the table name --- .../dataSyncActivity/DownloadDataFromServerImpl.java | 10 +++------- .../DownloadDataFromServerTransactionalImpl.java | 10 +++++----- .../DataSyncRepositoryCentral.java | 2 +- 3 files changed, 9 insertions(+), 13 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/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", From 3039349101326ef01302319aff5eb1274eb4b99c Mon Sep 17 00:00:00 2001 From: Vanitha Date: Fri, 26 Sep 2025 19:58:10 +0530 Subject: [PATCH 8/9] fix: update the failure flag --- .../UploadDataToServerImpl.java | 54 +++++++++++++------ 1 file changed, 38 insertions(+), 16 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 1646a5bb..6dc19e43 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 /** * @@ -243,18 +244,35 @@ 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"; + // 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<>(); @@ -290,10 +308,14 @@ private String startDataSync(int vanID, String user, String Authorization, Strin } // If this table had critical failures, stop processing this group - if (tableHasError) { - hasSyncFailed = true; - break; - } + // if (tableHasError) { + // hasSyncFailed = true; + // break; + // } + if (criticalTableFailure) { + hasSyncFailed = true; + break; +} } // Determine overall group status String groupStatus; From 14782216802e9530e77acb84e6b7fc7849015fc3 Mon Sep 17 00:00:00 2001 From: Vanitha Date: Fri, 26 Sep 2025 20:02:38 +0530 Subject: [PATCH 9/9] fix: remove unwanted code --- .../UploadDataToServerImpl.java | 23 ++----------------- 1 file changed, 2 insertions(+), 21 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 6dc19e43..f0764baa 100644 --- a/src/main/java/com/iemr/mmu/service/dataSyncActivity/UploadDataToServerImpl.java +++ b/src/main/java/com/iemr/mmu/service/dataSyncActivity/UploadDataToServerImpl.java @@ -243,21 +243,7 @@ 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; + String tableStatus; if (successfulRecords == totalRecords && failedRecords == 0) { tableStatus = "success"; @@ -307,12 +293,7 @@ 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) { + if (criticalTableFailure) { hasSyncFailed = true; break; }