From abf37599c877a8cc83e5a24c775c3999a9879abf Mon Sep 17 00:00:00 2001 From: ivar Date: Fri, 26 Dec 2025 22:19:09 +0100 Subject: Remove delta from form, wip import method --- app/src/lib/server/actual.ts | 21 +++++++++++++++++++++ app/src/lib/server/importer.ts | 12 +++++++----- app/src/lib/shared.d.ts | 5 +++++ app/src/routes/+page.svelte | 23 +++++++++++------------ app/src/routes/methods.remote.ts | 20 ++++++++++++++++++++ app/src/routes/sb1.remote.ts | 38 -------------------------------------- 6 files changed, 64 insertions(+), 55 deletions(-) create mode 100644 app/src/lib/shared.d.ts create mode 100644 app/src/routes/methods.remote.ts delete mode 100644 app/src/routes/sb1.remote.ts diff --git a/app/src/lib/server/actual.ts b/app/src/lib/server/actual.ts index 0875273..389f390 100644 --- a/app/src/lib/server/actual.ts +++ b/app/src/lib/server/actual.ts @@ -3,6 +3,9 @@ import * as actual from "@actual-app/api" import { existsSync, mkdirSync } from "node:fs"; import path from "node:path" import process from "node:process"; +import type { Sb1Transaction } from "./sb1"; +import type { ImportTransactionEntity } from "@actual-app/api/@types/loot-core/src/types/models/import-transaction"; +import { Temporal } from "temporal-polyfill"; async function init_actual() { const dataDir = path.resolve(process.cwd(), "data/actualDataDir") @@ -17,6 +20,24 @@ async function init_actual() { }) } +export async function import_transactions(account: string, transactions: Sb1Transaction[], dryRun: boolean) { + + function parsedDate(date: number) { + const instant = Temporal.Instant.fromEpochMilliseconds(date) + return instant.toString({ timeZone: "Europe/Oslo" }).split("T")[0] + } + + const actualMappedTransactions: ImportTransactionEntity[] = transactions.filter(c => c.bookingStatus === "BOOKED").map(c => ({ + account, + date: parsedDate(c.date), + amount: c.amount, + notes: c.description, + payee_name: c.cleanedDescription + })) + + actual.importTransactions(account, actualMappedTransactions, { dryRun }) +} + export async function get_budgets() { await init_actual() return actual.getBudgets() diff --git a/app/src/lib/server/importer.ts b/app/src/lib/server/importer.ts index 91adce0..02cb94c 100644 --- a/app/src/lib/server/importer.ts +++ b/app/src/lib/server/importer.ts @@ -1,9 +1,11 @@ -import type { Temporal } from "temporal-polyfill"; import sb1 from "./sb1"; +import * as actual from "./actual"; +import type { ImportForm } from "$lib/shared"; -async function importSince(account: string, date: Temporal.Instant) { - const accounts = await sb1.data.get_accounts() - for (const account of accounts?.accounts ?? []) { - const transactions = await sb1.data.get_transactions(account.key); +async function importSince(form: ImportForm) { + for (const mapping of form.mappings) { + const transactions = await sb1.data.get_transactions(mapping.sb1Id); + if (!transactions?.length) continue + } } \ No newline at end of file diff --git a/app/src/lib/shared.d.ts b/app/src/lib/shared.d.ts new file mode 100644 index 0000000..e63904b --- /dev/null +++ b/app/src/lib/shared.d.ts @@ -0,0 +1,5 @@ +export type ImportForm = { + budgetId: string, + mappings: Array<{ sb1Id: string, actualId: string }>, + dryRun: boolean +} \ No newline at end of file diff --git a/app/src/routes/+page.svelte b/app/src/routes/+page.svelte index 7b0a495..6f257f6 100644 --- a/app/src/routes/+page.svelte +++ b/app/src/routes/+page.svelte @@ -1,18 +1,19 @@