Implement account and transaction upsert functionality; add updateAccounts API endpoint
This commit is contained in:
@ -166,5 +166,97 @@ export async function setTransactionNote(transactionId, note) {
|
||||
return result
|
||||
}
|
||||
|
||||
export async function updateAccounts(data) {
|
||||
try {
|
||||
console.log('Updating accounts with data:', data);
|
||||
for (const account of data.accounts) {
|
||||
// Upsert Org
|
||||
console.log(`Upserting org for account: ${account.id}`, account.org);
|
||||
await db`
|
||||
insert into org (id, domain, name, sfin_url, url)
|
||||
values (${account.org.id}, ${account.org.domain ?? null}, ${account.org.name ?? null}, ${account.org.sfin_url ?? null}, ${account.org.url ?? null})
|
||||
on conflict (id) do update set
|
||||
domain = excluded.domain,
|
||||
name = excluded.name,
|
||||
sfin_url = excluded.sfin_url,
|
||||
url = excluded.url
|
||||
`;
|
||||
console.log(`Upserting account: ${account.id} (${account.name})`);
|
||||
// Upsert Account
|
||||
await db`
|
||||
insert into account (id, org_id, name, currency, balance, available_balance, balance_date)
|
||||
values (
|
||||
${account.id},
|
||||
${account.org.id},
|
||||
${account.name ?? null},
|
||||
${account.currency ?? null},
|
||||
${account.balance ?? null},
|
||||
${account.available_balance ?? null},
|
||||
${account.balance_date ?? null}
|
||||
)
|
||||
on conflict (id) do update set
|
||||
org_id = excluded.org_id,
|
||||
name = excluded.name,
|
||||
currency = excluded.currency,
|
||||
balance = excluded.balance,
|
||||
available_balance = excluded.available_balance,
|
||||
balance_date = excluded.balance_date
|
||||
`;
|
||||
|
||||
// Upsert Transactions
|
||||
if (account.transactions && account.transactions.length > 0) {
|
||||
for (const txn of account.transactions) {
|
||||
let extraId = null;
|
||||
console.log(`Upserting transaction: ${txn.id} for account: ${account.id}`);
|
||||
if (txn.extra) {
|
||||
// Upsert TransactionExtra (insert only, update not needed for category)
|
||||
const extraResult = await db`
|
||||
insert into transaction_extra (category)
|
||||
values (${txn.extra.category ?? null})
|
||||
on conflict (category) do nothing
|
||||
returning id
|
||||
`;
|
||||
if (extraResult.length > 0) {
|
||||
extraId = extraResult[0].id;
|
||||
} else {
|
||||
// If already exists, fetch id
|
||||
const existing = await db`
|
||||
select id from transaction_extra where category = ${txn.extra.category ?? null}
|
||||
`;
|
||||
if (existing.length > 0) {
|
||||
extraId = existing[0].id;
|
||||
}
|
||||
}
|
||||
}
|
||||
console.log(`Preparing to upsert transaction: ${txn.id} with data:`, txn);
|
||||
await db`
|
||||
insert into transaction (id, account_id, posted, amount, description, pending, extra_id)
|
||||
values (
|
||||
${txn.id},
|
||||
${account.id},
|
||||
${txn.posted},
|
||||
${txn.amount ?? null},
|
||||
${txn.description ?? null},
|
||||
${txn.pending},
|
||||
${extraId}
|
||||
)
|
||||
on conflict (id) do update set
|
||||
account_id = excluded.account_id,
|
||||
posted = excluded.posted,
|
||||
amount = excluded.amount,
|
||||
description = excluded.description,
|
||||
pending = excluded.pending,
|
||||
extra_id = excluded.extra_id
|
||||
`;
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
} catch (error) {
|
||||
console.error('updateAccounts error:', error);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
export default db
|
||||
@ -1,5 +1,14 @@
|
||||
|
||||
export async function updateAccounts()
|
||||
{
|
||||
fetch
|
||||
export async function fetchAccounts(url, startDate) {
|
||||
const { username, password, origin, pathname } = new URL(url);
|
||||
const start = Math.floor(startDate.getTime() / 1000);
|
||||
const apiUrl = `${origin}${pathname}/accounts?start-date=${start}`;
|
||||
const headers = {};
|
||||
|
||||
if (username && password) {
|
||||
headers['Authorization'] = 'Basic ' + btoa(`${username}:${password}`);
|
||||
}
|
||||
|
||||
const response = await fetch(apiUrl, { headers });
|
||||
return await response.json();
|
||||
}
|
||||
Reference in New Issue
Block a user