summaryrefslogtreecommitdiff
path: root/rust/actualbudget_importer
diff options
context:
space:
mode:
Diffstat (limited to 'rust/actualbudget_importer')
-rw-r--r--rust/actualbudget_importer/Cargo.lock679
-rw-r--r--rust/actualbudget_importer/Cargo.toml11
-rw-r--r--rust/actualbudget_importer/src/main.rs45
-rw-r--r--rust/actualbudget_importer/src/models/actualbudget_account.rs8
-rw-r--r--rust/actualbudget_importer/src/models/actualbudget_category.rs8
-rw-r--r--rust/actualbudget_importer/src/models/actualbudget_date.rs75
-rw-r--r--rust/actualbudget_importer/src/models/actualbudget_transaction.rs18
-rw-r--r--rust/actualbudget_importer/src/models/actualbudget_zero_budget.rs13
-rw-r--r--rust/actualbudget_importer/src/models/mod.rs5
-rw-r--r--rust/actualbudget_importer/src/queries/actualbudget_accounts/get_all.rs6
-rw-r--r--rust/actualbudget_importer/src/queries/actualbudget_accounts/get_category_transfers_account.rs13
-rw-r--r--rust/actualbudget_importer/src/queries/actualbudget_accounts/mod.rs5
-rw-r--r--rust/actualbudget_importer/src/queries/actualbudget_categories/get_all.rs6
-rw-r--r--rust/actualbudget_importer/src/queries/actualbudget_categories/mod.rs3
-rw-r--r--rust/actualbudget_importer/src/queries/actualbudget_transactions/get_all.rs6
-rw-r--r--rust/actualbudget_importer/src/queries/actualbudget_transactions/get_first_date.rs14
-rw-r--r--rust/actualbudget_importer/src/queries/actualbudget_transactions/mod.rs5
-rw-r--r--rust/actualbudget_importer/src/queries/actualbudget_zero_budgets/get_all.rs6
-rw-r--r--rust/actualbudget_importer/src/queries/actualbudget_zero_budgets/mod.rs3
-rw-r--r--rust/actualbudget_importer/src/queries/mod.rs4
-rw-r--r--rust/actualbudget_importer/src/schema.rs47
-rw-r--r--rust/actualbudget_importer/src/transformers.rs218
22 files changed, 0 insertions, 1198 deletions
diff --git a/rust/actualbudget_importer/Cargo.lock b/rust/actualbudget_importer/Cargo.lock
deleted file mode 100644
index b2da38b..0000000
--- a/rust/actualbudget_importer/Cargo.lock
+++ /dev/null
@@ -1,679 +0,0 @@
-# This file is automatically @generated by Cargo.
-# It is not intended for manual editing.
-version = 3
-
-[[package]]
-name = "actualbudget"
-version = "0.1.0"
-dependencies = [
- "anyhow",
- "schist_core",
- "chrono",
- "diesel",
- "libsqlite3-sys",
-]
-
-[[package]]
-name = "android-tzdata"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
-
-[[package]]
-name = "android_system_properties"
-version = "0.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "anyhow"
-version = "1.0.90"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "37bf3594c4c988a53154954629820791dde498571819ae4ca50ca811e060cc95"
-
-[[package]]
-name = "autocfg"
-version = "1.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0"
-
-[[package]]
-name = "schist_core"
-version = "0.1.0"
-dependencies = [
- "anyhow",
- "chrono",
- "derive_builder",
- "diesel",
- "diesel_migrations",
- "serde",
-]
-
-[[package]]
-name = "bumpalo"
-version = "3.16.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c"
-
-[[package]]
-name = "cc"
-version = "1.1.16"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e9d013ecb737093c0e86b151a7b837993cf9ec6c502946cfb44bedc392421e0b"
-dependencies = [
- "shlex",
-]
-
-[[package]]
-name = "cfg-if"
-version = "1.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
-
-[[package]]
-name = "chrono"
-version = "0.4.38"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401"
-dependencies = [
- "android-tzdata",
- "iana-time-zone",
- "js-sys",
- "num-traits",
- "serde",
- "wasm-bindgen",
- "windows-targets",
-]
-
-[[package]]
-name = "core-foundation-sys"
-version = "0.8.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
-
-[[package]]
-name = "darling"
-version = "0.20.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989"
-dependencies = [
- "darling_core",
- "darling_macro",
-]
-
-[[package]]
-name = "darling_core"
-version = "0.20.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5"
-dependencies = [
- "fnv",
- "ident_case",
- "proc-macro2",
- "quote",
- "strsim",
- "syn",
-]
-
-[[package]]
-name = "darling_macro"
-version = "0.20.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806"
-dependencies = [
- "darling_core",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "deranged"
-version = "0.3.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4"
-dependencies = [
- "powerfmt",
-]
-
-[[package]]
-name = "derive_builder"
-version = "0.20.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947"
-dependencies = [
- "derive_builder_macro",
-]
-
-[[package]]
-name = "derive_builder_core"
-version = "0.20.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8"
-dependencies = [
- "darling",
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "derive_builder_macro"
-version = "0.20.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c"
-dependencies = [
- "derive_builder_core",
- "syn",
-]
-
-[[package]]
-name = "diesel"
-version = "2.2.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "158fe8e2e68695bd615d7e4f3227c0727b151330d3e253b525086c348d055d5e"
-dependencies = [
- "diesel_derives",
- "libsqlite3-sys",
- "time",
-]
-
-[[package]]
-name = "diesel_derives"
-version = "2.2.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e7f2c3de51e2ba6bf2a648285696137aaf0f5f487bcbea93972fe8a364e131a4"
-dependencies = [
- "diesel_table_macro_syntax",
- "dsl_auto_type",
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "diesel_migrations"
-version = "2.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8a73ce704bad4231f001bff3314d91dce4aba0770cee8b233991859abc15c1f6"
-dependencies = [
- "diesel",
- "migrations_internals",
- "migrations_macros",
-]
-
-[[package]]
-name = "diesel_table_macro_syntax"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "209c735641a413bc68c4923a9d6ad4bcb3ca306b794edaa7eb0b3228a99ffb25"
-dependencies = [
- "syn",
-]
-
-[[package]]
-name = "dsl_auto_type"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c5d9abe6314103864cc2d8901b7ae224e0ab1a103a0a416661b4097b0779b607"
-dependencies = [
- "darling",
- "either",
- "heck",
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "either"
-version = "1.13.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0"
-
-[[package]]
-name = "equivalent"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
-
-[[package]]
-name = "fnv"
-version = "1.0.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
-
-[[package]]
-name = "hashbrown"
-version = "0.15.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb"
-
-[[package]]
-name = "heck"
-version = "0.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
-
-[[package]]
-name = "iana-time-zone"
-version = "0.1.60"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141"
-dependencies = [
- "android_system_properties",
- "core-foundation-sys",
- "iana-time-zone-haiku",
- "js-sys",
- "wasm-bindgen",
- "windows-core",
-]
-
-[[package]]
-name = "iana-time-zone-haiku"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
-dependencies = [
- "cc",
-]
-
-[[package]]
-name = "ident_case"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
-
-[[package]]
-name = "indexmap"
-version = "2.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da"
-dependencies = [
- "equivalent",
- "hashbrown",
-]
-
-[[package]]
-name = "itoa"
-version = "1.0.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
-
-[[package]]
-name = "js-sys"
-version = "0.3.70"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a"
-dependencies = [
- "wasm-bindgen",
-]
-
-[[package]]
-name = "libc"
-version = "0.2.158"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439"
-
-[[package]]
-name = "libsqlite3-sys"
-version = "0.30.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2e99fb7a497b1e3339bc746195567ed8d3e24945ecd636e3619d20b9de9e9149"
-dependencies = [
- "cc",
- "pkg-config",
- "vcpkg",
-]
-
-[[package]]
-name = "log"
-version = "0.4.22"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24"
-
-[[package]]
-name = "memchr"
-version = "2.7.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
-
-[[package]]
-name = "migrations_internals"
-version = "2.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fd01039851e82f8799046eabbb354056283fb265c8ec0996af940f4e85a380ff"
-dependencies = [
- "serde",
- "toml",
-]
-
-[[package]]
-name = "migrations_macros"
-version = "2.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ffb161cc72176cb37aa47f1fc520d3ef02263d67d661f44f05d05a079e1237fd"
-dependencies = [
- "migrations_internals",
- "proc-macro2",
- "quote",
-]
-
-[[package]]
-name = "num-conv"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9"
-
-[[package]]
-name = "num-traits"
-version = "0.2.19"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
-dependencies = [
- "autocfg",
-]
-
-[[package]]
-name = "once_cell"
-version = "1.19.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
-
-[[package]]
-name = "pkg-config"
-version = "0.3.30"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec"
-
-[[package]]
-name = "powerfmt"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391"
-
-[[package]]
-name = "proc-macro2"
-version = "1.0.86"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77"
-dependencies = [
- "unicode-ident",
-]
-
-[[package]]
-name = "quote"
-version = "1.0.37"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af"
-dependencies = [
- "proc-macro2",
-]
-
-[[package]]
-name = "serde"
-version = "1.0.210"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a"
-dependencies = [
- "serde_derive",
-]
-
-[[package]]
-name = "serde_derive"
-version = "1.0.210"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
-name = "serde_spanned"
-version = "0.6.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1"
-dependencies = [
- "serde",
-]
-
-[[package]]
-name = "shlex"
-version = "1.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
-
-[[package]]
-name = "strsim"
-version = "0.11.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
-
-[[package]]
-name = "syn"
-version = "2.0.77"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed"
-dependencies = [
- "proc-macro2",
- "quote",
- "unicode-ident",
-]
-
-[[package]]
-name = "time"
-version = "0.3.36"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885"
-dependencies = [
- "deranged",
- "itoa",
- "num-conv",
- "powerfmt",
- "serde",
- "time-core",
- "time-macros",
-]
-
-[[package]]
-name = "time-core"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3"
-
-[[package]]
-name = "time-macros"
-version = "0.2.18"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf"
-dependencies = [
- "num-conv",
- "time-core",
-]
-
-[[package]]
-name = "toml"
-version = "0.8.19"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e"
-dependencies = [
- "serde",
- "serde_spanned",
- "toml_datetime",
- "toml_edit",
-]
-
-[[package]]
-name = "toml_datetime"
-version = "0.6.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41"
-dependencies = [
- "serde",
-]
-
-[[package]]
-name = "toml_edit"
-version = "0.22.22"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5"
-dependencies = [
- "indexmap",
- "serde",
- "serde_spanned",
- "toml_datetime",
- "winnow",
-]
-
-[[package]]
-name = "unicode-ident"
-version = "1.0.13"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe"
-
-[[package]]
-name = "vcpkg"
-version = "0.2.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
-
-[[package]]
-name = "wasm-bindgen"
-version = "0.2.93"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5"
-dependencies = [
- "cfg-if",
- "once_cell",
- "wasm-bindgen-macro",
-]
-
-[[package]]
-name = "wasm-bindgen-backend"
-version = "0.2.93"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b"
-dependencies = [
- "bumpalo",
- "log",
- "once_cell",
- "proc-macro2",
- "quote",
- "syn",
- "wasm-bindgen-shared",
-]
-
-[[package]]
-name = "wasm-bindgen-macro"
-version = "0.2.93"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf"
-dependencies = [
- "quote",
- "wasm-bindgen-macro-support",
-]
-
-[[package]]
-name = "wasm-bindgen-macro-support"
-version = "0.2.93"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn",
- "wasm-bindgen-backend",
- "wasm-bindgen-shared",
-]
-
-[[package]]
-name = "wasm-bindgen-shared"
-version = "0.2.93"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484"
-
-[[package]]
-name = "windows-core"
-version = "0.52.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
-dependencies = [
- "windows-targets",
-]
-
-[[package]]
-name = "windows-targets"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
-dependencies = [
- "windows_aarch64_gnullvm",
- "windows_aarch64_msvc",
- "windows_i686_gnu",
- "windows_i686_gnullvm",
- "windows_i686_msvc",
- "windows_x86_64_gnu",
- "windows_x86_64_gnullvm",
- "windows_x86_64_msvc",
-]
-
-[[package]]
-name = "windows_aarch64_gnullvm"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
-
-[[package]]
-name = "windows_aarch64_msvc"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
-
-[[package]]
-name = "windows_i686_gnu"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
-
-[[package]]
-name = "windows_i686_gnullvm"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
-
-[[package]]
-name = "windows_i686_msvc"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
-
-[[package]]
-name = "windows_x86_64_gnu"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
-
-[[package]]
-name = "windows_x86_64_gnullvm"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
-
-[[package]]
-name = "windows_x86_64_msvc"
-version = "0.52.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
-
-[[package]]
-name = "winnow"
-version = "0.6.20"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b"
-dependencies = [
- "memchr",
-]
diff --git a/rust/actualbudget_importer/Cargo.toml b/rust/actualbudget_importer/Cargo.toml
deleted file mode 100644
index 03d0292..0000000
--- a/rust/actualbudget_importer/Cargo.toml
+++ /dev/null
@@ -1,11 +0,0 @@
-[package]
-name = "actualbudget_importer"
-version = "0.1.0"
-edition = "2021"
-
-[dependencies]
-anyhow = { workspace = true }
-schist_core = { path = "../schist_core" }
-chrono = { workspace = true, features = ["serde"] }
-diesel = { workspace = true, features = ["sqlite"] }
-libsqlite3-sys = { workspace = true, features = ["bundled"] }
diff --git a/rust/actualbudget_importer/src/main.rs b/rust/actualbudget_importer/src/main.rs
deleted file mode 100644
index 78c64f4..0000000
--- a/rust/actualbudget_importer/src/main.rs
+++ /dev/null
@@ -1,45 +0,0 @@
-pub mod models;
-pub mod queries;
-pub mod schema;
-pub mod transformers;
-
-use anyhow::Result;
-use schist_core::queries as schist_queries;
-use diesel::{Connection, SqliteConnection};
-use queries::{actualbudget_accounts::{get_all_actualbudget_accounts, get_category_transfers_account}, actualbudget_categories::get_all_actualbudget_categories, actualbudget_transactions::{get_all_actualbudget_transactions, get_first_actualbudget_transaction_date}, actualbudget_zero_budgets::get_all_actualbudget_zero_budgets};
-
-fn main() -> Result<()> {
- let connection_src = &mut SqliteConnection::establish("in.sqlite").unwrap();
- let connection_dest = &mut SqliteConnection::establish("out.sqlite").unwrap();
-
- let actualbudget_first_transaction_date = get_first_actualbudget_transaction_date(connection_src)?;
- let actualbudget_accounts = get_all_actualbudget_accounts(connection_src)?;
- let actualbudget_categories = get_all_actualbudget_categories(connection_src)?;
- let actualbudget_zero_budgets = get_all_actualbudget_zero_budgets(connection_src)?;
- let actualbudget_category_transfers_account = get_category_transfers_account(connection_src)?;
- let actualbudget_transactions = get_all_actualbudget_transactions(connection_src)?;
-
- let first_transaction_date = transformers::transform_date(&actualbudget_first_transaction_date)?;
- let accounts =
- transformers::transform_accounts(&actualbudget_accounts, &first_transaction_date);
- let categories = transformers::transform_categories(&actualbudget_categories);
- let budget_updates = transformers::transform_budget_updates(&actualbudget_zero_budgets)?;
- let (transactions, transaction_categorisations) = transformers::transform_transactions(
- &actualbudget_transactions,
- &actualbudget_category_transfers_account,
- )?;
- let category_transfers = transformers::transform_category_transfers(
- &actualbudget_transactions,
- &actualbudget_category_transfers_account,
- );
-
- schist_queries::clear::clear(connection_dest)?;
- schist_queries::accounts::insert_accounts(&accounts, connection_dest)?;
- schist_queries::categories::insert_categories(&categories, connection_dest)?;
- schist_queries::budget_updates::insert_budget_updates(&budget_updates, connection_dest)?;
- schist_queries::transactions::insert_transactions(&transactions, connection_dest)?;
- schist_queries::transaction_categorisations::insert_transaction_categorisations(&transaction_categorisations, connection_dest)?;
- schist_queries::category_transfers::insert_category_transfers(&category_transfers, connection_dest)?;
-
- Ok(())
-}
diff --git a/rust/actualbudget_importer/src/models/actualbudget_account.rs b/rust/actualbudget_importer/src/models/actualbudget_account.rs
deleted file mode 100644
index b3d00ac..0000000
--- a/rust/actualbudget_importer/src/models/actualbudget_account.rs
+++ /dev/null
@@ -1,8 +0,0 @@
-use diesel::prelude::{Queryable, Selectable};
-
-#[derive(Queryable, Selectable)]
-#[diesel(table_name = crate::schema::accounts)]
-pub struct ActualbudgetAccount {
- pub id: String,
- pub name: String,
-}
diff --git a/rust/actualbudget_importer/src/models/actualbudget_category.rs b/rust/actualbudget_importer/src/models/actualbudget_category.rs
deleted file mode 100644
index cbea99b..0000000
--- a/rust/actualbudget_importer/src/models/actualbudget_category.rs
+++ /dev/null
@@ -1,8 +0,0 @@
-use diesel::{prelude::Queryable, Selectable};
-
-#[derive(Queryable, Selectable)]
-#[diesel(table_name = crate::schema::categories)]
-pub struct ActualbudgetCategory {
- pub id: String,
- pub name: String,
-}
diff --git a/rust/actualbudget_importer/src/models/actualbudget_date.rs b/rust/actualbudget_importer/src/models/actualbudget_date.rs
deleted file mode 100644
index bef160c..0000000
--- a/rust/actualbudget_importer/src/models/actualbudget_date.rs
+++ /dev/null
@@ -1,75 +0,0 @@
-use diesel::{backend::Backend, deserialize::{FromSql, FromSqlRow}, expression::AsExpression, sql_types::Integer, sqlite::Sqlite};
-
-#[derive(Clone, PartialEq, Eq, Debug, AsExpression, FromSqlRow)]
-#[diesel(sql_type=Integer)]
-pub struct ActualbudgetDate(i32);
-
-#[derive(Clone, PartialOrd, PartialEq, Eq)]
-enum DatePart {
- MonthOfYear,
- DayOfMonth,
-}
-
-// actualbudget represents dates as numbers which "look like" the corresponding
-// ISO string when written in decimal. E.g. 20240901 represents 1 Sep 2024. It
-// also uses month specifiers, e.g. 202409 to represent Sep 2024. In this case,
-// we interpret this as the first day of the month, e.g. 2024-09-01.
-
-impl ActualbudgetDate {
- pub fn to_iso(&self) -> String {
- format!("{0}-{1}-{2}", self.year(), self.month(), self.day())
- }
-
- pub fn year(&self) -> String {
- self.0.to_string()[0..4].to_string()
- }
-
- pub fn month(&self) -> String {
- self.0.to_string()[4..6].to_string()
- }
-
- pub fn day(&self) -> String {
- match self.date_part() {
- DatePart::DayOfMonth => self.0.to_string()[6..8].to_string(),
- DatePart::MonthOfYear => String::from("01"),
- }
- }
-
- pub fn from_i32(i: i32) -> Self {
- ActualbudgetDate(i)
- }
-
- fn date_part(&self) -> DatePart {
- if self.0 < 10000000 {
- DatePart::MonthOfYear
- } else {
- DatePart::DayOfMonth
- }
- }
-
- fn dayified_value(&self) -> i32 {
- match self.date_part() {
- DatePart::DayOfMonth => self.0,
- DatePart::MonthOfYear => self.0 * 100 + 1,
- }
- }
-}
-
-impl Ord for ActualbudgetDate {
- fn cmp(&self, other: &Self) -> std::cmp::Ordering {
- self.dayified_value().cmp(&other.dayified_value())
- }
-}
-
-impl PartialOrd for ActualbudgetDate {
- fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
- Some(self.cmp(other))
- }
-}
-
-impl FromSql<Integer, Sqlite> for ActualbudgetDate {
- fn from_sql(bytes: <Sqlite as Backend>::RawValue<'_>) -> diesel::deserialize::Result<Self> {
- let int: i32 = FromSql::<Integer, Sqlite>::from_sql(bytes)?;
- Ok(ActualbudgetDate(int))
- }
-}
diff --git a/rust/actualbudget_importer/src/models/actualbudget_transaction.rs b/rust/actualbudget_importer/src/models/actualbudget_transaction.rs
deleted file mode 100644
index be2ca1a..0000000
--- a/rust/actualbudget_importer/src/models/actualbudget_transaction.rs
+++ /dev/null
@@ -1,18 +0,0 @@
-use diesel::prelude::{Identifiable, Queryable, QueryableByName, Selectable};
-
-use crate::models::actualbudget_date::ActualbudgetDate;
-
-#[derive(Identifiable, QueryableByName, Queryable, Selectable, Clone)]
-#[diesel(table_name = crate::schema::transactions)]
-pub struct ActualbudgetTransaction {
- pub id: String,
- pub is_parent: bool,
- pub is_child: bool,
- pub account_id: String,
- pub category_id: String,
- pub amount: i32,
- pub payee: String,
- pub notes: String,
- pub date: ActualbudgetDate,
- pub parent_id: Option<String>,
-}
diff --git a/rust/actualbudget_importer/src/models/actualbudget_zero_budget.rs b/rust/actualbudget_importer/src/models/actualbudget_zero_budget.rs
deleted file mode 100644
index 6478d34..0000000
--- a/rust/actualbudget_importer/src/models/actualbudget_zero_budget.rs
+++ /dev/null
@@ -1,13 +0,0 @@
-use crate::models::actualbudget_date::ActualbudgetDate;
-use diesel::{prelude::{Identifiable, Queryable, QueryableByName, Selectable}, sqlite::Sqlite};
-
-#[derive(Identifiable, QueryableByName, Queryable, Selectable, Clone)]
-#[diesel(table_name = crate::schema::zero_budgets)]
-#[diesel(check_for_backend(Sqlite))]
-pub struct ActualbudgetZeroBudget {
- pub id: String,
- pub month: ActualbudgetDate,
- pub category_id: String,
- pub amount: i32,
- pub do_carry_over: i32,
-}
diff --git a/rust/actualbudget_importer/src/models/mod.rs b/rust/actualbudget_importer/src/models/mod.rs
deleted file mode 100644
index 1c97c65..0000000
--- a/rust/actualbudget_importer/src/models/mod.rs
+++ /dev/null
@@ -1,5 +0,0 @@
-pub mod actualbudget_account;
-pub mod actualbudget_category;
-pub mod actualbudget_date;
-pub mod actualbudget_transaction;
-pub mod actualbudget_zero_budget;
diff --git a/rust/actualbudget_importer/src/queries/actualbudget_accounts/get_all.rs b/rust/actualbudget_importer/src/queries/actualbudget_accounts/get_all.rs
deleted file mode 100644
index 6f667de..0000000
--- a/rust/actualbudget_importer/src/queries/actualbudget_accounts/get_all.rs
+++ /dev/null
@@ -1,6 +0,0 @@
-use crate::{models::actualbudget_account::ActualbudgetAccount, schema::accounts::dsl::accounts};
-use diesel::{result::Error, QueryDsl, RunQueryDsl, SelectableHelper, SqliteConnection};
-
-pub fn get_all_actualbudget_accounts(connection: &mut SqliteConnection) -> Result<Vec<ActualbudgetAccount>, Error> {
- accounts.select(ActualbudgetAccount::as_select()).load(connection)
-}
diff --git a/rust/actualbudget_importer/src/queries/actualbudget_accounts/get_category_transfers_account.rs b/rust/actualbudget_importer/src/queries/actualbudget_accounts/get_category_transfers_account.rs
deleted file mode 100644
index f05dc78..0000000
--- a/rust/actualbudget_importer/src/queries/actualbudget_accounts/get_category_transfers_account.rs
+++ /dev/null
@@ -1,13 +0,0 @@
-use diesel::{result::Error, ExpressionMethods, QueryDsl, RunQueryDsl, SelectableHelper, SqliteConnection};
-
-use crate::{models::actualbudget_account::ActualbudgetAccount, schema::accounts::{
- self as accounts_schema,
- dsl::accounts as accounts_table,
-}};
-
-pub fn get_category_transfers_account(connection: &mut SqliteConnection) -> Result<ActualbudgetAccount, Error> {
- accounts_table
- .filter(accounts_schema::name.eq("Category transfers"))
- .select(ActualbudgetAccount::as_select())
- .first(connection)
-}
diff --git a/rust/actualbudget_importer/src/queries/actualbudget_accounts/mod.rs b/rust/actualbudget_importer/src/queries/actualbudget_accounts/mod.rs
deleted file mode 100644
index c6d6015..0000000
--- a/rust/actualbudget_importer/src/queries/actualbudget_accounts/mod.rs
+++ /dev/null
@@ -1,5 +0,0 @@
-mod get_all;
-mod get_category_transfers_account;
-
-pub use get_all::get_all_actualbudget_accounts;
-pub use get_category_transfers_account::get_category_transfers_account;
diff --git a/rust/actualbudget_importer/src/queries/actualbudget_categories/get_all.rs b/rust/actualbudget_importer/src/queries/actualbudget_categories/get_all.rs
deleted file mode 100644
index 4cb7ebc..0000000
--- a/rust/actualbudget_importer/src/queries/actualbudget_categories/get_all.rs
+++ /dev/null
@@ -1,6 +0,0 @@
-use crate::{models::actualbudget_category::ActualbudgetCategory, schema::categories::dsl::categories};
-use diesel::{result::Error, QueryDsl, RunQueryDsl, SelectableHelper, SqliteConnection};
-
-pub fn get_all_actualbudget_categories(connection: &mut SqliteConnection) -> Result<Vec<ActualbudgetCategory>, Error> {
- categories.select(ActualbudgetCategory::as_select()).load(connection)
-}
diff --git a/rust/actualbudget_importer/src/queries/actualbudget_categories/mod.rs b/rust/actualbudget_importer/src/queries/actualbudget_categories/mod.rs
deleted file mode 100644
index 0c04e53..0000000
--- a/rust/actualbudget_importer/src/queries/actualbudget_categories/mod.rs
+++ /dev/null
@@ -1,3 +0,0 @@
-mod get_all;
-
-pub use get_all::get_all_actualbudget_categories;
diff --git a/rust/actualbudget_importer/src/queries/actualbudget_transactions/get_all.rs b/rust/actualbudget_importer/src/queries/actualbudget_transactions/get_all.rs
deleted file mode 100644
index 84c8d08..0000000
--- a/rust/actualbudget_importer/src/queries/actualbudget_transactions/get_all.rs
+++ /dev/null
@@ -1,6 +0,0 @@
-use crate::{models::actualbudget_transaction::ActualbudgetTransaction, schema::transactions::dsl::transactions};
-use diesel::{result::Error, QueryDsl, RunQueryDsl, SelectableHelper, SqliteConnection};
-
-pub fn get_all_actualbudget_transactions(connection: &mut SqliteConnection) -> Result<Vec<ActualbudgetTransaction>, Error> {
- transactions.select(ActualbudgetTransaction::as_select()).load(connection)
-}
diff --git a/rust/actualbudget_importer/src/queries/actualbudget_transactions/get_first_date.rs b/rust/actualbudget_importer/src/queries/actualbudget_transactions/get_first_date.rs
deleted file mode 100644
index b958c37..0000000
--- a/rust/actualbudget_importer/src/queries/actualbudget_transactions/get_first_date.rs
+++ /dev/null
@@ -1,14 +0,0 @@
-use anyhow::Result;
-use crate::{models::actualbudget_date::ActualbudgetDate, schema::transactions::{
- self as transactions_schema,
- dsl::transactions as transactions_table,
-}};
-use diesel::{dsl::min, result::Error, QueryDsl, RunQueryDsl, SqliteConnection};
-
-pub fn get_first_actualbudget_transaction_date(connection: &mut SqliteConnection) -> Result<ActualbudgetDate> {
- let date_as_int = transactions_table
- .select(min(transactions_schema::date))
- .first::<Option<i32>>(connection)
- .map_or_else(|e| Err(e), |o| o.map_or_else(|| Err(Error::NotFound), |i| Ok(i)))?;
- Ok(ActualbudgetDate::from_i32(date_as_int))
-}
diff --git a/rust/actualbudget_importer/src/queries/actualbudget_transactions/mod.rs b/rust/actualbudget_importer/src/queries/actualbudget_transactions/mod.rs
deleted file mode 100644
index b4ed0dd..0000000
--- a/rust/actualbudget_importer/src/queries/actualbudget_transactions/mod.rs
+++ /dev/null
@@ -1,5 +0,0 @@
-mod get_all;
-mod get_first_date;
-
-pub use get_all::get_all_actualbudget_transactions;
-pub use get_first_date::get_first_actualbudget_transaction_date;
diff --git a/rust/actualbudget_importer/src/queries/actualbudget_zero_budgets/get_all.rs b/rust/actualbudget_importer/src/queries/actualbudget_zero_budgets/get_all.rs
deleted file mode 100644
index 0c3f695..0000000
--- a/rust/actualbudget_importer/src/queries/actualbudget_zero_budgets/get_all.rs
+++ /dev/null
@@ -1,6 +0,0 @@
-use crate::{models::actualbudget_zero_budget::ActualbudgetZeroBudget, schema::zero_budgets::dsl::zero_budgets};
-use diesel::{result::Error, QueryDsl, RunQueryDsl, SelectableHelper, SqliteConnection};
-
-pub fn get_all_actualbudget_zero_budgets(connection: &mut SqliteConnection) -> Result<Vec<ActualbudgetZeroBudget>, Error> {
- zero_budgets.select(ActualbudgetZeroBudget::as_select()).load(connection)
-}
diff --git a/rust/actualbudget_importer/src/queries/actualbudget_zero_budgets/mod.rs b/rust/actualbudget_importer/src/queries/actualbudget_zero_budgets/mod.rs
deleted file mode 100644
index ba7e21b..0000000
--- a/rust/actualbudget_importer/src/queries/actualbudget_zero_budgets/mod.rs
+++ /dev/null
@@ -1,3 +0,0 @@
-mod get_all;
-
-pub use get_all::get_all_actualbudget_zero_budgets;
diff --git a/rust/actualbudget_importer/src/queries/mod.rs b/rust/actualbudget_importer/src/queries/mod.rs
deleted file mode 100644
index e16dafc..0000000
--- a/rust/actualbudget_importer/src/queries/mod.rs
+++ /dev/null
@@ -1,4 +0,0 @@
-pub mod actualbudget_accounts;
-pub mod actualbudget_categories;
-pub mod actualbudget_transactions;
-pub mod actualbudget_zero_budgets;
diff --git a/rust/actualbudget_importer/src/schema.rs b/rust/actualbudget_importer/src/schema.rs
deleted file mode 100644
index a872231..0000000
--- a/rust/actualbudget_importer/src/schema.rs
+++ /dev/null
@@ -1,47 +0,0 @@
-diesel::table! {
- accounts (id) {
- id -> Text,
- name -> Text,
- }
-}
-
-diesel::table! {
- categories (id) {
- id -> Text,
- name -> Text,
- }
-}
-
-diesel::table! {
- transactions (id) {
- id -> Text,
- #[sql_name = "isParent"]
- is_parent -> Bool,
- #[sql_name = "isChild"]
- is_child -> Bool,
- #[sql_name = "acct"]
- account_id -> Text,
- #[sql_name = "category"]
- category_id -> Text,
- amount -> Integer,
- #[sql_name = "description"]
- payee -> Text,
- notes -> Text,
- date -> Integer,
- parent_id -> Nullable<Text>,
- }
-}
-
-diesel::table! {
- zero_budgets (id) {
- id -> Text,
- month -> Integer,
- #[sql_name = "category"]
- category_id -> Text,
- amount -> Integer,
- #[sql_name = "carryover"]
- do_carry_over -> Integer,
- // goal -> Integer,
- // long_goal -> Integer,
- }
-}
diff --git a/rust/actualbudget_importer/src/transformers.rs b/rust/actualbudget_importer/src/transformers.rs
deleted file mode 100644
index 7e8141a..0000000
--- a/rust/actualbudget_importer/src/transformers.rs
+++ /dev/null
@@ -1,218 +0,0 @@
-use anyhow::Result;
-use schist_core::models::{
- account::Account, budget_update::BudgetUpdate, category::Category, category_transfer::CategoryTransfer, date_utc::DateUtc, datetime_utc::DatetimeUtc, transaction::Transaction, transaction_categorisation::TransactionCategorisation
-};
-use core::panic;
-use std::hash::{DefaultHasher, Hash, Hasher};
-
-use crate::models::{actualbudget_account::ActualbudgetAccount, actualbudget_category::ActualbudgetCategory, actualbudget_date::ActualbudgetDate, actualbudget_transaction::ActualbudgetTransaction, actualbudget_zero_budget::ActualbudgetZeroBudget};
-
-pub fn transform_date(actualbudget_date: &ActualbudgetDate) -> Result<DatetimeUtc> {
- actualbudget_date.to_iso().parse()
-}
-
-pub fn transform_accounts(
- actualbudget_accounts: &[ActualbudgetAccount],
- first_transaction_date: &DatetimeUtc,
-) -> Vec<Account> {
- let mut accounts = Vec::<Account>::new();
- for account in actualbudget_accounts {
- accounts.push(transform_account(account, first_transaction_date));
- }
- accounts
-}
-
-fn transform_account(
- actualbudget_account: &ActualbudgetAccount,
- opening_date: &DatetimeUtc,
-) -> Account {
- Account {
- id: transform_id(&actualbudget_account.id.clone()),
- name: actualbudget_account.name.clone(),
- opening_balance: 0,
- opening_date: opening_date.clone(),
- }
-}
-
-pub fn transform_categories(
- actualbudget_categories: &[ActualbudgetCategory],
-) -> Vec<Category> {
- let mut categories = Vec::<Category>::new();
- for actualbudget_category in actualbudget_categories {
- categories.push(Category {
- id: transform_id(&actualbudget_category.id.clone()),
- name: actualbudget_category.name.clone(),
- })
- }
- categories
-}
-
-fn transform_id(actualbudget_id: &str) -> i32 {
- let mut hasher = DefaultHasher::new();
- actualbudget_id.hash(&mut hasher);
- (hasher.finish() % std::convert::TryInto::<u64>::try_into(i32::MAX).unwrap())
- .try_into()
- .unwrap()
-}
-
-pub fn transform_budget_updates(
- actualbudget_zero_budgets: &[ActualbudgetZeroBudget],
-) -> Result<Vec<BudgetUpdate>> {
- let mut budget_updates = Vec::<BudgetUpdate>::new();
- for zero_budget in actualbudget_zero_budgets {
- let first_zero_budget_in_category = get_first_zero_budget_in_category(
- actualbudget_zero_budgets,
- &zero_budget.category_id.clone(),
- );
- if first_zero_budget_in_category.is_some_and(|zb| zb.id == zero_budget.id) {
- continue;
- }
- budget_updates.push(BudgetUpdate {
- id: transform_id(&zero_budget.id.clone()),
- category_id: transform_id(&zero_budget.category_id.clone()),
- date: DateUtc::from(transform_date(&zero_budget.month.clone())?),
- new_budget: zero_budget.amount.try_into().unwrap(),
- new_period: 30,
- })
- }
- Ok(budget_updates)
-}
-
-fn get_first_zero_budget_in_category(
- actualbudget_zero_budgets: &[ActualbudgetZeroBudget],
- actualbudget_category_id: &str,
-) -> Option<ActualbudgetZeroBudget> {
- let mut category_zero_budgets = actualbudget_zero_budgets.to_vec();
- category_zero_budgets.retain(|zb| zb.category_id == actualbudget_category_id);
- category_zero_budgets
- .iter()
- .min_by_key(|zb| zb.month.clone())
- .cloned()
-}
-
-pub fn transform_transactions(
- actualbudget_transactions: &[ActualbudgetTransaction],
- actualbudget_category_transfers_account: &ActualbudgetAccount,
-) -> Result<(Vec<Transaction>, Vec<TransactionCategorisation>)> {
- let mut transactions = Vec::<Transaction>::new();
- let mut transaction_categorisations = Vec::<TransactionCategorisation>::new();
-
- let mut actualbudget_transactions = actualbudget_transactions.to_vec();
- actualbudget_transactions
- .retain(|t| t.category_id.clone() != actualbudget_category_transfers_account.id.clone());
- let mut parent_actualbudget_transactions = actualbudget_transactions.to_vec();
- parent_actualbudget_transactions.retain(|t| t.is_parent);
- let mut child_actualbudget_transactions = actualbudget_transactions.to_vec();
- child_actualbudget_transactions.retain(|t| t.is_child);
- let mut atomic_actualbudget_transactions = actualbudget_transactions.to_vec();
- atomic_actualbudget_transactions.retain(|t| !t.is_parent && !t.is_child);
-
- for atomic_actualbudget_transaction in atomic_actualbudget_transactions {
- let transaction_id = transform_id(&atomic_actualbudget_transaction.id);
-
- transactions.push(Transaction {
- id: transaction_id,
- description: atomic_actualbudget_transaction.notes,
- payee: atomic_actualbudget_transaction.payee,
- quantity: atomic_actualbudget_transaction.amount.try_into().unwrap(),
- date: transform_date(&atomic_actualbudget_transaction.date)?,
- account_id: transform_id(&atomic_actualbudget_transaction.account_id),
- });
-
- transaction_categorisations.push(TransactionCategorisation {
- id: transaction_id,
- description: String::new(),
- quantity: atomic_actualbudget_transaction.amount.try_into().unwrap(),
- transaction_id,
- category_id: transform_id(&atomic_actualbudget_transaction.category_id),
- });
- }
-
- for parent_actualbudget_transaction in parent_actualbudget_transactions {
- let mut child_actualbudget_transactions = child_actualbudget_transactions.to_vec();
- child_actualbudget_transactions.retain(|t| {
- t.parent_id
- .clone()
- .is_some_and(|parent_id| parent_id == parent_actualbudget_transaction.id.clone())
- });
-
- let transaction_id = transform_id(&parent_actualbudget_transaction.id);
-
- transactions.push(Transaction {
- id: transaction_id,
- description: parent_actualbudget_transaction.notes,
- payee: parent_actualbudget_transaction.payee,
- quantity: parent_actualbudget_transaction.amount.try_into().unwrap(),
- date: transform_date(&parent_actualbudget_transaction.date)?,
- account_id: transform_id(&parent_actualbudget_transaction.account_id),
- });
-
- for child_actualbudget_transaction in child_actualbudget_transactions {
- transaction_categorisations.push(TransactionCategorisation {
- id: transform_id(&child_actualbudget_transaction.id),
- description: child_actualbudget_transaction.notes,
- quantity: child_actualbudget_transaction.amount.try_into().unwrap(),
- transaction_id,
- category_id: transform_id(&child_actualbudget_transaction.category_id),
- });
- }
- }
-
- Ok((transactions, transaction_categorisations))
-}
-
-pub fn transform_category_transfers(
- actualbudget_transactions: &[ActualbudgetTransaction],
- actualbudget_category_transfers_account: &ActualbudgetAccount,
-) -> Vec<CategoryTransfer> {
- let mut category_transfers = Vec::<CategoryTransfer>::new();
-
- let mut actualbudget_category_transfers = actualbudget_transactions.to_vec();
- actualbudget_category_transfers
- .retain(|t| t.category_id.clone() == actualbudget_category_transfers_account.id.clone());
- let mut actualbudget_parent_category_transfers = actualbudget_category_transfers.to_vec();
- actualbudget_parent_category_transfers.retain(|t| t.is_parent);
- let mut actualbudget_child_category_transfers = actualbudget_category_transfers.to_vec();
- actualbudget_child_category_transfers.retain(|t| t.is_child);
-
- for actualbudget_parent_category_transfer in actualbudget_parent_category_transfers {
- let mut actualbudget_child_category_transfers =
- actualbudget_child_category_transfers.to_vec();
- actualbudget_child_category_transfers.retain(|t| {
- t.parent_id
- .clone()
- .is_some_and(|parent_id| parent_id == actualbudget_parent_category_transfer.id)
- });
-
- if actualbudget_child_category_transfers.len() != 2 {
- panic!("Category transfers should always have exactly two children.");
- }
-
- let category_1 = actualbudget_child_category_transfers[0].clone();
- let category_2 = actualbudget_child_category_transfers[1].clone();
-
- // To avoid duplicates
- if category_1.amount >= 0 {
- continue;
- }
-
- if actualbudget_child_category_transfers[0].amount
- != -actualbudget_child_category_transfers[1].amount
- {
- panic!("Category transfer children should sum to zero.");
- }
-
- category_transfers.push(CategoryTransfer {
- id: transform_id(&actualbudget_parent_category_transfer.id),
- description: actualbudget_parent_category_transfer.notes,
- quantity: actualbudget_child_category_transfers[0]
- .amount
- .try_into()
- .unwrap(),
- from_category_id: transform_id(&category_1.id),
- to_category_id: transform_id(&category_2.id),
- });
- }
-
- category_transfers
-}