From 4c7c2e9e5b1020e7e86a257e7510711916e4f362 Mon Sep 17 00:00:00 2001 From: Hariprasath S <113695067+Hariprasath4022@users.noreply.github.com> Date: Wed, 19 Aug 2026 12:35:27 +0530 Subject: [PATCH] Added Penalty POS Fine Collection Schedular --- .../gcc/erppostdata/common/MySchduler.java | 50 +++++ .../com/gcc/erppostdata/config/AppConfig.java | 13 ++ .../erppostdata/config/DatabaseConfig.java | 14 ++ .../penalty_pos/PenaltyPosPostData.java | 182 ++++++++++++++++++ .../penalty_pos/PenaltyPosQueryBank.java | 55 ++++++ .../erppostdata/repo/PenaltyPosLogRepo.java | 66 +++++++ src/main/resources/application-dev.properties | 4 +- .../resources/application-prod.properties | 4 +- 8 files changed, 386 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/gcc/erppostdata/penalty_pos/PenaltyPosPostData.java create mode 100644 src/main/java/com/gcc/erppostdata/penalty_pos/PenaltyPosQueryBank.java create mode 100644 src/main/java/com/gcc/erppostdata/repo/PenaltyPosLogRepo.java diff --git a/src/main/java/com/gcc/erppostdata/common/MySchduler.java b/src/main/java/com/gcc/erppostdata/common/MySchduler.java index 247e7eb..9db586a 100644 --- a/src/main/java/com/gcc/erppostdata/common/MySchduler.java +++ b/src/main/java/com/gcc/erppostdata/common/MySchduler.java @@ -2,9 +2,11 @@ package com.gcc.erppostdata.common; import com.gcc.erppostdata.communityhall.CmhQueryBank; import com.gcc.erppostdata.mudhalvarpadaipagam.CoworkQueryBank; +import com.gcc.erppostdata.penalty_pos.PenaltyPosQueryBank; import com.gcc.erppostdata.petregistration.PetQueryBank; import com.gcc.erppostdata.repo.CommunityHallLogRepo; import com.gcc.erppostdata.repo.CoworkLogRepo; +import com.gcc.erppostdata.repo.PenaltyPosLogRepo; import com.gcc.erppostdata.repo.PetLogRepo; import com.gcc.erppostdata.repo.SwimLogRepo; import com.gcc.erppostdata.swimmingpool.SwimQueryBank; @@ -45,8 +47,15 @@ public class MySchduler { @Autowired SwimQueryBank swimQueryBank; + + @Autowired + PenaltyPosQueryBank penaltyPosQueryBank; + + @Autowired + PenaltyPosLogRepo penaltyPosLogRepo; @Scheduled(fixedRate = 3600000) // Runs every 1 hour + public void hourlyScheduled() { try { oneHourCmhSch(); } catch (Exception e) { @@ -70,6 +79,12 @@ public class MySchduler { System.err.println("Error in oneHourSwn: " + e.getMessage()); e.printStackTrace(); } + + try { oneHourPenaltyPosSch(); + } catch (Exception e) { + System.err.println("Error in oneHourPenaltyPos: " + e.getMessage()); + e.printStackTrace(); + } } //------------------------------------------------------------------------- @Scheduled(fixedRate = 10800000) // Runs every 1 hour @@ -97,6 +112,12 @@ public class MySchduler { System.err.println("Error in oneHourSwim: " + e.getMessage()); e.printStackTrace(); } + + try { threeHourPenaltyPosSch(); + } catch (Exception e) { + System.err.println("Error in threeHourPenaltyPos: " + e.getMessage()); + e.printStackTrace(); + } } //--------------------------------------------------------------------- @@ -206,4 +227,33 @@ public class MySchduler { ); } } + + // Penalty POS + @Transactional + public void oneHourPenaltyPosSch() { + System.out.println("Penalty POS Hourly Post data: " + new Date()); + int lastUniqueIdInserted = 0; + try { + lastUniqueIdInserted = penaltyPosLogRepo.getLastBookingIdInserted(); + } + catch (Exception e) { + System.err.println("Error in Penalty POS LogRepo: " + e.getMessage()); + } + penaltyPosQueryBank.hourlyPushData(lastUniqueIdInserted); + } + + @Transactional + public void threeHourPenaltyPosSch() { + System.out.println("Penalty POS Three Hour Post data: " + new Date()); + List> dataByStatus = penaltyPosLogRepo.getDataByStatus(); + for (Map data : dataByStatus) { + penaltyPosQueryBank.resendPushData( + data.get("unique_receipt_id").toString(), + data.get("id").toString() + ); + } + } + + + } diff --git a/src/main/java/com/gcc/erppostdata/config/AppConfig.java b/src/main/java/com/gcc/erppostdata/config/AppConfig.java index 26ef5fd..ded0b25 100644 --- a/src/main/java/com/gcc/erppostdata/config/AppConfig.java +++ b/src/main/java/com/gcc/erppostdata/config/AppConfig.java @@ -14,6 +14,7 @@ public class AppConfig { private String cmhDb; private String mulPDb; private String swimDb; + private String penaltyposDb; public String getErpUrl() { return erpUrl; @@ -70,4 +71,16 @@ public class AppConfig { public void setSwimDb(String swimDb) { this.swimDb = swimDb; } + + public String getPenaltyposDb() { + return penaltyposDb; + } + + public void setPenaltyposDb(String penaltyposDb) { + this.penaltyposDb = penaltyposDb; + } + + + + } diff --git a/src/main/java/com/gcc/erppostdata/config/DatabaseConfig.java b/src/main/java/com/gcc/erppostdata/config/DatabaseConfig.java index 7b3ec88..cb60299 100644 --- a/src/main/java/com/gcc/erppostdata/config/DatabaseConfig.java +++ b/src/main/java/com/gcc/erppostdata/config/DatabaseConfig.java @@ -25,6 +25,9 @@ public class DatabaseConfig { private AppConfig appConfig; String host="gcc-facial-db-instance-1.cf48eqcciziq.ap-south-1.rds.amazonaws.com"; + + // String host="localhost"; + // String chDb="communityhall_live";//communityhall_live // String petDb="gcc_pets"; // @@ -153,5 +156,16 @@ public class DatabaseConfig { dataSource.setPassword(appConfig.getPassword()); return dataSource; } + + + @Bean(name = "mysqlPenaltyPosDataSource") + public DataSource mysqlPenaltyPosDataSource() { + DriverManagerDataSource dataSource = new DriverManagerDataSource(); + dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); + dataSource.setUrl("jdbc:mysql://"+host+":3306/"+appConfig.getPenaltyposDb()); + dataSource.setUsername(appConfig.getUsername()); + dataSource.setPassword(appConfig.getPassword()); + return dataSource; + } } diff --git a/src/main/java/com/gcc/erppostdata/penalty_pos/PenaltyPosPostData.java b/src/main/java/com/gcc/erppostdata/penalty_pos/PenaltyPosPostData.java new file mode 100644 index 0000000..bf754de --- /dev/null +++ b/src/main/java/com/gcc/erppostdata/penalty_pos/PenaltyPosPostData.java @@ -0,0 +1,182 @@ +package com.gcc.erppostdata.penalty_pos; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLEncoder; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + +import javax.sql.DataSource; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Component; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.gcc.erppostdata.config.AppConfig; +import com.gcc.erppostdata.repo.PenaltyPosLogRepo; + +@Component +public class PenaltyPosPostData { + + @Autowired + private AppConfig appConfig; + + @Autowired + private PenaltyPosLogRepo penaltyPosLogRepo; + + private JdbcTemplate jdbcTemplate; + + @Autowired + public void setDataSource(@Qualifier("mysqlPenaltyPosDataSource") DataSource dataSource) { + this.jdbcTemplate = new JdbcTemplate(dataSource); + } + + public void fetchpenaltyposData(String sql, String id) { + System.out.println("SQL: " + sql); + + List> results = jdbcTemplate.queryForList(sql); + List> swimDataList = new ArrayList<>(); + + System.out.println("Records fetched for penalty pos: " + results.size()); + + for (Map row : results) { + try { + Map data = new TreeMap<>(); + + // Safe value extraction + String bookingId = row.get("id") != null ? row.get("id").toString() : ""; + String paymentId = row.get("txnRefNo") != null ? row.get("txnRefNo").toString() : ""; + String paymentDate = row.get("txnDate") != null ? row.get("txnDate").toString() : ""; + String name = row.get("violator_name") != null ? row.get("violator_name").toString() : ""; + String mobile = row.get("violator_phone") != null ? row.get("violator_phone").toString() : ""; + String amountStr = row.get("fine_amount") != null ? row.get("fine_amount").toString() : "0"; + String orderid = row.get("orderid") != null ? row.get("orderid").toString() : ""; + + String categoryId = row.get("category_id") != null ? row.get("category_id").toString(): "0"; + + String categoryErpcode=row.get("category_erpcode") != null ? row.get("category_erpcode").toString(): "0"; + + double amount = 0; + try { + amount = Double.parseDouble(amountStr); + } catch (NumberFormatException e) { + System.err.println("Invalid amount for Id: " + bookingId); + } + + String assessmentNo = LocalDate.now().getYear()+"/"+categoryId + "/PTYPOS/"+categoryErpcode+"/" + bookingId; + + data.put("serviceId", "getOtherCollection"); + data.put("COLLECTION_TYPE", "Fine Collection"); + data.put("TOTALTRANSACTIONCODE", "450320225"); // 450320225 + data.put("ASSESSMENTNO", assessmentNo); + data.put("UNIQUERECEIPTID", bookingId); + data.put("TRANSACTIONNO", orderid); + data.put("TRANSACTIONREFNO", paymentId); + data.put("TRANSACTIONDATE", paymentDate); + data.put("TOTALTRANSACTIONAMOUNT", amount); + data.put("MSTRCODEONE", categoryErpcode); + data.put("SPLITAMOUNTONE", amountStr); + data.put("PARTYNAME", name); + data.put("PARTYMOBILE", mobile); + data.put("PARTYADDRESS", "NA"); + data.put("bookingId", bookingId); + + postDataToERP(data, id); + + } catch (Exception e) { + System.err.println("Error processing row: " + row); + e.printStackTrace(); + } + } + } + + private void postDataToERP(Map data, String id) { + try { + StringBuilder encodedUrl = new StringBuilder(appConfig.getErpUrl()); + boolean firstParam = true; + + for (Map.Entry entry : data.entrySet()) { + if (!firstParam) encodedUrl.append("&"); + firstParam = false; + String key = URLEncoder.encode(entry.getKey(), "UTF-8"); + String value = URLEncoder.encode(String.valueOf(entry.getValue()), "UTF-8"); + encodedUrl.append(key).append("=").append(value); + } + + String finalUrl = encodedUrl.toString(); + System.out.println("Final Encoded URL: " + finalUrl); + + HttpURLConnection connection = (HttpURLConnection) new URL(finalUrl).openConnection(); + connection.setRequestMethod("GET"); + int responseCode = connection.getResponseCode(); + System.out.println("Response Code: " + responseCode); + + StringBuilder response = new StringBuilder(); + BufferedReader in = new BufferedReader(new InputStreamReader( + responseCode == 200 ? connection.getInputStream() : connection.getErrorStream() + )); + String inputLine; + while ((inputLine = in.readLine()) != null) response.append(inputLine); + in.close(); + + System.out.println("ERP Response: " + response); + + if (id != null) { + updateLog(data, response, id); + } else { + saveLog(data, response); + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + private void saveLog(Map map, StringBuilder response) throws JsonProcessingException { + logToRepo(map, response); + } + + private void updateLog(Map map, StringBuilder response, String id) throws JsonProcessingException { + logToRepo(map, response, id); + } + + private void logToRepo(Map map, StringBuilder response) throws JsonProcessingException { + logToRepo(map, response, null); + } + + private void logToRepo(Map map, StringBuilder response, String id) throws JsonProcessingException { + String statusCode = "0"; + if (response != null) { + ObjectMapper objectMapper = new ObjectMapper(); + Map res = objectMapper.readValue(response.toString(), Map.class); + String msg = String.valueOf(res.get("Message")); + String status = String.valueOf(res.getOrDefault("ResultStatus", "")); + + if ("Connection Failure".equals(msg)) { + statusCode = "2"; + } else if ("Already Updated this collection".equals(msg) && "false".equals(status)) { + statusCode = "1"; + } else if ("Failure".equals(msg) && "false".equals(status)) { + statusCode = "2"; + } else if ("true".equals(status)) { + statusCode = "1"; + } + } + + map.put("status", statusCode); + map.put("response", response.toString()); + + if (id != null) { + penaltyPosLogRepo.updateLog(statusCode, response.toString(), id); + } else { + penaltyPosLogRepo.insert(map); + } + } +} diff --git a/src/main/java/com/gcc/erppostdata/penalty_pos/PenaltyPosQueryBank.java b/src/main/java/com/gcc/erppostdata/penalty_pos/PenaltyPosQueryBank.java new file mode 100644 index 0000000..cb94f6d --- /dev/null +++ b/src/main/java/com/gcc/erppostdata/penalty_pos/PenaltyPosQueryBank.java @@ -0,0 +1,55 @@ +package com.gcc.erppostdata.penalty_pos; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class PenaltyPosQueryBank { + + @Autowired + private PenaltyPosPostData PenaltyPosPostData; + + public void PushAllData() { + String sql = "SELECT pc.id, pc.category_id, pcat.name AS category_name, pcat.erpcode AS category_erpcode," + + " pcat.isactive AS cat_isactive, pc.challan_by, pc.challan_date, pc.status, pc.violator_name," + + " pc.violator_phone, pc.violator_company, pc.fine_amount, pc.orderid, bt.txnid, DATE_FORMAT(bt.txnDate, '%d/%m/%Y') AS txnDate, bt.txnRefNo " + + " FROM penalty_challan pc " + + " INNER JOIN bank_transactions bt ON pc.orderid COLLATE utf8mb4_general_ci = bt.txnid COLLATE utf8mb4_general_ci" + + " LEFT JOIN penalty_category pcat ON pc.category_id = pcat.id WHERE pc.status = 'Transaction success' AND pc.challan_date >= '2026-04-01' AND bt.txnRefNo IS NOT NULL AND TRIM(bt.txnRefNo) <> '' AND pcat.erpcode<>000" + + " ORDER BY pc.id ASC"; + + PenaltyPosPostData.fetchpenaltyposData(sql, null); + } + + public void hourlyPushData(int lastId) { + + String sql = "SELECT pc.id, pc.category_id, pcat.name AS category_name, pcat.erpcode AS category_erpcode," + + " pcat.isactive AS cat_isactive, pc.challan_by, pc.challan_date, pc.status, pc.violator_name," + + " pc.violator_phone, pc.violator_company, pc.fine_amount, pc.orderid, bt.txnid,DATE_FORMAT(bt.txnDate, '%d/%m/%Y') AS txnDate, bt.txnRefNo " + + " FROM penalty_challan pc " + + " INNER JOIN bank_transactions bt ON pc.orderid COLLATE utf8mb4_general_ci = bt.txnid COLLATE utf8mb4_general_ci" + + " LEFT JOIN penalty_category pcat ON pc.category_id = pcat.id WHERE pc.id > "+ lastId +" AND pc.status = 'Transaction success' AND pc.challan_date >= '2026-04-01' " + + " AND bt.txnRefNo IS NOT NULL AND TRIM(bt.txnRefNo) <> '' AND pcat.erpcode<>000" + + " ORDER BY pc.id ASC LIMIT 1000 "; + + PenaltyPosPostData.fetchpenaltyposData(sql, null); + + } + + public void resendPushData(String uniqueId, String id) { + + String sql = "SELECT pc.id, pc.category_id, pcat.name AS category_name, pcat.erpcode AS category_erpcode," + + " pcat.isactive AS cat_isactive, pc.challan_by, pc.challan_date, pc.status, pc.violator_name," + + " pc.violator_phone, pc.violator_company, pc.fine_amount, pc.orderid, bt.txnid, DATE_FORMAT(bt.txnDate, '%d/%m/%Y') AS txnDate, bt.txnRefNo " + + " FROM penalty_challan pc " + + " INNER JOIN bank_transactions bt ON pc.orderid COLLATE utf8mb4_general_ci = bt.txnid COLLATE utf8mb4_general_ci" + + " LEFT JOIN penalty_category pcat ON pc.category_id = pcat.id" + + " WHERE pc.id="+uniqueId+" AND pc.status = 'Transaction success' AND pc.challan_date >= '2026-04-01' AND bt.txnRefNo IS NOT NULL AND TRIM(bt.txnRefNo) <> '' AND pcat.erpcode<>000 " + + " ORDER BY pc.id ASC"; + + + PenaltyPosPostData.fetchpenaltyposData(sql, id); + } + + +} diff --git a/src/main/java/com/gcc/erppostdata/repo/PenaltyPosLogRepo.java b/src/main/java/com/gcc/erppostdata/repo/PenaltyPosLogRepo.java new file mode 100644 index 0000000..3ab8408 --- /dev/null +++ b/src/main/java/com/gcc/erppostdata/repo/PenaltyPosLogRepo.java @@ -0,0 +1,66 @@ +package com.gcc.erppostdata.repo; + +import java.util.List; +import java.util.Map; + +import javax.sql.DataSource; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; + +@Repository +public class PenaltyPosLogRepo { + + @Autowired + private JdbcTemplate jdbcTemplate; + + @Autowired + public void setDataSource(@Qualifier("mysqlerpPostData") DataSource dataSource) { + this.jdbcTemplate = new JdbcTemplate(dataSource); + } + + public int insert(Map data) { + String sql = "INSERT INTO pos_penalty_post_data (" + + "mobile, assessment_no, collection_type, mstr_code_one, split_amount_one, " + + "total_transaction_amount, total_transaction_code, transaction_date, " + + "transaction_no, transaction_ref_no, unique_receipt_id, booking_id, " + + "user_name, status, response) " + + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; + + return jdbcTemplate.update(sql, + data.get("PARTYMOBILE"), + data.get("ASSESSMENTNO"), + data.get("COLLECTION_TYPE"), + data.get("MSTRCODEONE"), + data.get("SPLITAMOUNTONE"), + data.get("TOTALTRANSACTIONAMOUNT"), + data.get("TOTALTRANSACTIONCODE"), + data.get("TRANSACTIONDATE"), + data.get("TRANSACTIONNO"), + data.get("TRANSACTIONREFNO"), + data.get("UNIQUERECEIPTID"), + data.get("UNIQUERECEIPTID"), + data.get("PARTYNAME"), + data.get("status"), + data.get("response") + ); + } + + + public int updateLog(String status, String response, String id) { + String sql = "UPDATE pos_penalty_post_data SET status = ?, response = ? WHERE id = ?"; + return jdbcTemplate.update(sql, status, response, id); + } + + public List> getDataByStatus() { + String sql = "SELECT * FROM pos_penalty_post_data WHERE status in (0,2) LIMIT 1000"; + return jdbcTemplate.queryForList(sql); + } + + public int getLastBookingIdInserted() { + String sql = "SELECT unique_receipt_id FROM pos_penalty_post_data ORDER BY unique_receipt_id DESC LIMIT 1"; + return jdbcTemplate.queryForObject(sql, Integer.class); + } +} diff --git a/src/main/resources/application-dev.properties b/src/main/resources/application-dev.properties index 3d7d98b..561e642 100644 --- a/src/main/resources/application-dev.properties +++ b/src/main/resources/application-dev.properties @@ -1,4 +1,4 @@ -app.erpUrl=http://coc-staging.egovernments.org:9980/pgr/external/mobileservice? +app.erpUrl=https://test-erp.gccservices.in/pgr/external/mobileservice? app.username=root app.password=root @@ -7,3 +7,5 @@ app.petDb=gcc_pets app.cmhDb=communityhalldemo app.mulPDb=coworkspace app.swimDb=swimtesting + +app.penaltyposDb=gcc_penalty_pos diff --git a/src/main/resources/application-prod.properties b/src/main/resources/application-prod.properties index d601c00..91db333 100644 --- a/src/main/resources/application-prod.properties +++ b/src/main/resources/application-prod.properties @@ -6,4 +6,6 @@ app.password=gcc-facial-password app.petDb=gcc_pets app.cmhDb=communityhall_live app.mulPDb=coworkingspace -app.swimDb=swimmingpool \ No newline at end of file +app.swimDb=swimmingpool + +app.penaltyposDb=gcc_penalty_pos \ No newline at end of file