const BaseFinancialRepository = require('./BaseFinancialRepository'); /** * Transaction Line Repository * * Manages transaction lines for double-entry bookkeeping. * Each transaction should have balanced debit and credit lines. */ class TransactionLineRepository extends BaseFinancialRepository { constructor() { super('pg_fn_transaction_lines'); } /** * Find lines for a transaction * @param {string} transactionId - Transaction ID * @returns {Promise} Array of transaction lines */ async findByTransactionId(transactionId) { try { return await this.findAll({ transaction_id: transactionId }, { orderBy: 'created_at' }); } catch (error) { throw error; } } /** * Find lines for an account * @param {string} accountId - Account ID * @returns {Promise} Array of transaction lines */ async findByAccountId(accountId) { try { return await this.findAll({ account_id: accountId }, { orderBy: 'created_at', orderDirection: 'desc' }); } catch (error) { throw error; } } /** * Create transaction lines in batch * @param {Array} lines - Array of transaction lines * @returns {Promise} Created lines */ async createLines(lines) { try { const createdLines = []; for (const line of lines) { const created = await this.create(line); createdLines.push(created); } return createdLines; } catch (error) { throw error; } } /** * Validate double-entry balance * @param {Array} lines - Transaction lines * @returns {boolean} True if debits equal credits */ validateBalance(lines) { const totalDebits = lines.reduce((sum, line) => sum + parseFloat(line.debit_amount || 0), 0); const totalCredits = lines.reduce((sum, line) => sum + parseFloat(line.credit_amount || 0), 0); return totalDebits === totalCredits; } } module.exports = TransactionLineRepository;