From cbfd1d6d098a39ade86a4ceb85cc76e59a72c8bb Mon Sep 17 00:00:00 2001 From: asif Date: Sun, 10 Aug 2025 18:14:46 +0530 Subject: [PATCH] integrated acct statement with date range filter --- src/controllers/transactions.controller.js | 26 +++++++++++++++-- src/routes/transactions.route.js | 33 ++++++++++++++++++++-- 2 files changed, 55 insertions(+), 4 deletions(-) diff --git a/src/controllers/transactions.controller.js b/src/controllers/transactions.controller.js index 47a4f81..297ae8c 100644 --- a/src/controllers/transactions.controller.js +++ b/src/controllers/transactions.controller.js @@ -21,5 +21,27 @@ async function getLastTen(accountNumber) { ); } } - -module.exports = { getLastTen }; +async function getFiltered(accountNumber, fromDate, toDate) { + try { + const response = await axios.get( + `http://localhost:8688/kccb/cbs/montlyacctstmt/details`, + { + params: { stacctno: accountNumber, fromdate: fromDate, todate: toDate }, + } + ); + const transactions = response.data; + const processedTransactions = transactions.map((tx) => ({ + id: tx.stTransactionNumber, + name: tx.stTransactionDesc, + date: tx.stTransactionDate, + amount: tx.stTransactionAmount.slice(0, -3), + type: tx.stTransactionAmount.slice(-2), + })); + return processedTransactions; + } catch (error) { + throw new Error( + 'API call failde: ' + (error.response?.data?.message || error.message) + ); + } +} +module.exports = { getLastTen, getFiltered }; diff --git a/src/routes/transactions.route.js b/src/routes/transactions.route.js index 9e4ff8c..822c24a 100644 --- a/src/routes/transactions.route.js +++ b/src/routes/transactions.route.js @@ -3,15 +3,44 @@ const { logger } = require('../util/logger'); const transactionsRoute = async (req, res) => { const accountNo = req.params.accountNo; + const { fromDate, toDate } = req.query; + let data; try { - const data = await transactionsController.getLastTen(accountNo); + if (fromDate && toDate) { + if (!isValidDDMMYYYY(fromDate) || !isValidDDMMYYYY(toDate)) { + return res.status(400).json({ error: 'INVALID_DATE_FORMAT' }); + } + data = await transactionsController.getFiltered( + accountNo, + fromDate, + toDate + ); + } else { + data = await transactionsController.getLastTen(accountNo); + } return res.json(data); } catch (error) { - logger.error('error retriving last 10 txns', error); + logger.error('error retriving transaction history', error); return res .status(500) .json({ message: 'error occured while fetching transactions' }); } }; +function isValidDDMMYYYY(dateStr) { + if (!/^\d{8}$/.test(dateStr)) return false; + + const day = parseInt(dateStr.slice(0, 2), 10); + const month = parseInt(dateStr.slice(2, 4), 10); + const year = parseInt(dateStr.slice(4), 10); + + const date = new Date(year, month - 1, day); + + return ( + date.getFullYear() === year && + date.getMonth() === month - 1 && + date.getDate() === day + ); +} + module.exports = transactionsRoute;