feat: add account metadata and interest analytics
This commit is contained in:
@@ -171,7 +171,7 @@ export async function importStatement(
|
||||
let isNewAccount = false;
|
||||
|
||||
const accResult = await client.query(
|
||||
'SELECT id FROM accounts WHERE bank = $1 AND account_number = $2',
|
||||
'SELECT id, account_type FROM accounts WHERE bank = $1 AND account_number = $2',
|
||||
[data.bank, data.statement.accountNumber],
|
||||
);
|
||||
|
||||
@@ -206,6 +206,14 @@ export async function importStatement(
|
||||
throw new Error("Category 'Поступления' is missing");
|
||||
}
|
||||
const incomeCategoryId = Number(incomeCategoryResult.rows[0].id);
|
||||
const accountType = accResult.rows[0]?.account_type ?? null;
|
||||
const investmentCategoryResult = await client.query(
|
||||
`SELECT id FROM categories WHERE name = 'Инвестиции' AND type = 'transfer' AND is_active = TRUE LIMIT 1`,
|
||||
);
|
||||
const investmentCategoryId = investmentCategoryResult.rows[0]
|
||||
? Number(investmentCategoryResult.rows[0].id)
|
||||
: null;
|
||||
const isInvestmentAccount = ['brokerage', 'iis', 'savings'].includes(accountType);
|
||||
|
||||
// Insert transactions
|
||||
const insertedIds: number[] = [];
|
||||
@@ -218,9 +226,11 @@ export async function importStatement(
|
||||
tx.description.toLowerCase().includes(CASHBACK_KEYWORD);
|
||||
const dir = isCashbackCommissionImport
|
||||
? 'income'
|
||||
: determineDirection(tx.amountSigned, tx.description);
|
||||
const categoryId = isCashbackCommissionImport ? incomeCategoryId : null;
|
||||
const isCategoryConfirmed = isCashbackCommissionImport;
|
||||
: isInvestmentAccount ? 'transfer' : determineDirection(tx.amountSigned, tx.description);
|
||||
const categoryId = isCashbackCommissionImport
|
||||
? incomeCategoryId
|
||||
: isInvestmentAccount ? investmentCategoryId : null;
|
||||
const isCategoryConfirmed = isCashbackCommissionImport || isInvestmentAccount;
|
||||
|
||||
const result = await client.query(
|
||||
`INSERT INTO transactions
|
||||
@@ -263,6 +273,7 @@ export async function importStatement(
|
||||
OR (cr.match_type = 'starts_with' AND t2.description ILIKE cr.pattern || '%')
|
||||
)
|
||||
WHERE t2.id = ANY($1::bigint[])
|
||||
AND t2.is_category_confirmed = FALSE
|
||||
ORDER BY t2.id, cr.priority DESC, cr.id ASC
|
||||
) sub
|
||||
WHERE t.id = sub.tx_id`,
|
||||
|
||||
Reference in New Issue
Block a user