plugin-financials/repositories/TransactionLineRepository.js
2025-11-03 13:51:33 +02:00

75 lines
2 KiB
JavaScript

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>} 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>} 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<Object>} lines - Array of transaction lines
* @returns {Promise<Array>} 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<Object>} 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;