package net.ipksindia.dao import net.ipksindia.ItemNotFoundException import net.ipksindia.model.TransactionRequest import java.sql.Date import java.sql.ResultSet import java.sql.SQLException class TransactionDao { private val singleTransactionRequestQuery = """ SELECT txn_no, TRIM(src_ac_no) AS src_ac_no, TRIM(dest_ac_no) AS dest_ac_no, ifsc_code, txn_amt, txn_date, t.teller_id, CASE WHEN t.ifsc_code LIKE 'WBSC%' THEN 'FAILED' ELSE 'RECEIVED' END AS status, SUBSTR(REGEXP_REPLACE(REGEXP_REPLACE(UPPER(beneficiary_name), '[^A-Z0-9 ]', ''), ' {2,}', ' '), 1, 35) AS beneficiary_name, beneficiary_add, t.pacs_id, comm_txn_no, comm_txn_amt, dccb_code, TO_NUMBER(t.cbs_br_code) AS br_code, SUBSTR(REGEXP_REPLACE(REGEXP_REPLACE(UPPER(remm_name), '[^A-Z0-9 ]', ''), ' {2,}', ' '),1,35) AS remitter_name, ipks_accno AS pacs_acc_no, da.link_accno AS cbs_sb_acc_no, 'pacs_db' AS db_name, kh.mobile_no, kh.address_1 || kh.address_2 AS remitter_address, if.idi_bank_name AS beneficiary_bank_name, if.idi_branch_name AS beneficiary_branch_name FROM neft_rtgs_txn t JOIN dep_account da ON t.ipks_accno = da.key_1 JOIN kyc_hdr kh ON da.customer_no = kh.cif_no JOIN idi_ifsc_dir_info if ON if.idi_ifsc_code = t.ifsc_code WHERE t.txn_no = ? """.trimIndent() private val transactionUpdateQuery = """ INSERT INTO neft_rtgs_txn_queue ( txn_no, src_ac_no, dest_ac_no, ifsc_code, txn_amt, txn_date, teller_id, status, beneficiary_name, beneficiary_add, pacs_id, comm_txn_no, comm_txn_amt, dccb_code, br_code, remitter_name, cbs_queue_no, pacs_acc_no, cbs_queue_no2 ) VALUES ( ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ) """.trimIndent() fun updateSuccessTransaction(request: TransactionRequest, transferQueueNumber: String, neftQueueNumber: String) { try { DatabaseFactory.instance.getConnection().use { connection -> connection.prepareStatement(transactionUpdateQuery).also { it.setString(1, request.transactionNumber) it.setString(2, request.pacsCurrentAccountNumber) it.setString(3, request.neftBeneficiaryAccountNumber) it.setString(4, request.ifscCode) it.setString(5, request.amount) it.setDate(6, Date.valueOf(request.date)) it.setString(7, request.tellerId) it.setString(8, "PROCESSED") it.setString(9, request.beneficiaryName) it.setString(10, request.beneficiaryAddress) it.setString(11, request.pacsId) it.setString(12, request.commissionTransactionNumber) it.setString(13, request.commissionAmount) it.setString(14, request.dccbCode) it.setString(15, request.branchCode) it.setString(16, request.remitterName) it.setString(17, transferQueueNumber) it.setString(18, request.pacsAccountNumber) it.setString(19, neftQueueNumber) }.use { it.executeUpdate() } } } catch (e: ExceptionInInitializerError) { throw SQLException("Failed to connect to the database ${e.message}") } } fun getTransactionRequest(transactionNumber: String): TransactionRequest { return try { DatabaseFactory.instance.getConnection().use { connection -> connection.prepareStatement(singleTransactionRequestQuery).apply { setString(1, transactionNumber) } .executeQuery() .use { mapToObject(it) ?: throw ItemNotFoundException("Transaction Number", transactionNumber) } } } catch (e: ExceptionInInitializerError) { throw SQLException("Failed to connect to the database: ${e.message}") } } } private fun mapToObject(rs: ResultSet): TransactionRequest? { if (rs.next()) { return TransactionRequest( transactionNumber = rs.getString("txn_no"), pacsCurrentAccountNumber = rs.getString("src_ac_no"), neftBeneficiaryAccountNumber = rs.getString("dest_ac_no"), ifscCode = rs.getString("ifsc_code"), amount = rs.getString("txn_amt"), date = rs.getDate("txn_date").toLocalDate(), tellerId = rs.getString("teller_id"), status = rs.getString("status"), beneficiaryName = rs.getString("beneficiary_name") ?: "UNKNOWN", beneficiaryAddress = rs.getString("beneficiary_add") ?: "UNKNOWN", pacsId = rs.getString("pacs_id"), commissionTransactionNumber = rs.getString("comm_txn_no"), commissionAmount = rs.getString("comm_txn_amt"), dccbCode = rs.getString("dccb_code"), branchCode = rs.getString("br_Code"), remitterName = rs.getString("remitter_name"), pacsAccountNumber = rs.getString("pacs_acc_no"), linkedCBSAccountNumber = rs.getString("cbs_sb_acc_no"), mobileNumber = rs.getString("mobile_no") ?: "999999999", remitterAddress = rs.getString("remitter_address"), beneficiaryBankName = rs.getString("beneficiary_bank_name"), beneficiaryBranchName = rs.getString("beneficiary_branch_name"), senderAcctType = "10", //for savings as shared by c-edge beneficiaryAcctType = "10" //for savings as shared by c-edge ) } return null }