summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoe Carstairs <jcarstairs@scottlogic.com>2025-08-13 18:44:20 +0100
committerJoe Carstairs <jcarstairs@scottlogic.com>2025-08-13 18:44:20 +0100
commit8d714f760bd0349560d464583a151a04a19de1c9 (patch)
tree7810edb6371251bfc109a30f8ca9e37fba001d73
parent6495038aba28c332050768cecf062418a25d5a96 (diff)
rename category -> bucket
-rw-r--r--Cargo.lock850
-rw-r--r--schist_core/schist_fakes/src/bucket_transfer.rs16
-rw-r--r--schist_core/schist_fakes/src/budget_drip.rs2
-rw-r--r--schist_core/schist_fakes/src/category_transfer.rs16
-rw-r--r--schist_core/schist_fakes/src/lib.rs2
-rw-r--r--schist_core/schist_fakes/src/transaction.rs2
-rw-r--r--schist_core/schist_fakes/src/transaction_categorisation.rs4
-rw-r--r--schist_core/schist_models/src/bucket.rs2
-rw-r--r--schist_core/schist_models/src/bucket_transfer.rs6
-rw-r--r--schist_core/schist_models/src/budget_drip.rs2
-rw-r--r--schist_core/schist_models/src/schema.rs20
-rw-r--r--schist_core/schist_models/src/transaction_categorisation.rs2
-rw-r--r--schist_core/schist_queries/src/bucket_transfers.rs74
-rw-r--r--schist_core/schist_queries/src/buckets.rs49
-rw-r--r--schist_core/schist_queries/src/categories.rs49
-rw-r--r--schist_core/schist_queries/src/category_transfers.rs74
-rw-r--r--schist_core/schist_queries/src/clear.rs6
-rw-r--r--schist_core/schist_queries/src/lib.rs4
-rw-r--r--schist_core/schist_queries/src/transaction_categorisations.rs10
-rw-r--r--schist_core/schist_queries/src/transactions.rs2
-rw-r--r--schist_core/schist_queries/src/utils/calculate_bucket_balance.rs130
-rw-r--r--schist_core/schist_queries/src/utils/calculate_budgets_accrual.rs34
-rw-r--r--schist_core/schist_queries/src/utils/calculate_category_balance.rs130
-rw-r--r--schist_core/schist_queries/src/utils/mod.rs4
-rw-r--r--schist_core/schist_queries/tests/budget_drips.rs60
-rw-r--r--schist_core/schist_queries/tests/categories.rs68
-rw-r--r--schist_core/schist_queries/tests/category_transfers.rs122
-rw-r--r--schist_core/schist_queries/tests/transaction_categorisations.rs50
-rw-r--r--transformers/actualbudget_transformer/actualbudget_to_schist_transformer/src/schist_state.rs10
-rw-r--r--transformers/actualbudget_transformer/actualbudget_to_schist_transformer/src/transform_state/transform_budget_drips.rs10
-rw-r--r--transformers/actualbudget_transformer/actualbudget_to_schist_transformer/src/transform_state/transform_categories.rs113
-rw-r--r--transformers/actualbudget_transformer/actualbudget_to_schist_transformer/src/transform_state/transform_category_transfers.rs56
-rw-r--r--transformers/actualbudget_transformer/actualbudget_to_schist_transformer/src/transform_state/transform_state.rs10
-rw-r--r--transformers/actualbudget_transformer/actualbudget_to_schist_transformer/src/transform_state/transform_transactions.rs10
-rw-r--r--transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/bucket_matchers.rs34
-rw-r--r--transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/bucket_names.rs37
-rw-r--r--transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/bucket_transfer_matchers.rs38
-rw-r--r--transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/budget_drip_matchers.rs74
-rw-r--r--transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/category_matchers.rs34
-rw-r--r--transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/category_names.rs37
-rw-r--r--transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/category_transfer_matchers.rs38
-rw-r--r--transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/mod.rs12
-rw-r--r--transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/transaction_categorisation_matchers.rs54
-rw-r--r--transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/run.rs36
44 files changed, 777 insertions, 1616 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 2537d9d..1879c81 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -109,15 +109,6 @@ dependencies = [
]
[[package]]
-name = "aho-corasick"
-version = "1.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
-dependencies = [
- "memchr",
-]
-
-[[package]]
name = "allocator-api2"
version = "0.2.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -336,28 +327,6 @@ dependencies = [
]
[[package]]
-name = "async-stream"
-version = "0.3.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476"
-dependencies = [
- "async-stream-impl",
- "futures-core",
- "pin-project-lite",
-]
-
-[[package]]
-name = "async-stream-impl"
-version = "0.3.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.104",
-]
-
-[[package]]
name = "async-task"
version = "4.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -375,21 +344,6 @@ dependencies = [
]
[[package]]
-name = "atomic"
-version = "0.5.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c59bdb34bc650a32731b31bd8f0829cc15d24a708ee31559e0bb34f2bc320cba"
-
-[[package]]
-name = "atomic"
-version = "0.6.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a89cbf775b137e9b968e67227ef7f775587cde3fd31b0d8599dbd0f598a48340"
-dependencies = [
- "bytemuck",
-]
-
-[[package]]
name = "atomic-waker"
version = "1.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -417,12 +371,6 @@ dependencies = [
]
[[package]]
-name = "binascii"
-version = "0.1.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "383d29d513d8764dcdc42ea295d979eb99c3c9f00607b3692cf68a431f7dca72"
-
-[[package]]
name = "bit-set"
version = "0.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -700,17 +648,6 @@ dependencies = [
]
[[package]]
-name = "cookie"
-version = "0.18.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747"
-dependencies = [
- "percent-encoding",
- "time",
- "version_check",
-]
-
-[[package]]
name = "core-foundation"
version = "0.9.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -993,39 +930,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "21d8ad60dd5b13a4ee6bd8fa2d5d88965c597c67bce32b5fc49c94f55cb50810"
[[package]]
-name = "devise"
-version = "0.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f1d90b0c4c777a2cad215e3c7be59ac7c15adf45cf76317009b7d096d46f651d"
-dependencies = [
- "devise_codegen",
- "devise_core",
-]
-
-[[package]]
-name = "devise_codegen"
-version = "0.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "71b28680d8be17a570a2334922518be6adc3f58ecc880cbb404eaeb8624fd867"
-dependencies = [
- "devise_core",
- "quote",
-]
-
-[[package]]
-name = "devise_core"
-version = "0.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b035a542cf7abf01f2e3c4d5a7acbaebfefe120ae4efc7bde3df98186e4b8af7"
-dependencies = [
- "bitflags 2.9.1",
- "proc-macro2",
- "proc-macro2-diagnostics",
- "quote",
- "syn 2.0.104",
-]
-
-[[package]]
name = "diesel"
version = "2.2.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1033,7 +937,6 @@ checksum = "229850a212cd9b84d4f0290ad9d294afc0ae70fccaa8949dbe8b43ffafa1e20c"
dependencies = [
"diesel_derives",
"libsqlite3-sys",
- "r2d2",
"time",
]
@@ -1193,15 +1096,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
[[package]]
-name = "encoding_rs"
-version = "0.8.35"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3"
-dependencies = [
- "cfg-if",
-]
-
-[[package]]
name = "endi"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1312,20 +1206,6 @@ dependencies = [
]
[[package]]
-name = "figment"
-version = "0.10.19"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8cb01cd46b0cf372153850f4c6c272d9cbea2da513e07538405148f95bd789f3"
-dependencies = [
- "atomic 0.6.1",
- "pear",
- "serde",
- "toml 0.8.23",
- "uncased",
- "version_check",
-]
-
-[[package]]
name = "flate2"
version = "1.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1504,19 +1384,6 @@ dependencies = [
]
[[package]]
-name = "generator"
-version = "0.7.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5cc16584ff22b460a382b7feec54b23d2908d858152e5739a120b949293bd74e"
-dependencies = [
- "cc",
- "libc",
- "log",
- "rustversion",
- "windows 0.48.0",
-]
-
-[[package]]
name = "generic-array"
version = "0.14.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1583,12 +1450,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "151665d9be52f9bb40fc7966565d39666f2d1e69233571b71b87791c7e0528b3"
[[package]]
-name = "glob"
-version = "0.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2"
-
-[[package]]
name = "glow"
version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1638,7 +1499,7 @@ dependencies = [
"presser",
"thiserror",
"winapi",
- "windows 0.52.0",
+ "windows",
]
[[package]]
@@ -1672,25 +1533,6 @@ dependencies = [
]
[[package]]
-name = "h2"
-version = "0.3.27"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d"
-dependencies = [
- "bytes",
- "fnv",
- "futures-core",
- "futures-sink",
- "futures-util",
- "http 0.2.12",
- "indexmap",
- "slab",
- "tokio",
- "tokio-util",
- "tracing",
-]
-
-[[package]]
name = "half"
version = "2.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1765,75 +1607,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df"
[[package]]
-name = "http"
-version = "0.2.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1"
-dependencies = [
- "bytes",
- "fnv",
- "itoa",
-]
-
-[[package]]
-name = "http"
-version = "1.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565"
-dependencies = [
- "bytes",
- "fnv",
- "itoa",
-]
-
-[[package]]
-name = "http-body"
-version = "0.4.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2"
-dependencies = [
- "bytes",
- "http 0.2.12",
- "pin-project-lite",
-]
-
-[[package]]
-name = "httparse"
-version = "1.10.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87"
-
-[[package]]
-name = "httpdate"
-version = "1.0.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
-
-[[package]]
-name = "hyper"
-version = "0.14.32"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7"
-dependencies = [
- "bytes",
- "futures-channel",
- "futures-core",
- "futures-util",
- "h2",
- "http 0.2.12",
- "http-body",
- "httparse",
- "httpdate",
- "itoa",
- "pin-project-lite",
- "socket2 0.5.10",
- "tokio",
- "tower-service",
- "tracing",
- "want",
-]
-
-[[package]]
name = "iana-time-zone"
version = "0.1.63"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2049,16 +1822,9 @@ checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661"
dependencies = [
"equivalent",
"hashbrown 0.15.4",
- "serde",
]
[[package]]
-name = "inlinable_string"
-version = "0.1.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c8fae54786f62fb2918dcfae3d568594e50eb9b5c25bf04371af6fe7516452fb"
-
-[[package]]
name = "instant"
version = "0.1.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2068,28 +1834,6 @@ dependencies = [
]
[[package]]
-name = "io-uring"
-version = "0.7.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4"
-dependencies = [
- "bitflags 2.9.1",
- "cfg-if",
- "libc",
-]
-
-[[package]]
-name = "is-terminal"
-version = "0.4.16"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9"
-dependencies = [
- "hermit-abi",
- "libc",
- "windows-sys 0.59.0",
-]
-
-[[package]]
name = "itertools"
version = "0.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2174,12 +1918,6 @@ dependencies = [
]
[[package]]
-name = "lazy_static"
-version = "1.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
-
-[[package]]
name = "libc"
version = "0.2.174"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2268,21 +2006,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94"
[[package]]
-name = "loom"
-version = "0.5.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5"
-dependencies = [
- "cfg-if",
- "generator",
- "scoped-tls",
- "serde",
- "serde_json",
- "tracing",
- "tracing-subscriber",
-]
-
-[[package]]
name = "lru"
version = "0.12.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2298,15 +2021,6 @@ dependencies = [
]
[[package]]
-name = "matchers"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558"
-dependencies = [
- "regex-automata 0.1.10",
-]
-
-[[package]]
name = "memchr"
version = "2.7.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2352,7 +2066,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3bda1634d70d5bd53553cf15dca9842a396e8c799982a3ad22998dc44d961f24"
dependencies = [
"serde",
- "toml 0.9.2",
+ "toml",
]
[[package]]
@@ -2367,12 +2081,6 @@ dependencies = [
]
[[package]]
-name = "mime"
-version = "0.3.17"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
-
-[[package]]
name = "miniz_oxide"
version = "0.8.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2383,36 +2091,6 @@ dependencies = [
]
[[package]]
-name = "mio"
-version = "1.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c"
-dependencies = [
- "libc",
- "wasi 0.11.1+wasi-snapshot-preview1",
- "windows-sys 0.59.0",
-]
-
-[[package]]
-name = "multer"
-version = "3.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "83e87776546dc87511aa5ee218730c92b666d7264ab6ed41f9d215af9cd5224b"
-dependencies = [
- "bytes",
- "encoding_rs",
- "futures-util",
- "http 1.3.1",
- "httparse",
- "memchr",
- "mime",
- "spin",
- "tokio",
- "tokio-util",
- "version_check",
-]
-
-[[package]]
name = "naga"
version = "0.19.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2485,16 +2163,6 @@ dependencies = [
]
[[package]]
-name = "nu-ansi-term"
-version = "0.46.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84"
-dependencies = [
- "overload",
- "winapi",
-]
-
-[[package]]
name = "num-conv"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2808,12 +2476,6 @@ dependencies = [
]
[[package]]
-name = "overload"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
-
-[[package]]
name = "owned_ttf_parser"
version = "0.25.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2907,29 +2569,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
[[package]]
-name = "pear"
-version = "0.2.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bdeeaa00ce488657faba8ebf44ab9361f9365a97bd39ffb8a60663f57ff4b467"
-dependencies = [
- "inlinable_string",
- "pear_codegen",
- "yansi",
-]
-
-[[package]]
-name = "pear_codegen"
-version = "0.2.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4bab5b985dc082b345f812b7df84e1bef27e7207b39e448439ba8bd69c93f147"
-dependencies = [
- "proc-macro2",
- "proc-macro2-diagnostics",
- "quote",
- "syn 2.0.104",
-]
-
-[[package]]
name = "percent-encoding"
version = "2.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3093,19 +2732,6 @@ dependencies = [
]
[[package]]
-name = "proc-macro2-diagnostics"
-version = "0.10.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.104",
- "version_check",
- "yansi",
-]
-
-[[package]]
name = "profiling"
version = "1.0.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3136,17 +2762,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
[[package]]
-name = "r2d2"
-version = "0.8.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "51de85fb3fb6524929c8a2eb85e6b6d363de4e8c48f9e2c2eac4944abc181c93"
-dependencies = [
- "log",
- "parking_lot 0.12.4",
- "scheduled-thread-pool",
-]
-
-[[package]]
name = "rand"
version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3263,183 +2878,12 @@ dependencies = [
]
[[package]]
-name = "ref-cast"
-version = "1.0.24"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf"
-dependencies = [
- "ref-cast-impl",
-]
-
-[[package]]
-name = "ref-cast-impl"
-version = "1.0.24"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.104",
-]
-
-[[package]]
-name = "regex"
-version = "1.11.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191"
-dependencies = [
- "aho-corasick",
- "memchr",
- "regex-automata 0.4.9",
- "regex-syntax 0.8.5",
-]
-
-[[package]]
-name = "regex-automata"
-version = "0.1.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
-dependencies = [
- "regex-syntax 0.6.29",
-]
-
-[[package]]
-name = "regex-automata"
-version = "0.4.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908"
-dependencies = [
- "aho-corasick",
- "memchr",
- "regex-syntax 0.8.5",
-]
-
-[[package]]
-name = "regex-syntax"
-version = "0.6.29"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
-
-[[package]]
-name = "regex-syntax"
-version = "0.8.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
-
-[[package]]
name = "renderdoc-sys"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832"
[[package]]
-name = "rocket"
-version = "0.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a516907296a31df7dc04310e7043b61d71954d703b603cc6867a026d7e72d73f"
-dependencies = [
- "async-stream",
- "async-trait",
- "atomic 0.5.3",
- "binascii",
- "bytes",
- "either",
- "figment",
- "futures",
- "indexmap",
- "log",
- "memchr",
- "multer",
- "num_cpus",
- "parking_lot 0.12.4",
- "pin-project-lite",
- "rand",
- "ref-cast",
- "rocket_codegen",
- "rocket_http",
- "serde",
- "serde_json",
- "state",
- "tempfile",
- "time",
- "tokio",
- "tokio-stream",
- "tokio-util",
- "ubyte",
- "version_check",
- "yansi",
-]
-
-[[package]]
-name = "rocket_codegen"
-version = "0.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "575d32d7ec1a9770108c879fc7c47815a80073f96ca07ff9525a94fcede1dd46"
-dependencies = [
- "devise",
- "glob",
- "indexmap",
- "proc-macro2",
- "quote",
- "rocket_http",
- "syn 2.0.104",
- "unicode-xid",
- "version_check",
-]
-
-[[package]]
-name = "rocket_http"
-version = "0.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e274915a20ee3065f611c044bd63c40757396b6dbc057d6046aec27f14f882b9"
-dependencies = [
- "cookie",
- "either",
- "futures",
- "http 0.2.12",
- "hyper",
- "indexmap",
- "log",
- "memchr",
- "pear",
- "percent-encoding",
- "pin-project-lite",
- "ref-cast",
- "serde",
- "smallvec",
- "stable-pattern",
- "state",
- "time",
- "tokio",
- "uncased",
-]
-
-[[package]]
-name = "rocket_sync_db_pools"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d83f32721ed79509adac4328e97f817a8f55a47c4b64799f6fd6cc3adb6e42ff"
-dependencies = [
- "diesel",
- "r2d2",
- "rocket",
- "rocket_sync_db_pools_codegen",
- "serde",
- "tokio",
- "version_check",
-]
-
-[[package]]
-name = "rocket_sync_db_pools_codegen"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5cc890925dc79370c28eb15c9957677093fdb7e8c44966d189f38cedb995ee68"
-dependencies = [
- "devise",
- "quote",
-]
-
-[[package]]
name = "roxmltree"
version = "0.20.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3523,12 +2967,6 @@ dependencies = [
]
[[package]]
-name = "ryu"
-version = "1.0.20"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f"
-
-[[package]]
name = "same-file"
version = "1.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3538,39 +2976,16 @@ dependencies = [
]
[[package]]
-name = "scheduled-thread-pool"
-version = "0.2.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3cbc66816425a074528352f5789333ecff06ca41b36b0b0efdfbb29edc391a19"
-dependencies = [
- "parking_lot 0.12.4",
-]
-
-[[package]]
-name = "schist_backend"
-version = "0.1.0"
-dependencies = [
- "cfg-if",
- "chrono",
- "diesel",
- "diesel_migrations",
- "libsqlite3-sys",
- "rocket",
- "rocket_sync_db_pools",
- "schist_models",
- "schist_queries",
- "schist_schema",
-]
-
-[[package]]
name = "schist_desktop_gui"
version = "0.1.0"
dependencies = [
"anyhow",
+ "diesel",
"iced",
"itertools",
"schist_fakes",
"schist_models",
+ "schist_queries",
]
[[package]]
@@ -3674,18 +3089,6 @@ dependencies = [
]
[[package]]
-name = "serde_json"
-version = "1.0.141"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "30b9eff21ebe718216c6ec64e1d9ac57087aad11efc64e32002bce4a0d4c03d3"
-dependencies = [
- "itoa",
- "memchr",
- "ryu",
- "serde",
-]
-
-[[package]]
name = "serde_repr"
version = "0.1.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3698,15 +3101,6 @@ dependencies = [
[[package]]
name = "serde_spanned"
-version = "0.6.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3"
-dependencies = [
- "serde",
-]
-
-[[package]]
-name = "serde_spanned"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "40734c41988f7306bb04f0ecf60ec0f3f1caa34290e4e8ea471dcd3346483b83"
@@ -3726,15 +3120,6 @@ dependencies = [
]
[[package]]
-name = "sharded-slab"
-version = "0.1.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6"
-dependencies = [
- "lazy_static",
-]
-
-[[package]]
name = "shlex"
version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3838,26 +3223,6 @@ dependencies = [
]
[[package]]
-name = "socket2"
-version = "0.5.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678"
-dependencies = [
- "libc",
- "windows-sys 0.52.0",
-]
-
-[[package]]
-name = "socket2"
-version = "0.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807"
-dependencies = [
- "libc",
- "windows-sys 0.59.0",
-]
-
-[[package]]
name = "softbuffer"
version = "0.4.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3890,12 +3255,6 @@ dependencies = [
]
[[package]]
-name = "spin"
-version = "0.9.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67"
-
-[[package]]
name = "spirv"
version = "0.3.0+sdk-1.3.268.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3905,24 +3264,6 @@ dependencies = [
]
[[package]]
-name = "stable-pattern"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4564168c00635f88eaed410d5efa8131afa8d8699a612c80c455a0ba05c21045"
-dependencies = [
- "memchr",
-]
-
-[[package]]
-name = "state"
-version = "0.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2b8c4a4445d81357df8b1a650d0d0d6fbbbfe99d064aa5e02f3e4022061476d8"
-dependencies = [
- "loom",
-]
-
-[[package]]
name = "static_assertions"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -4031,15 +3372,6 @@ dependencies = [
]
[[package]]
-name = "thread_local"
-version = "1.1.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185"
-dependencies = [
- "cfg-if",
-]
-
-[[package]]
name = "time"
version = "0.3.41"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -4125,72 +3457,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
[[package]]
-name = "tokio"
-version = "1.47.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "43864ed400b6043a4757a25c7a64a8efde741aed79a056a2fb348a406701bb35"
-dependencies = [
- "backtrace",
- "bytes",
- "io-uring",
- "libc",
- "mio",
- "pin-project-lite",
- "signal-hook-registry",
- "slab",
- "socket2 0.6.0",
- "tokio-macros",
- "windows-sys 0.59.0",
-]
-
-[[package]]
-name = "tokio-macros"
-version = "2.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.104",
-]
-
-[[package]]
-name = "tokio-stream"
-version = "0.1.17"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047"
-dependencies = [
- "futures-core",
- "pin-project-lite",
- "tokio",
-]
-
-[[package]]
-name = "tokio-util"
-version = "0.7.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df"
-dependencies = [
- "bytes",
- "futures-core",
- "futures-sink",
- "pin-project-lite",
- "tokio",
-]
-
-[[package]]
-name = "toml"
-version = "0.8.23"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362"
-dependencies = [
- "serde",
- "serde_spanned 0.6.9",
- "toml_datetime 0.6.11",
- "toml_edit",
-]
-
-[[package]]
name = "toml"
version = "0.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -4198,7 +3464,7 @@ checksum = "ed0aee96c12fa71097902e0bb061a5e1ebd766a6636bb605ba401c45c1650eac"
dependencies = [
"indexmap",
"serde",
- "serde_spanned 1.0.0",
+ "serde_spanned",
"toml_datetime 0.7.0",
"toml_parser",
"toml_writer",
@@ -4210,9 +3476,6 @@ name = "toml_datetime"
version = "0.6.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c"
-dependencies = [
- "serde",
-]
[[package]]
name = "toml_datetime"
@@ -4230,10 +3493,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a"
dependencies = [
"indexmap",
- "serde",
- "serde_spanned 0.6.9",
"toml_datetime 0.6.11",
- "toml_write",
"winnow",
]
@@ -4247,24 +3507,12 @@ dependencies = [
]
[[package]]
-name = "toml_write"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801"
-
-[[package]]
name = "toml_writer"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fcc842091f2def52017664b53082ecbbeb5c7731092bad69d2c63050401dfd64"
[[package]]
-name = "tower-service"
-version = "0.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3"
-
-[[package]]
name = "tracing"
version = "0.1.41"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -4293,45 +3541,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678"
dependencies = [
"once_cell",
- "valuable",
-]
-
-[[package]]
-name = "tracing-log"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3"
-dependencies = [
- "log",
- "once_cell",
- "tracing-core",
-]
-
-[[package]]
-name = "tracing-subscriber"
-version = "0.3.19"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008"
-dependencies = [
- "matchers",
- "nu-ansi-term",
- "once_cell",
- "regex",
- "sharded-slab",
- "smallvec",
- "thread_local",
- "tracing",
- "tracing-core",
- "tracing-log",
]
[[package]]
-name = "try-lock"
-version = "0.2.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
-
-[[package]]
name = "ttf-parser"
version = "0.20.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -4356,15 +3568,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f"
[[package]]
-name = "ubyte"
-version = "0.10.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f720def6ce1ee2fc44d40ac9ed6d3a59c361c80a75a7aa8e75bb9baed31cf2ea"
-dependencies = [
- "serde",
-]
-
-[[package]]
name = "uds_windows"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -4376,16 +3579,6 @@ dependencies = [
]
[[package]]
-name = "uncased"
-version = "0.9.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e1b88fcfe09e89d3866a5c11019378088af2d24c3fbd4f0543f96b479ec90697"
-dependencies = [
- "serde",
- "version_check",
-]
-
-[[package]]
name = "unicode-bidi"
version = "0.3.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -4446,12 +3639,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
[[package]]
-name = "valuable"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65"
-
-[[package]]
name = "vcpkg"
version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -4474,15 +3661,6 @@ dependencies = [
]
[[package]]
-name = "want"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e"
-dependencies = [
- "try-lock",
-]
-
-[[package]]
name = "wasi"
version = "0.11.1+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -4872,15 +4050,6 @@ dependencies = [
[[package]]
name = "windows"
-version = "0.48.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f"
-dependencies = [
- "windows-targets 0.48.5",
-]
-
-[[package]]
-name = "windows"
version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be"
@@ -5389,15 +4558,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6fd8403733700263c6eb89f192880191f1b83e332f7a20371ddcf421c4a337c7"
[[package]]
-name = "yansi"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049"
-dependencies = [
- "is-terminal",
-]
-
-[[package]]
name = "yazi"
version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
diff --git a/schist_core/schist_fakes/src/bucket_transfer.rs b/schist_core/schist_fakes/src/bucket_transfer.rs
new file mode 100644
index 0000000..9bc1f80
--- /dev/null
+++ b/schist_core/schist_fakes/src/bucket_transfer.rs
@@ -0,0 +1,16 @@
+use schist_models::bucket_transfer::{BucketTransfer, BucketTransferBuilder};
+
+pub fn make_fake_bucket_transfer(id: i32) -> BucketTransfer {
+ make_fake_bucket_transfer_builder(id).build().unwrap()
+}
+
+pub fn make_fake_bucket_transfer_builder(id: i32) -> BucketTransferBuilder {
+ let mut builder = BucketTransferBuilder::default();
+ builder
+ .id(id)
+ .description(String::from("Fake bucket transfer"))
+ .quantity(0)
+ .from_bucket_id(0)
+ .to_bucket_id(1);
+ builder
+}
diff --git a/schist_core/schist_fakes/src/budget_drip.rs b/schist_core/schist_fakes/src/budget_drip.rs
index f653565..498dd76 100644
--- a/schist_core/schist_fakes/src/budget_drip.rs
+++ b/schist_core/schist_fakes/src/budget_drip.rs
@@ -9,7 +9,7 @@ pub fn make_fake_budget_drip_builder(id: i32) -> BudgetDripBuilder {
let mut builder = BudgetDripBuilder::default();
builder
.id(id)
- .category_id(0)
+ .bucket_id(0)
.date(DateUtc::now())
.quantity(0);
builder
diff --git a/schist_core/schist_fakes/src/category_transfer.rs b/schist_core/schist_fakes/src/category_transfer.rs
deleted file mode 100644
index a16d238..0000000
--- a/schist_core/schist_fakes/src/category_transfer.rs
+++ /dev/null
@@ -1,16 +0,0 @@
-use schist_models::bucket_transfer::{BucketTransfer, BucketTransferBuilder};
-
-pub fn make_fake_category_transfer(id: i32) -> BucketTransfer {
- make_fake_category_transfer_builder(id).build().unwrap()
-}
-
-pub fn make_fake_category_transfer_builder(id: i32) -> BucketTransferBuilder {
- let mut builder = BucketTransferBuilder::default();
- builder
- .id(id)
- .description(String::from("Fake category transfer"))
- .quantity(0)
- .from_category_id(0)
- .to_category_id(1);
- builder
-}
diff --git a/schist_core/schist_fakes/src/lib.rs b/schist_core/schist_fakes/src/lib.rs
index 4a22169..ba88fb5 100644
--- a/schist_core/schist_fakes/src/lib.rs
+++ b/schist_core/schist_fakes/src/lib.rs
@@ -2,6 +2,6 @@ pub mod account;
pub mod account_transfer;
pub mod bucket;
pub mod budget_drip;
-pub mod category_transfer;
+pub mod bucket_transfer;
pub mod transaction;
pub mod transaction_categorisation;
diff --git a/schist_core/schist_fakes/src/transaction.rs b/schist_core/schist_fakes/src/transaction.rs
index 30d1788..cee7e00 100644
--- a/schist_core/schist_fakes/src/transaction.rs
+++ b/schist_core/schist_fakes/src/transaction.rs
@@ -9,7 +9,7 @@ pub fn make_fake_transaction_builder(id: i32) -> TransactionBuilder {
let mut builder = TransactionBuilder::default();
builder
.id(id)
- .description(String::from("Fake category transfer"))
+ .description(String::from("Fake bucket transfer"))
.payee(String::from("Fake payee"))
.quantity(0)
.date(DateUtc::now())
diff --git a/schist_core/schist_fakes/src/transaction_categorisation.rs b/schist_core/schist_fakes/src/transaction_categorisation.rs
index ce9460c..11b50c2 100644
--- a/schist_core/schist_fakes/src/transaction_categorisation.rs
+++ b/schist_core/schist_fakes/src/transaction_categorisation.rs
@@ -8,9 +8,9 @@ pub fn make_fake_transaction_categorisation_builder(id: i32) -> TransactionCate
let mut builder = TransactionCategorisationBuilder::default();
builder
.id(id)
- .description(String::from("Fake category transfer"))
+ .description(String::from("Fake bucket transfer"))
.quantity(0)
.transaction_id(0)
- .category_id(0);
+ .bucket_id(0);
builder
}
diff --git a/schist_core/schist_models/src/bucket.rs b/schist_core/schist_models/src/bucket.rs
index f162405..1ee6a13 100644
--- a/schist_core/schist_models/src/bucket.rs
+++ b/schist_core/schist_models/src/bucket.rs
@@ -16,7 +16,7 @@ use crate::{budget_period_unit::BudgetPeriodUnit, date_utc::DateUtc};
Deserialize,
Insertable,
)]
-#[diesel(table_name = crate::schema::categories)]
+#[diesel(table_name = crate::schema::buckets)]
pub struct Bucket {
pub id: i32,
pub name: String,
diff --git a/schist_core/schist_models/src/bucket_transfer.rs b/schist_core/schist_models/src/bucket_transfer.rs
index 5d2e268..bdf95d9 100644
--- a/schist_core/schist_models/src/bucket_transfer.rs
+++ b/schist_core/schist_models/src/bucket_transfer.rs
@@ -2,11 +2,11 @@ use derive_builder::Builder;
use diesel::prelude::*;
#[derive(Builder, Queryable, Identifiable, Selectable, Debug, PartialEq, Insertable)]
-#[diesel(table_name = crate::schema::category_transfers)]
+#[diesel(table_name = crate::schema::bucket_transfers)]
pub struct BucketTransfer {
pub id: i32,
pub description: String,
pub quantity: i32,
- pub from_category_id: i32,
- pub to_category_id: i32,
+ pub from_bucket_id: i32,
+ pub to_bucket_id: i32,
}
diff --git a/schist_core/schist_models/src/budget_drip.rs b/schist_core/schist_models/src/budget_drip.rs
index 2cc2c63..419c8f9 100644
--- a/schist_core/schist_models/src/budget_drip.rs
+++ b/schist_core/schist_models/src/budget_drip.rs
@@ -8,7 +8,7 @@ use crate::date_utc::DateUtc;
#[diesel(table_name = crate::schema::budget_drips)]
pub struct BudgetDrip {
pub id: i32,
- pub category_id: i32,
+ pub bucket_id: i32,
pub date: DateUtc,
pub quantity: i32,
}
diff --git a/schist_core/schist_models/src/schema.rs b/schist_core/schist_models/src/schema.rs
index 40af56f..1c9fc62 100644
--- a/schist_core/schist_models/src/schema.rs
+++ b/schist_core/schist_models/src/schema.rs
@@ -23,14 +23,14 @@ diesel::table! {
diesel::table! {
budget_drips (id) {
id -> Integer,
- category_id -> Integer,
+ bucket_id -> Integer,
date -> Text,
quantity -> Integer,
}
}
diesel::table! {
- categories (id) {
+ buckets (id) {
id -> Integer,
name -> Text,
balance -> Integer,
@@ -43,12 +43,12 @@ diesel::table! {
}
diesel::table! {
- category_transfers (id) {
+ bucket_transfers (id) {
id -> Integer,
description -> Text,
quantity -> Integer,
- from_category_id -> Integer,
- to_category_id -> Integer,
+ from_bucket_id -> Integer,
+ to_bucket_id -> Integer,
}
}
@@ -58,7 +58,7 @@ diesel::table! {
description -> Text,
quantity -> Integer,
transaction_id -> Integer,
- category_id -> Integer,
+ bucket_id -> Integer,
}
}
@@ -73,8 +73,8 @@ diesel::table! {
}
}
-diesel::joinable!(budget_drips -> categories (category_id));
-diesel::joinable!(transaction_categorisations -> categories (category_id));
+diesel::joinable!(budget_drips -> buckets (bucket_id));
+diesel::joinable!(transaction_categorisations -> buckets (bucket_id));
diesel::joinable!(transaction_categorisations -> transactions (transaction_id));
diesel::joinable!(transactions -> accounts (account_id));
@@ -82,8 +82,8 @@ diesel::allow_tables_to_appear_in_same_query!(
account_transfers,
accounts,
budget_drips,
- categories,
- category_transfers,
+ buckets,
+ bucket_transfers,
transaction_categorisations,
transactions,
);
diff --git a/schist_core/schist_models/src/transaction_categorisation.rs b/schist_core/schist_models/src/transaction_categorisation.rs
index c6ac6ea..36752ee 100644
--- a/schist_core/schist_models/src/transaction_categorisation.rs
+++ b/schist_core/schist_models/src/transaction_categorisation.rs
@@ -8,5 +8,5 @@ pub struct TransactionCategorisation {
pub description: String,
pub quantity: i32,
pub transaction_id: i32,
- pub category_id: i32,
+ pub bucket_id: i32,
}
diff --git a/schist_core/schist_queries/src/bucket_transfers.rs b/schist_core/schist_queries/src/bucket_transfers.rs
new file mode 100644
index 0000000..2145944
--- /dev/null
+++ b/schist_core/schist_queries/src/bucket_transfers.rs
@@ -0,0 +1,74 @@
+use anyhow::{Context, Result};
+use diesel::{dsl::sum, QueryDsl, RunQueryDsl, SelectableHelper, SqliteConnection};
+use schist_schema::schema::bucket_transfers::{
+ self as bucket_transfers_schema,
+ dsl::bucket_transfers as bucket_transfers_table,
+};
+use schist_models::bucket_transfer::BucketTransfer;
+
+pub fn delete_all_bucket_transfers(connection: &mut SqliteConnection) -> Result<usize> {
+ let num_rows_deleted = diesel::delete(bucket_transfers_table)
+ .execute(connection)
+ .with_context(|| "failed to delete all bucket transfers")?;
+ Ok(num_rows_deleted)
+}
+
+pub fn get_all_bucket_transfers(connection: &mut SqliteConnection) -> Result<Vec<BucketTransfer>> {
+ let all_bucket_transfers = bucket_transfers_table
+ .select(BucketTransfer::as_select())
+ .load(connection)
+ .with_context(|| "failed to get all bucket transfers")?;
+ Ok(all_bucket_transfers)
+}
+
+pub fn insert_bucket_transfers(
+ bucket_transfers: &[BucketTransfer],
+ connection: &mut SqliteConnection,
+) -> Result<usize> {
+ let num_rows_inserted = diesel::insert_into(bucket_transfers_table)
+ .values(bucket_transfers)
+ .execute(connection)
+ .with_context(|| insert_err_msg(&bucket_transfers))?;
+ Ok(num_rows_inserted)
+}
+
+fn insert_err_msg(bucket_transfers: &[BucketTransfer]) -> String {
+ format!(
+ "failed to insert bucket transfers: [{}]",
+ bucket_transfers
+ .iter()
+ .map(|ct| ct.id.to_string())
+ .collect::<Vec<String>>()
+ .join(", ")
+ )
+}
+
+pub fn sum_bucket_transfer_quantity_per_from_bucket_id(
+ connection: &mut SqliteConnection,
+) -> Result<Vec<(i32, i64)>> {
+ let sum = bucket_transfers_table
+ .group_by(bucket_transfers_schema::from_bucket_id)
+ .select((
+ bucket_transfers_schema::from_bucket_id,
+ sum(bucket_transfers_schema::quantity),
+ ))
+ .load::<(i32, Option<i64>)>(connection)
+ .map(|result| result.iter().map(|sum| (sum.0, sum.1.unwrap_or(0))).collect())
+ .with_context(|| "failed to sum bucket transfer quantity per from bucket ID")?;
+ Ok(sum)
+}
+
+pub fn sum_bucket_transfer_quantity_per_to_bucket_id(
+ connection: &mut SqliteConnection,
+) -> Result<Vec<(i32, i64)>> {
+ let sum = bucket_transfers_table
+ .group_by(bucket_transfers_schema::to_bucket_id)
+ .select((
+ bucket_transfers_schema::to_bucket_id,
+ sum(bucket_transfers_schema::quantity),
+ ))
+ .load::<(i32, Option<i64>)>(connection)
+ .map(|vec| vec.iter().map(|(id, sum)| (*id, sum.unwrap_or(0))).collect())
+ .with_context(|| "failed to sum bucket transfer quantity per to bucket ID")?;
+ Ok(sum)
+}
diff --git a/schist_core/schist_queries/src/buckets.rs b/schist_core/schist_queries/src/buckets.rs
new file mode 100644
index 0000000..c7cf213
--- /dev/null
+++ b/schist_core/schist_queries/src/buckets.rs
@@ -0,0 +1,49 @@
+use anyhow::{Context, Result};
+use diesel::{QueryDsl, RunQueryDsl, SelectableHelper, SqliteConnection};
+use schist_models::bucket::Bucket;
+use schist_schema::schema::buckets::{self as buckets_schema, dsl::buckets as buckets_table};
+
+pub fn delete_all_buckets(connection: &mut SqliteConnection) -> Result<usize> {
+ let num_rows_deleted = diesel::delete(buckets_table)
+ .execute(connection)
+ .with_context(|| "failed to delete all buckets")?;
+ Ok(num_rows_deleted)
+}
+
+pub fn get_all_buckets(connection: &mut SqliteConnection) -> Result<Vec<Bucket>> {
+ let all_buckets = buckets_table
+ .select(Bucket::as_select())
+ .load(connection)
+ .with_context(|| "failed to get all buckets")?;
+ Ok(all_buckets)
+}
+
+pub fn get_all_bucket_ids(connection: &mut SqliteConnection) -> Result<Vec<i32>> {
+ let all_bucket_ids = buckets_table
+ .select(buckets_schema::id)
+ .load(connection)
+ .with_context(|| "failed to get all bucket IDs")?;
+ Ok(all_bucket_ids)
+}
+
+pub fn insert_buckets(
+ buckets: &[Bucket],
+ connection: &mut SqliteConnection,
+) -> Result<usize> {
+ let num_buckets_inserted = diesel::insert_into(buckets_table)
+ .values(buckets)
+ .execute(connection)
+ .with_context(|| insert_err_msg(buckets))?;
+ Ok(num_buckets_inserted)
+}
+
+fn insert_err_msg(buckets: &[Bucket]) -> String {
+ format!(
+ "failed to insert buckets: [{}]",
+ buckets
+ .iter()
+ .map(|c| format!("\"{}\": \"{}\"", c.id, c.name))
+ .collect::<Vec<String>>()
+ .join(", ")
+ )
+}
diff --git a/schist_core/schist_queries/src/categories.rs b/schist_core/schist_queries/src/categories.rs
deleted file mode 100644
index f4a9747..0000000
--- a/schist_core/schist_queries/src/categories.rs
+++ /dev/null
@@ -1,49 +0,0 @@
-use anyhow::{Context, Result};
-use diesel::{QueryDsl, RunQueryDsl, SelectableHelper, SqliteConnection};
-use schist_models::category::Category;
-use schist_schema::schema::categories::{self as categories_schema, dsl::categories as categories_table};
-
-pub fn delete_all_categories(connection: &mut SqliteConnection) -> Result<usize> {
- let num_rows_deleted = diesel::delete(categories_table)
- .execute(connection)
- .with_context(|| "failed to delete all categories")?;
- Ok(num_rows_deleted)
-}
-
-pub fn get_all_categories(connection: &mut SqliteConnection) -> Result<Vec<Category>> {
- let all_categories = categories_table
- .select(Category::as_select())
- .load(connection)
- .with_context(|| "failed to get all categories")?;
- Ok(all_categories)
-}
-
-pub fn get_all_category_ids(connection: &mut SqliteConnection) -> Result<Vec<i32>> {
- let all_category_ids = categories_table
- .select(categories_schema::id)
- .load(connection)
- .with_context(|| "failed to get all category IDs")?;
- Ok(all_category_ids)
-}
-
-pub fn insert_categories(
- categories: &[Category],
- connection: &mut SqliteConnection,
-) -> Result<usize> {
- let num_categories_inserted = diesel::insert_into(categories_table)
- .values(categories)
- .execute(connection)
- .with_context(|| insert_err_msg(categories))?;
- Ok(num_categories_inserted)
-}
-
-fn insert_err_msg(categories: &[Category]) -> String {
- format!(
- "failed to insert categories: [{}]",
- categories
- .iter()
- .map(|c| format!("\"{}\": \"{}\"", c.id, c.name))
- .collect::<Vec<String>>()
- .join(", ")
- )
-}
diff --git a/schist_core/schist_queries/src/category_transfers.rs b/schist_core/schist_queries/src/category_transfers.rs
deleted file mode 100644
index 33a53ea..0000000
--- a/schist_core/schist_queries/src/category_transfers.rs
+++ /dev/null
@@ -1,74 +0,0 @@
-use anyhow::{Context, Result};
-use diesel::{dsl::sum, QueryDsl, RunQueryDsl, SelectableHelper, SqliteConnection};
-use schist_schema::schema::category_transfers::{
- self as category_transfers_schema,
- dsl::category_transfers as category_transfers_table,
-};
-use schist_models::category_transfer::CategoryTransfer;
-
-pub fn delete_all_category_transfers(connection: &mut SqliteConnection) -> Result<usize> {
- let num_rows_deleted = diesel::delete(category_transfers_table)
- .execute(connection)
- .with_context(|| "failed to delete all category transfers")?;
- Ok(num_rows_deleted)
-}
-
-pub fn get_all_category_transfers(connection: &mut SqliteConnection) -> Result<Vec<CategoryTransfer>> {
- let all_category_transfers = category_transfers_table
- .select(CategoryTransfer::as_select())
- .load(connection)
- .with_context(|| "failed to get all category transfers")?;
- Ok(all_category_transfers)
-}
-
-pub fn insert_category_transfers(
- category_transfers: &[CategoryTransfer],
- connection: &mut SqliteConnection,
-) -> Result<usize> {
- let num_rows_inserted = diesel::insert_into(category_transfers_table)
- .values(category_transfers)
- .execute(connection)
- .with_context(|| insert_err_msg(&category_transfers))?;
- Ok(num_rows_inserted)
-}
-
-fn insert_err_msg(category_transfers: &[CategoryTransfer]) -> String {
- format!(
- "failed to insert category transfers: [{}]",
- category_transfers
- .iter()
- .map(|ct| ct.id.to_string())
- .collect::<Vec<String>>()
- .join(", ")
- )
-}
-
-pub fn sum_category_transfer_quantity_per_from_category_id(
- connection: &mut SqliteConnection,
-) -> Result<Vec<(i32, i64)>> {
- let sum = category_transfers_table
- .group_by(category_transfers_schema::from_category_id)
- .select((
- category_transfers_schema::from_category_id,
- sum(category_transfers_schema::quantity),
- ))
- .load::<(i32, Option<i64>)>(connection)
- .map(|result| result.iter().map(|sum| (sum.0, sum.1.unwrap_or(0))).collect())
- .with_context(|| "failed to sum category transfer quantity per from category ID")?;
- Ok(sum)
-}
-
-pub fn sum_category_transfer_quantity_per_to_category_id(
- connection: &mut SqliteConnection,
-) -> Result<Vec<(i32, i64)>> {
- let sum = category_transfers_table
- .group_by(category_transfers_schema::to_category_id)
- .select((
- category_transfers_schema::to_category_id,
- sum(category_transfers_schema::quantity),
- ))
- .load::<(i32, Option<i64>)>(connection)
- .map(|vec| vec.iter().map(|(id, sum)| (*id, sum.unwrap_or(0))).collect())
- .with_context(|| "failed to sum category transfer quantity per to category ID")?;
- Ok(sum)
-}
diff --git a/schist_core/schist_queries/src/clear.rs b/schist_core/schist_queries/src/clear.rs
index 7cee699..6d2894d 100644
--- a/schist_core/schist_queries/src/clear.rs
+++ b/schist_core/schist_queries/src/clear.rs
@@ -2,14 +2,14 @@ use anyhow::Result;
use diesel::SqliteConnection;
use crate::{
- accounts::delete_all_accounts, budget_drips::delete_all_budget_drips, categories::delete_all_categories, category_transfers::delete_all_category_transfers, transaction_categorisations::delete_all_transaction_categorisations, transactions::delete_all_transactions
+ accounts::delete_all_accounts, budget_drips::delete_all_budget_drips, buckets::delete_all_buckets, bucket_transfers::delete_all_bucket_transfers, transaction_categorisations::delete_all_transaction_categorisations, transactions::delete_all_transactions
};
pub fn clear(connection: &mut SqliteConnection) -> Result<()> {
delete_all_accounts(connection)?;
delete_all_budget_drips(connection)?;
- delete_all_categories(connection)?;
- delete_all_category_transfers(connection)?;
+ delete_all_buckets(connection)?;
+ delete_all_bucket_transfers(connection)?;
delete_all_transactions(connection)?;
delete_all_transaction_categorisations(connection)?;
Ok(())
diff --git a/schist_core/schist_queries/src/lib.rs b/schist_core/schist_queries/src/lib.rs
index a1a5c20..e3e5488 100644
--- a/schist_core/schist_queries/src/lib.rs
+++ b/schist_core/schist_queries/src/lib.rs
@@ -1,8 +1,8 @@
pub mod accounts;
pub mod account_transfers;
pub mod budget_drips;
-pub mod categories;
-pub mod category_transfers;
+pub mod buckets;
+pub mod bucket_transfers;
pub mod clear;
pub mod transactions;
pub mod transaction_categorisations;
diff --git a/schist_core/schist_queries/src/transaction_categorisations.rs b/schist_core/schist_queries/src/transaction_categorisations.rs
index 320782d..95aaf8d 100644
--- a/schist_core/schist_queries/src/transaction_categorisations.rs
+++ b/schist_core/schist_queries/src/transaction_categorisations.rs
@@ -43,17 +43,17 @@ fn insert_err_msg(transaction_categorisations: &[TransactionCategorisation]) ->
)
}
-pub fn sum_transaction_categorisation_quantity_per_category_id(
+pub fn sum_transaction_categorisation_quantity_per_bucket_id(
connection: &mut SqliteConnection,
) -> Result<Vec<(i32, i64)>> {
let sum = transaction_categorisations_table
- .group_by(transaction_categorisations_schema::category_id)
+ .group_by(transaction_categorisations_schema::bucket_id)
.select((
- transaction_categorisations_schema::category_id,
+ transaction_categorisations_schema::bucket_id,
sum(transaction_categorisations_schema::quantity),
))
.load::<(i32, Option<i64>)>(connection)
- .map(|vec| vec.iter().map(|(category_id, sum)| (*category_id, sum.unwrap_or(0))).collect())
- .with_context(|| "failed to sum transaction categorisation quantity per category ID")?;
+ .map(|vec| vec.iter().map(|(bucket_id, sum)| (*bucket_id, sum.unwrap_or(0))).collect())
+ .with_context(|| "failed to sum transaction categorisation quantity per bucket ID")?;
Ok(sum)
}
diff --git a/schist_core/schist_queries/src/transactions.rs b/schist_core/schist_queries/src/transactions.rs
index 70b14e7..5941ebc 100644
--- a/schist_core/schist_queries/src/transactions.rs
+++ b/schist_core/schist_queries/src/transactions.rs
@@ -14,7 +14,7 @@ pub fn get_all_transactions(connection: &mut SqliteConnection) -> Result<Vec<Tra
let all_transactions = transactions_table
.select(Transaction::as_select())
.load(connection)
- .with_context(|| "failed to get all category transfers")?;
+ .with_context(|| "failed to get all bucket transfers")?;
Ok(all_transactions)
}
diff --git a/schist_core/schist_queries/src/utils/calculate_bucket_balance.rs b/schist_core/schist_queries/src/utils/calculate_bucket_balance.rs
new file mode 100644
index 0000000..5194084
--- /dev/null
+++ b/schist_core/schist_queries/src/utils/calculate_bucket_balance.rs
@@ -0,0 +1,130 @@
+use anyhow::Result;
+use schist_models::{bucket::Bucket, budget_drip::BudgetDrip};
+
+use super::{calculate_budgets_accrual, find_by_id_or};
+
+pub fn calculate_bucket_balance(
+ bucket: &Bucket,
+ transaction_sums: &[(i32, i64)],
+ bucket_transfer_from_sums: &[(i32, i64)],
+ bucket_transfer_to_sums: &[(i32, i64)],
+ budget_drips: &[BudgetDrip],
+) -> Result<i64> {
+ let transaction_sum = find_by_id_or(transaction_sums, bucket.id, 0);
+ let bucket_transfer_from_sum = find_by_id_or(bucket_transfer_from_sums, bucket.id, 0);
+ let bucket_transfer_to_sum = find_by_id_or(bucket_transfer_to_sums, bucket.id, 0);
+ let budget_accruals_sum = calculate_budgets_accrual(bucket, budget_drips)?;
+
+ Ok(
+ transaction_sum
+ + budget_accruals_sum
+ + bucket_transfer_to_sum
+ - bucket_transfer_from_sum
+ )
+}
+
+#[cfg(test)]
+mod test {
+ use schist_fakes::{budget_drip::make_fake_budget_drip_builder, bucket::make_fake_bucket};
+
+ use super::calculate_bucket_balance;
+
+ #[test]
+ fn when_no_data_then_returns_zero() {
+ let bucket = make_fake_bucket(0);
+
+ let result = calculate_bucket_balance(&bucket, &[], &[], &[], &[]);
+
+ assert!(result.is_ok());
+ assert_eq!(result.unwrap(), 0_i64);
+ }
+
+ #[test]
+ fn when_data_only_for_another_bucket_then_returns_zero() {
+ let bucket = make_fake_bucket(0);
+ let transaction_sums = [(1, 100)];
+ let bucket_transfer_from_sums = [(1, 91)];
+ let bucket_transfer_to_sums = [(2, 79)];
+ let budget_drips = [
+ make_fake_budget_drip_builder(0).quantity(100).bucket_id(1).build().unwrap(),
+ ];
+
+ let result = calculate_bucket_balance(
+ &bucket,
+ &transaction_sums,
+ &bucket_transfer_from_sums,
+ &bucket_transfer_to_sums,
+ &budget_drips,
+ );
+
+ assert!(result.is_ok());
+ assert_eq!(result.unwrap(), 0_i64);
+ }
+
+ #[test]
+ fn when_transaction_sum_is_zero_then_returns_zero() {
+ let bucket = make_fake_bucket(0);
+ let transaction_sums = [(0, 0)];
+ let bucket_transfer_from_sums = [];
+ let bucket_transfer_to_sums = [];
+ let budget_drips = [];
+
+ let result = calculate_bucket_balance(
+ &bucket,
+ &transaction_sums,
+ &bucket_transfer_from_sums,
+ &bucket_transfer_to_sums,
+ &budget_drips,
+ );
+
+ assert!(result.is_ok());
+ assert_eq!(result.unwrap(), 0_i64);
+ }
+
+ #[test]
+ fn when_bucket_transfers_are_zero_then_returns_zero() {
+ let bucket = make_fake_bucket(0);
+ let transaction_sums = [];
+ let bucket_transfer_from_sums = [(0, 0)];
+ let bucket_transfer_to_sums = [(0, 0)];
+ let budget_drips = [];
+
+ let result = calculate_bucket_balance(
+ &bucket,
+ &transaction_sums,
+ &bucket_transfer_from_sums,
+ &bucket_transfer_to_sums,
+ &budget_drips,
+ );
+
+ assert!(result.is_ok());
+ assert_eq!(result.unwrap(), 0_i64);
+ }
+
+ #[test]
+ fn when_some_data_then_calculates_as_expected() {
+ let bucket = make_fake_bucket(0);
+ let transaction_sums = [(0, 100)];
+ let bucket_transfer_from_sums = [(0, 91)];
+ let bucket_transfer_to_sums = [(0, 79)];
+ let budget_drips = [
+ make_fake_budget_drip_builder(0).quantity(77).bucket_id(0).build().unwrap(),
+ make_fake_budget_drip_builder(0).quantity(77).bucket_id(0).build().unwrap(),
+ make_fake_budget_drip_builder(0).quantity(77).bucket_id(0).build().unwrap(),
+ make_fake_budget_drip_builder(0).quantity(77).bucket_id(0).build().unwrap(),
+ make_fake_budget_drip_builder(0).quantity(77).bucket_id(0).build().unwrap(),
+ ];
+
+ let result = calculate_bucket_balance(
+ &bucket,
+ &transaction_sums,
+ &bucket_transfer_from_sums,
+ &bucket_transfer_to_sums,
+ &budget_drips,
+ );
+
+ let expected_result = 100 + (-91) + 79 + 77 * 5;
+ assert!(result.is_ok());
+ assert_eq!(result.unwrap(), expected_result);
+ }
+}
diff --git a/schist_core/schist_queries/src/utils/calculate_budgets_accrual.rs b/schist_core/schist_queries/src/utils/calculate_budgets_accrual.rs
index ca82953..cbf7180 100644
--- a/schist_core/schist_queries/src/utils/calculate_budgets_accrual.rs
+++ b/schist_core/schist_queries/src/utils/calculate_budgets_accrual.rs
@@ -1,13 +1,13 @@
use anyhow::Result;
use schist_models::{
budget_drip::BudgetDrip,
- category::Category,
+ bucket::Bucket,
};
-pub fn calculate_budgets_accrual(category: &Category, budget_drips: &[BudgetDrip]) -> Result<i64> {
+pub fn calculate_budgets_accrual(bucket: &Bucket, budget_drips: &[BudgetDrip]) -> Result<i64> {
Ok(budget_drips
.iter()
- .filter(|bd| bd.category_id == category.id)
+ .filter(|bd| bd.bucket_id == bucket.id)
.map(|bd| Into::<i64>::into(bd.quantity))
.sum()
)
@@ -15,29 +15,29 @@ pub fn calculate_budgets_accrual(category: &Category, budget_drips: &[BudgetDrip
#[cfg(test)]
mod test {
- use schist_fakes::{budget_drip::make_fake_budget_drip_builder, category::make_fake_category};
+ use schist_fakes::{budget_drip::make_fake_budget_drip_builder, bucket::make_fake_bucket};
use super::calculate_budgets_accrual;
#[test]
fn when_no_budget_drips_then_return_zero() {
- let category = make_fake_category(0);
+ let bucket = make_fake_bucket(0);
let budget_drips = [];
- let result = calculate_budgets_accrual(&category, &budget_drips);
+ let result = calculate_budgets_accrual(&bucket, &budget_drips);
assert!(result.is_ok());
assert_eq!(result.unwrap(), 0_i64);
}
#[test]
- fn when_one_budget_drip_for_another_category_then_return_zero() {
- let category = make_fake_category(0);
+ fn when_one_budget_drip_for_another_bucket_then_return_zero() {
+ let bucket = make_fake_bucket(0);
let budget_drips = [
- make_fake_budget_drip_builder(0).quantity(100).category_id(1).build().unwrap(),
+ make_fake_budget_drip_builder(0).quantity(100).bucket_id(1).build().unwrap(),
];
- let result = calculate_budgets_accrual(&category, &budget_drips);
+ let result = calculate_budgets_accrual(&bucket, &budget_drips);
assert!(result.is_ok());
assert_eq!(result.unwrap(), 0_i64);
@@ -45,12 +45,12 @@ mod test {
#[test]
fn when_one_budget_drip_then_return_quantity() {
- let category = make_fake_category(0);
+ let bucket = make_fake_bucket(0);
let budget_drips = [
- make_fake_budget_drip_builder(0).quantity(100).category_id(0).build().unwrap(),
+ make_fake_budget_drip_builder(0).quantity(100).bucket_id(0).build().unwrap(),
];
- let result = calculate_budgets_accrual(&category, &budget_drips);
+ let result = calculate_budgets_accrual(&bucket, &budget_drips);
assert!(result.is_ok());
assert_eq!(result.unwrap(), 100);
@@ -58,13 +58,13 @@ mod test {
#[test]
fn when_two_budget_drips_then_return_sum() {
- let category = make_fake_category(0);
+ let bucket = make_fake_bucket(0);
let budget_drips = [
- make_fake_budget_drip_builder(0).quantity(100).category_id(0).build().unwrap(),
- make_fake_budget_drip_builder(1).quantity(120).category_id(0).build().unwrap(),
+ make_fake_budget_drip_builder(0).quantity(100).bucket_id(0).build().unwrap(),
+ make_fake_budget_drip_builder(1).quantity(120).bucket_id(0).build().unwrap(),
];
- let result = calculate_budgets_accrual(&category, &budget_drips);
+ let result = calculate_budgets_accrual(&bucket, &budget_drips);
assert!(result.is_ok());
assert_eq!(result.unwrap(), 220);
diff --git a/schist_core/schist_queries/src/utils/calculate_category_balance.rs b/schist_core/schist_queries/src/utils/calculate_category_balance.rs
deleted file mode 100644
index 73e80cd..0000000
--- a/schist_core/schist_queries/src/utils/calculate_category_balance.rs
+++ /dev/null
@@ -1,130 +0,0 @@
-use anyhow::Result;
-use schist_models::{budget_drip::BudgetDrip, category::Category};
-
-use super::{calculate_budgets_accrual, find_by_id_or};
-
-pub fn calculate_category_balance(
- category: &Category,
- transaction_sums: &[(i32, i64)],
- category_transfer_from_sums: &[(i32, i64)],
- category_transfer_to_sums: &[(i32, i64)],
- budget_drips: &[BudgetDrip],
-) -> Result<i64> {
- let transaction_sum = find_by_id_or(transaction_sums, category.id, 0);
- let category_transfer_from_sum = find_by_id_or(category_transfer_from_sums, category.id, 0);
- let category_transfer_to_sum = find_by_id_or(category_transfer_to_sums, category.id, 0);
- let budget_accruals_sum = calculate_budgets_accrual(category, budget_drips)?;
-
- Ok(
- transaction_sum
- + budget_accruals_sum
- + category_transfer_to_sum
- - category_transfer_from_sum
- )
-}
-
-#[cfg(test)]
-mod test {
- use schist_fakes::{budget_drip::make_fake_budget_drip_builder, category::make_fake_category};
-
- use super::calculate_category_balance;
-
- #[test]
- fn when_no_data_then_returns_zero() {
- let category = make_fake_category(0);
-
- let result = calculate_category_balance(&category, &[], &[], &[], &[]);
-
- assert!(result.is_ok());
- assert_eq!(result.unwrap(), 0_i64);
- }
-
- #[test]
- fn when_data_only_for_another_category_then_returns_zero() {
- let category = make_fake_category(0);
- let transaction_sums = [(1, 100)];
- let category_transfer_from_sums = [(1, 91)];
- let category_transfer_to_sums = [(2, 79)];
- let budget_drips = [
- make_fake_budget_drip_builder(0).quantity(100).category_id(1).build().unwrap(),
- ];
-
- let result = calculate_category_balance(
- &category,
- &transaction_sums,
- &category_transfer_from_sums,
- &category_transfer_to_sums,
- &budget_drips,
- );
-
- assert!(result.is_ok());
- assert_eq!(result.unwrap(), 0_i64);
- }
-
- #[test]
- fn when_transaction_sum_is_zero_then_returns_zero() {
- let category = make_fake_category(0);
- let transaction_sums = [(0, 0)];
- let category_transfer_from_sums = [];
- let category_transfer_to_sums = [];
- let budget_drips = [];
-
- let result = calculate_category_balance(
- &category,
- &transaction_sums,
- &category_transfer_from_sums,
- &category_transfer_to_sums,
- &budget_drips,
- );
-
- assert!(result.is_ok());
- assert_eq!(result.unwrap(), 0_i64);
- }
-
- #[test]
- fn when_category_transfers_are_zero_then_returns_zero() {
- let category = make_fake_category(0);
- let transaction_sums = [];
- let category_transfer_from_sums = [(0, 0)];
- let category_transfer_to_sums = [(0, 0)];
- let budget_drips = [];
-
- let result = calculate_category_balance(
- &category,
- &transaction_sums,
- &category_transfer_from_sums,
- &category_transfer_to_sums,
- &budget_drips,
- );
-
- assert!(result.is_ok());
- assert_eq!(result.unwrap(), 0_i64);
- }
-
- #[test]
- fn when_some_data_then_calculates_as_expected() {
- let category = make_fake_category(0);
- let transaction_sums = [(0, 100)];
- let category_transfer_from_sums = [(0, 91)];
- let category_transfer_to_sums = [(0, 79)];
- let budget_drips = [
- make_fake_budget_drip_builder(0).quantity(77).category_id(0).build().unwrap(),
- make_fake_budget_drip_builder(0).quantity(77).category_id(0).build().unwrap(),
- make_fake_budget_drip_builder(0).quantity(77).category_id(0).build().unwrap(),
- make_fake_budget_drip_builder(0).quantity(77).category_id(0).build().unwrap(),
- make_fake_budget_drip_builder(0).quantity(77).category_id(0).build().unwrap(),
- ];
-
- let result = calculate_category_balance(
- &category,
- &transaction_sums,
- &category_transfer_from_sums,
- &category_transfer_to_sums,
- &budget_drips,
- );
-
- let expected_result = 100 + (-91) + 79 + 77 * 5;
- assert!(result.is_ok());
- assert_eq!(result.unwrap(), expected_result);
- }
-}
diff --git a/schist_core/schist_queries/src/utils/mod.rs b/schist_core/schist_queries/src/utils/mod.rs
index f2653d8..c006a9b 100644
--- a/schist_core/schist_queries/src/utils/mod.rs
+++ b/schist_core/schist_queries/src/utils/mod.rs
@@ -1,8 +1,8 @@
mod calculate_budgets_accrual;
-mod calculate_category_balance;
+mod calculate_bucket_balance;
mod find_by_id_or;
use calculate_budgets_accrual::calculate_budgets_accrual;
-pub use calculate_category_balance::calculate_category_balance;
+pub use calculate_bucket_balance::calculate_bucket_balance;
pub use find_by_id_or::find_by_id_or;
diff --git a/schist_core/schist_queries/tests/budget_drips.rs b/schist_core/schist_queries/tests/budget_drips.rs
index ac33885..7c5bd4d 100644
--- a/schist_core/schist_queries/tests/budget_drips.rs
+++ b/schist_core/schist_queries/tests/budget_drips.rs
@@ -2,29 +2,29 @@ mod common;
use common::test_context::TestContext;
use diesel::{Connection, SqliteConnection};
-use schist_fakes::{budget_drip::make_fake_budget_drip_builder, category::make_fake_category};
-use schist_models::{category::Category, date_utc::DateUtc};
+use schist_fakes::{budget_drip::make_fake_budget_drip_builder, bucket::make_fake_bucket};
+use schist_models::{bucket::Bucket, date_utc::DateUtc};
use schist_queries as queries;
-fn given_categories(connection: &mut SqliteConnection) -> Vec<Category> {
- let categories = vec![make_fake_category(0), make_fake_category(1)];
- let _ = queries::categories::insert_categories(&categories, connection);
- categories
+fn given_buckets(connection: &mut SqliteConnection) -> Vec<Bucket> {
+ let buckets = vec![make_fake_bucket(0), make_fake_bucket(1)];
+ let _ = queries::buckets::insert_buckets(&buckets, connection);
+ buckets
}
#[test]
fn when_insert_budget_drips_then_returns_num_budget_drips() {
let context = TestContext::new();
let connection = &mut SqliteConnection::establish(&context.db_url).unwrap();
- let _categories = given_categories(connection);
+ let _buckets = given_buckets(connection);
let budget_drips = [
make_fake_budget_drip_builder(0)
.date(DateUtc::from_ymd(2020, 12, 25).unwrap())
- .category_id(0)
+ .bucket_id(0)
.build().unwrap(),
make_fake_budget_drip_builder(1)
.date(DateUtc::from_ymd(2020, 12, 26).unwrap())
- .category_id(0)
+ .bucket_id(0)
.build().unwrap(),
];
@@ -34,14 +34,14 @@ fn when_insert_budget_drips_then_returns_num_budget_drips() {
}
#[test]
-fn given_budget_drip_when_insert_budget_drip_same_category_and_same_date_then_return_err() {
+fn given_budget_drip_when_insert_budget_drip_same_bucket_and_same_date_then_return_err() {
let context = TestContext::new();
let connection = &mut SqliteConnection::establish(&context.db_url).unwrap();
- let _categories = given_categories(connection);
+ let _buckets = given_buckets(connection);
let budget_drips_1 = [
make_fake_budget_drip_builder(0)
- .category_id(0)
+ .bucket_id(0)
.date(DateUtc::from_ymd(2020, 12, 25).unwrap())
.build().unwrap()
];
@@ -49,7 +49,7 @@ fn given_budget_drip_when_insert_budget_drip_same_category_and_same_date_then_re
let budget_drips_2 = [
make_fake_budget_drip_builder(1)
- .category_id(0)
+ .bucket_id(0)
.date(DateUtc::from_ymd(2020, 12, 25).unwrap())
.build().unwrap()
];
@@ -59,14 +59,14 @@ fn given_budget_drip_when_insert_budget_drip_same_category_and_same_date_then_re
}
#[test]
-fn given_budget_drip_when_insert_budget_drip_different_category_and_same_date_then_return_num_budget_drips_inserted() {
+fn given_budget_drip_when_insert_budget_drip_different_bucket_and_same_date_then_return_num_budget_drips_inserted() {
let context = TestContext::new();
let connection = &mut SqliteConnection::establish(&context.db_url).unwrap();
- let _categories = given_categories(connection);
+ let _buckets = given_buckets(connection);
let budget_drips_1 = [
make_fake_budget_drip_builder(0)
- .category_id(0)
+ .bucket_id(0)
.date(DateUtc::from_ymd(2020, 12, 25).unwrap())
.build().unwrap()
];
@@ -74,7 +74,7 @@ fn given_budget_drip_when_insert_budget_drip_different_category_and_same_date_th
let budget_drips_2 = [
make_fake_budget_drip_builder(1)
- .category_id(1)
+ .bucket_id(1)
.date(DateUtc::from_ymd(2020, 12, 25).unwrap())
.build().unwrap()
];
@@ -85,14 +85,14 @@ fn given_budget_drip_when_insert_budget_drip_different_category_and_same_date_th
}
#[test]
-fn given_budget_drip_when_insert_budget_drip_same_category_and_different_date_then_return_num_budget_drips_inserted() {
+fn given_budget_drip_when_insert_budget_drip_same_bucket_and_different_date_then_return_num_budget_drips_inserted() {
let context = TestContext::new();
let connection = &mut SqliteConnection::establish(&context.db_url).unwrap();
- let _categories = given_categories(connection);
+ let _buckets = given_buckets(connection);
let budget_drips_1 = [
make_fake_budget_drip_builder(0)
- .category_id(0)
+ .bucket_id(0)
.date(DateUtc::from_ymd(2020, 12, 25).unwrap())
.build().unwrap()
];
@@ -100,7 +100,7 @@ fn given_budget_drip_when_insert_budget_drip_same_category_and_different_date_th
let budget_drips_2 = [
make_fake_budget_drip_builder(1)
- .category_id(0)
+ .bucket_id(0)
.date(DateUtc::from_ymd(2020, 12, 26).unwrap())
.build().unwrap()
];
@@ -114,15 +114,15 @@ fn given_budget_drip_when_insert_budget_drip_same_category_and_different_date_th
fn given_budget_drips_when_get_all_budget_drips_then_return_budget_drips() {
let context = TestContext::new();
let connection = &mut SqliteConnection::establish(&context.db_url).unwrap();
- let _categories = given_categories(connection);
+ let _buckets = given_buckets(connection);
let budget_drips = [
make_fake_budget_drip_builder(0)
.date(DateUtc::from_ymd(2020, 12, 25).unwrap())
- .category_id(0)
+ .bucket_id(0)
.build().unwrap(),
make_fake_budget_drip_builder(1)
.date(DateUtc::from_ymd(2020, 12, 26).unwrap())
- .category_id(0)
+ .bucket_id(0)
.build().unwrap(),
];
let _ = queries::budget_drips::insert_budget_drips(&budget_drips, connection).unwrap();
@@ -144,15 +144,15 @@ fn given_budget_drips_when_get_all_budget_drips_then_return_budget_drips() {
fn given_budget_drips_when_delete_all_budget_drips_then_return_num_of_budget_drips() {
let context = TestContext::new();
let connection = &mut SqliteConnection::establish(&context.db_url).unwrap();
- let _categories = given_categories(connection);
+ let _buckets = given_buckets(connection);
let budget_drips = [
make_fake_budget_drip_builder(0)
.date(DateUtc::from_ymd(2020, 12, 25).unwrap())
- .category_id(0)
+ .bucket_id(0)
.build().unwrap(),
make_fake_budget_drip_builder(1)
.date(DateUtc::from_ymd(2020, 12, 26).unwrap())
- .category_id(0)
+ .bucket_id(0)
.build().unwrap(),
];
let _ = queries::budget_drips::insert_budget_drips(&budget_drips, connection).unwrap();
@@ -166,15 +166,15 @@ fn given_budget_drips_when_delete_all_budget_drips_then_return_num_of_budget_dri
fn given_deleted_budget_drips_when_get_all_budget_drips_then_return_empty() {
let context = TestContext::new();
let connection = &mut SqliteConnection::establish(&context.db_url).unwrap();
- let _categories = given_categories(connection);
+ let _buckets = given_buckets(connection);
let budget_drips = [
make_fake_budget_drip_builder(0)
.date(DateUtc::from_ymd(2020, 12, 25).unwrap())
- .category_id(0)
+ .bucket_id(0)
.build().unwrap(),
make_fake_budget_drip_builder(1)
.date(DateUtc::from_ymd(2020, 12, 26).unwrap())
- .category_id(0)
+ .bucket_id(0)
.build().unwrap(),
];
let _ = queries::budget_drips::insert_budget_drips(&budget_drips, connection).unwrap();
diff --git a/schist_core/schist_queries/tests/categories.rs b/schist_core/schist_queries/tests/categories.rs
index 915e853..5ef6552 100644
--- a/schist_core/schist_queries/tests/categories.rs
+++ b/schist_core/schist_queries/tests/categories.rs
@@ -2,80 +2,80 @@ mod common;
use common::test_context::TestContext;
use diesel::{Connection, SqliteConnection};
-use schist_fakes::category::make_fake_category;
-use schist_models::category::Category;
+use schist_fakes::bucket::make_fake_bucket;
+use schist_models::bucket::Bucket;
use schist_queries as queries;
-fn given_categories(connection: &mut SqliteConnection) -> Vec<Category> {
- let categories = vec![make_fake_category(0), make_fake_category(1)];
- let _ = queries::categories::insert_categories(&categories, connection).unwrap();
- categories
+fn given_buckets(connection: &mut SqliteConnection) -> Vec<Bucket> {
+ let buckets = vec![make_fake_bucket(0), make_fake_bucket(1)];
+ let _ = queries::buckets::insert_buckets(&buckets, connection).unwrap();
+ buckets
}
#[test]
-fn when_insert_categories_then_returns_num_categories() {
+fn when_insert_buckets_then_returns_num_buckets() {
let context = TestContext::new();
let connection = &mut SqliteConnection::establish(&context.db_url).unwrap();
- let categories = [make_fake_category(0), make_fake_category(1)];
+ let buckets = [make_fake_bucket(0), make_fake_bucket(1)];
- let num_categories_inserted = queries::categories::insert_categories(&categories, connection).unwrap();
+ let num_buckets_inserted = queries::buckets::insert_buckets(&buckets, connection).unwrap();
- assert_eq!(num_categories_inserted, 2);
+ assert_eq!(num_buckets_inserted, 2);
}
#[test]
-fn given_categories_when_get_all_categories_then_return_categories() {
+fn given_buckets_when_get_all_buckets_then_return_buckets() {
let context = TestContext::new();
let connection = &mut SqliteConnection::establish(&context.db_url).unwrap();
- let categories = given_categories(connection);
+ let buckets = given_buckets(connection);
- let categories_in_db = queries::categories::get_all_categories(connection).unwrap();
+ let buckets_in_db = queries::buckets::get_all_buckets(connection).unwrap();
- assert_eq!(categories_in_db.len(), categories.len());
- for category in &categories {
- assert!(categories_in_db.iter().any(|category_in_db| category_in_db.eq(&category)));
+ assert_eq!(buckets_in_db.len(), buckets.len());
+ for bucket in &buckets {
+ assert!(buckets_in_db.iter().any(|bucket_in_db| bucket_in_db.eq(&bucket)));
}
- for category_in_db in categories_in_db {
- assert!(categories.iter().any(|category| category.eq(&category_in_db)));
+ for bucket_in_db in buckets_in_db {
+ assert!(buckets.iter().any(|bucket| bucket.eq(&bucket_in_db)));
}
}
#[test]
-fn given_categories_when_delete_all_categories_then_return_num_of_categories() {
+fn given_buckets_when_delete_all_buckets_then_return_num_of_buckets() {
let context = TestContext::new();
let connection = &mut SqliteConnection::establish(&context.db_url).unwrap();
- let categories = given_categories(connection);
+ let buckets = given_buckets(connection);
- let num_categories_deleted = queries::categories::delete_all_categories(connection).unwrap();
+ let num_buckets_deleted = queries::buckets::delete_all_buckets(connection).unwrap();
- assert_eq!(num_categories_deleted, categories.len());
+ assert_eq!(num_buckets_deleted, buckets.len());
}
#[test]
-fn given_deleted_categories_when_get_all_categories_then_return_empty() {
+fn given_deleted_buckets_when_get_all_buckets_then_return_empty() {
let context = TestContext::new();
let connection = &mut SqliteConnection::establish(&context.db_url).unwrap();
- given_categories(connection);
- let _ = queries::categories::delete_all_categories(connection).unwrap();
+ given_buckets(connection);
+ let _ = queries::buckets::delete_all_buckets(connection).unwrap();
- let categories_returned = queries::categories::get_all_categories(connection).unwrap();
+ let buckets_returned = queries::buckets::get_all_buckets(connection).unwrap();
- assert_eq!(categories_returned.len(), 0);
+ assert_eq!(buckets_returned.len(), 0);
}
#[test]
-fn given_categories_when_get_all_ids_then_return_all_ids() {
+fn given_buckets_when_get_all_ids_then_return_all_ids() {
let context = TestContext::new();
let connection = &mut SqliteConnection::establish(&context.db_url).unwrap();
- let categories = given_categories(connection);
+ let buckets = given_buckets(connection);
- let ids = queries::categories::get_all_category_ids(connection).unwrap();
+ let ids = queries::buckets::get_all_bucket_ids(connection).unwrap();
- assert_eq!(categories.len(), ids.len());
- for category in &categories {
- assert!(ids.iter().any(|id| category.id == *id));
+ assert_eq!(buckets.len(), ids.len());
+ for bucket in &buckets {
+ assert!(ids.iter().any(|id| bucket.id == *id));
}
for id in ids {
- assert!(categories.iter().any(|category| category.id == id));
+ assert!(buckets.iter().any(|bucket| bucket.id == id));
}
}
diff --git a/schist_core/schist_queries/tests/category_transfers.rs b/schist_core/schist_queries/tests/category_transfers.rs
index f37a668..e913dcb 100644
--- a/schist_core/schist_queries/tests/category_transfers.rs
+++ b/schist_core/schist_queries/tests/category_transfers.rs
@@ -2,125 +2,125 @@ mod common;
use common::test_context::TestContext;
use diesel::{Connection, SqliteConnection};
-use schist_fakes::{category::make_fake_category, category_transfer::make_fake_category_transfer_builder};
+use schist_fakes::{bucket::make_fake_bucket, bucket_transfer::make_fake_bucket_transfer_builder};
use schist_queries as queries;
#[test]
-fn when_insert_category_transfers_then_returns_num_category_transfers() {
+fn when_insert_bucket_transfers_then_returns_num_bucket_transfers() {
let context = TestContext::new();
let connection = &mut SqliteConnection::establish(&context.db_url).unwrap();
- let categories = [make_fake_category(0), make_fake_category(1)];
- let category_transfers = [
- make_fake_category_transfer_builder(0).from_category_id(0).to_category_id(1).build().unwrap(),
- make_fake_category_transfer_builder(1).from_category_id(0).to_category_id(1).build().unwrap(),
+ let buckets = [make_fake_bucket(0), make_fake_bucket(1)];
+ let bucket_transfers = [
+ make_fake_bucket_transfer_builder(0).from_bucket_id(0).to_bucket_id(1).build().unwrap(),
+ make_fake_bucket_transfer_builder(1).from_bucket_id(0).to_bucket_id(1).build().unwrap(),
];
- let _ = queries::categories::insert_categories(&categories, connection);
+ let _ = queries::buckets::insert_buckets(&buckets, connection);
- let num_category_transfers_inserted = queries::category_transfers::insert_category_transfers(&category_transfers, connection).unwrap();
+ let num_bucket_transfers_inserted = queries::bucket_transfers::insert_bucket_transfers(&bucket_transfers, connection).unwrap();
- assert_eq!(num_category_transfers_inserted, 2);
+ assert_eq!(num_bucket_transfers_inserted, 2);
}
#[test]
-fn given_category_transfers_when_get_all_category_transfers_then_return_category_transfers() {
+fn given_bucket_transfers_when_get_all_bucket_transfers_then_return_bucket_transfers() {
let context = TestContext::new();
let connection = &mut SqliteConnection::establish(&context.db_url).unwrap();
- let categories = [make_fake_category(0), make_fake_category(1)];
- let category_transfers = [
- make_fake_category_transfer_builder(0).from_category_id(0).to_category_id(1).build().unwrap(),
- make_fake_category_transfer_builder(1).from_category_id(0).to_category_id(1).build().unwrap(),
+ let buckets = [make_fake_bucket(0), make_fake_bucket(1)];
+ let bucket_transfers = [
+ make_fake_bucket_transfer_builder(0).from_bucket_id(0).to_bucket_id(1).build().unwrap(),
+ make_fake_bucket_transfer_builder(1).from_bucket_id(0).to_bucket_id(1).build().unwrap(),
];
- let _ = queries::categories::insert_categories(&categories, connection);
- let _ = queries::category_transfers::insert_category_transfers(&category_transfers, connection).unwrap();
+ let _ = queries::buckets::insert_buckets(&buckets, connection);
+ let _ = queries::bucket_transfers::insert_bucket_transfers(&bucket_transfers, connection).unwrap();
- let category_transfers_in_db = queries::category_transfers::get_all_category_transfers(connection).unwrap();
+ let bucket_transfers_in_db = queries::bucket_transfers::get_all_bucket_transfers(connection).unwrap();
- assert_eq!(category_transfers_in_db.len(), category_transfers.len());
- for category_transfer in &category_transfers {
- assert!(category_transfers_in_db.iter().any(|category_transfer_in_db| category_transfer_in_db.eq(&category_transfer)));
+ assert_eq!(bucket_transfers_in_db.len(), bucket_transfers.len());
+ for bucket_transfer in &bucket_transfers {
+ assert!(bucket_transfers_in_db.iter().any(|bucket_transfer_in_db| bucket_transfer_in_db.eq(&bucket_transfer)));
}
- for category_transfer_in_db in category_transfers_in_db {
- assert!(category_transfers.iter().any(|category_transfer| category_transfer.eq(&category_transfer_in_db)));
+ for bucket_transfer_in_db in bucket_transfers_in_db {
+ assert!(bucket_transfers.iter().any(|bucket_transfer| bucket_transfer.eq(&bucket_transfer_in_db)));
}
}
#[test]
-fn given_category_transfers_when_delete_all_category_transfers_then_return_num_of_category_transfers() {
+fn given_bucket_transfers_when_delete_all_bucket_transfers_then_return_num_of_bucket_transfers() {
let context = TestContext::new();
let connection = &mut SqliteConnection::establish(&context.db_url).unwrap();
- let categories = [make_fake_category(0), make_fake_category(1)];
- let category_transfers = [
- make_fake_category_transfer_builder(0).from_category_id(0).to_category_id(1).build().unwrap(),
- make_fake_category_transfer_builder(1).from_category_id(0).to_category_id(1).build().unwrap(),
+ let buckets = [make_fake_bucket(0), make_fake_bucket(1)];
+ let bucket_transfers = [
+ make_fake_bucket_transfer_builder(0).from_bucket_id(0).to_bucket_id(1).build().unwrap(),
+ make_fake_bucket_transfer_builder(1).from_bucket_id(0).to_bucket_id(1).build().unwrap(),
];
- let _ = queries::categories::insert_categories(&categories, connection);
- let _ = queries::category_transfers::insert_category_transfers(&category_transfers, connection).unwrap();
+ let _ = queries::buckets::insert_buckets(&buckets, connection);
+ let _ = queries::bucket_transfers::insert_bucket_transfers(&bucket_transfers, connection).unwrap();
- let num_category_transfers_deleted = queries::category_transfers::delete_all_category_transfers(connection).unwrap();
+ let num_bucket_transfers_deleted = queries::bucket_transfers::delete_all_bucket_transfers(connection).unwrap();
- assert_eq!(num_category_transfers_deleted, category_transfers.len());
+ assert_eq!(num_bucket_transfers_deleted, bucket_transfers.len());
}
#[test]
-fn given_deleted_category_transfers_when_get_all_category_transfers_then_return_empty() {
+fn given_deleted_bucket_transfers_when_get_all_bucket_transfers_then_return_empty() {
let context = TestContext::new();
let connection = &mut SqliteConnection::establish(&context.db_url).unwrap();
- let categories = [make_fake_category(0), make_fake_category(1)];
- let category_transfers = [
- make_fake_category_transfer_builder(0).from_category_id(0).to_category_id(1).build().unwrap(),
- make_fake_category_transfer_builder(1).from_category_id(0).to_category_id(1).build().unwrap(),
+ let buckets = [make_fake_bucket(0), make_fake_bucket(1)];
+ let bucket_transfers = [
+ make_fake_bucket_transfer_builder(0).from_bucket_id(0).to_bucket_id(1).build().unwrap(),
+ make_fake_bucket_transfer_builder(1).from_bucket_id(0).to_bucket_id(1).build().unwrap(),
];
- let _ = queries::categories::insert_categories(&categories, connection);
- let _ = queries::category_transfers::insert_category_transfers(&category_transfers, connection).unwrap();
- let _ = queries::category_transfers::delete_all_category_transfers(connection).unwrap();
+ let _ = queries::buckets::insert_buckets(&buckets, connection);
+ let _ = queries::bucket_transfers::insert_bucket_transfers(&bucket_transfers, connection).unwrap();
+ let _ = queries::bucket_transfers::delete_all_bucket_transfers(connection).unwrap();
- let category_transfers_returned = queries::category_transfers::get_all_category_transfers(connection).unwrap();
+ let bucket_transfers_returned = queries::bucket_transfers::get_all_bucket_transfers(connection).unwrap();
- assert_eq!(category_transfers_returned.len(), 0);
+ assert_eq!(bucket_transfers_returned.len(), 0);
}
#[test]
-fn given_category_transfers_when_sum_quantity_per_from_category_id_then_returns_sum_per_from_category_id() {
+fn given_bucket_transfers_when_sum_quantity_per_from_bucket_id_then_returns_sum_per_from_bucket_id() {
let context = TestContext::new();
let connection = &mut SqliteConnection::establish(&context.db_url).unwrap();
- let categories = [make_fake_category(0), make_fake_category(1)];
- let category_transfers = [
- make_fake_category_transfer_builder(0).from_category_id(0).to_category_id(1).quantity(1).build().unwrap(),
- make_fake_category_transfer_builder(1).from_category_id(0).to_category_id(1).quantity(2).build().unwrap(),
- make_fake_category_transfer_builder(2).from_category_id(1).to_category_id(0).quantity(4).build().unwrap(),
+ let buckets = [make_fake_bucket(0), make_fake_bucket(1)];
+ let bucket_transfers = [
+ make_fake_bucket_transfer_builder(0).from_bucket_id(0).to_bucket_id(1).quantity(1).build().unwrap(),
+ make_fake_bucket_transfer_builder(1).from_bucket_id(0).to_bucket_id(1).quantity(2).build().unwrap(),
+ make_fake_bucket_transfer_builder(2).from_bucket_id(1).to_bucket_id(0).quantity(4).build().unwrap(),
];
- let _ = queries::categories::insert_categories(&categories, connection);
- let _ = queries::category_transfers::insert_category_transfers(&category_transfers, connection).unwrap();
+ let _ = queries::buckets::insert_buckets(&buckets, connection);
+ let _ = queries::bucket_transfers::insert_bucket_transfers(&bucket_transfers, connection).unwrap();
- let sums = queries::category_transfers::sum_category_transfer_quantity_per_from_category_id(connection);
+ let sums = queries::bucket_transfers::sum_bucket_transfer_quantity_per_from_bucket_id(connection);
assert!(sums.is_ok());
let mut sums = sums.unwrap();
sums.sort_by_key(|sum| sum.0);
- assert_eq!(categories.len(), sums.len());
+ assert_eq!(buckets.len(), sums.len());
assert_eq!(3, sums[0].1);
assert_eq!(4, sums[1].1);
}
#[test]
-fn given_category_transfers_when_sum_quantity_per_to_category_id_then_returns_sum_per_to_category_id() {
+fn given_bucket_transfers_when_sum_quantity_per_to_bucket_id_then_returns_sum_per_to_bucket_id() {
let context = TestContext::new();
let connection = &mut SqliteConnection::establish(&context.db_url).unwrap();
- let categories = [make_fake_category(0), make_fake_category(1)];
- let category_transfers = [
- make_fake_category_transfer_builder(0).from_category_id(0).to_category_id(1).quantity(1).build().unwrap(),
- make_fake_category_transfer_builder(1).from_category_id(0).to_category_id(1).quantity(2).build().unwrap(),
- make_fake_category_transfer_builder(2).from_category_id(1).to_category_id(0).quantity(4).build().unwrap(),
+ let buckets = [make_fake_bucket(0), make_fake_bucket(1)];
+ let bucket_transfers = [
+ make_fake_bucket_transfer_builder(0).from_bucket_id(0).to_bucket_id(1).quantity(1).build().unwrap(),
+ make_fake_bucket_transfer_builder(1).from_bucket_id(0).to_bucket_id(1).quantity(2).build().unwrap(),
+ make_fake_bucket_transfer_builder(2).from_bucket_id(1).to_bucket_id(0).quantity(4).build().unwrap(),
];
- let _ = queries::categories::insert_categories(&categories, connection);
- let _ = queries::category_transfers::insert_category_transfers(&category_transfers, connection).unwrap();
+ let _ = queries::buckets::insert_buckets(&buckets, connection);
+ let _ = queries::bucket_transfers::insert_bucket_transfers(&bucket_transfers, connection).unwrap();
- let sums = queries::category_transfers::sum_category_transfer_quantity_per_to_category_id(connection);
+ let sums = queries::bucket_transfers::sum_bucket_transfer_quantity_per_to_bucket_id(connection);
assert!(sums.is_ok());
let mut sums = sums.unwrap();
sums.sort_by_key(|sum| sum.0);
- assert_eq!(categories.len(), sums.len());
+ assert_eq!(buckets.len(), sums.len());
assert_eq!(4, sums[0].1);
assert_eq!(3, sums[1].1);
}
diff --git a/schist_core/schist_queries/tests/transaction_categorisations.rs b/schist_core/schist_queries/tests/transaction_categorisations.rs
index 13864b4..bb88896 100644
--- a/schist_core/schist_queries/tests/transaction_categorisations.rs
+++ b/schist_core/schist_queries/tests/transaction_categorisations.rs
@@ -2,8 +2,8 @@ mod common;
use common::test_context::TestContext;
use diesel::{Connection, SqliteConnection};
-use schist_fakes::{account::make_fake_account, category::make_fake_category, transaction::make_fake_transaction_builder, transaction_categorisation::make_fake_transaction_categorisation_builder};
-use schist_models::{account::Account, category::Category, transaction::Transaction};
+use schist_fakes::{account::make_fake_account, bucket::make_fake_bucket, transaction::make_fake_transaction_builder, transaction_categorisation::make_fake_transaction_categorisation_builder};
+use schist_models::{account::Account, bucket::Bucket, transaction::Transaction};
use schist_queries as queries;
fn given_accounts(connection: &mut SqliteConnection) -> Vec<Account> {
@@ -12,10 +12,10 @@ fn given_accounts(connection: &mut SqliteConnection) -> Vec<Account> {
accounts
}
-fn given_categories(connection: &mut SqliteConnection) -> Vec<Category> {
- let categories = vec![make_fake_category(0), make_fake_category(1)];
- let _ = queries::categories::insert_categories(&categories, connection);
- categories
+fn given_buckets(connection: &mut SqliteConnection) -> Vec<Bucket> {
+ let buckets = vec![make_fake_bucket(0), make_fake_bucket(1)];
+ let _ = queries::buckets::insert_buckets(&buckets, connection);
+ buckets
}
fn given_transactions(connection: &mut SqliteConnection) -> Vec<Transaction> {
@@ -32,11 +32,11 @@ fn when_insert_transaction_categorisations_then_returns_num_transaction_categori
let context = TestContext::new();
let connection = &mut SqliteConnection::establish(&context.db_url).unwrap();
given_accounts(connection);
- given_categories(connection);
+ given_buckets(connection);
given_transactions(connection);
let transaction_categorisations = [
- make_fake_transaction_categorisation_builder(0).category_id(0).build().unwrap(),
- make_fake_transaction_categorisation_builder(1).category_id(0).build().unwrap(),
+ make_fake_transaction_categorisation_builder(0).bucket_id(0).build().unwrap(),
+ make_fake_transaction_categorisation_builder(1).bucket_id(0).build().unwrap(),
];
let num_transaction_categorisations_inserted = queries::transaction_categorisations::insert_transaction_categorisations(&transaction_categorisations, connection).unwrap();
@@ -49,11 +49,11 @@ fn given_transaction_categorisations_when_get_all_transaction_categorisations_th
let context = TestContext::new();
let connection = &mut SqliteConnection::establish(&context.db_url).unwrap();
given_accounts(connection);
- given_categories(connection);
+ given_buckets(connection);
given_transactions(connection);
let transaction_categorisations = [
- make_fake_transaction_categorisation_builder(0).category_id(0).build().unwrap(),
- make_fake_transaction_categorisation_builder(1).category_id(0).build().unwrap(),
+ make_fake_transaction_categorisation_builder(0).bucket_id(0).build().unwrap(),
+ make_fake_transaction_categorisation_builder(1).bucket_id(0).build().unwrap(),
];
let _ = queries::transaction_categorisations::insert_transaction_categorisations(&transaction_categorisations, connection);
@@ -73,11 +73,11 @@ fn given_transaction_categorisations_when_delete_all_transaction_categorisations
let context = TestContext::new();
let connection = &mut SqliteConnection::establish(&context.db_url).unwrap();
given_accounts(connection);
- given_categories(connection);
+ given_buckets(connection);
given_transactions(connection);
let transaction_categorisations = [
- make_fake_transaction_categorisation_builder(0).category_id(0).build().unwrap(),
- make_fake_transaction_categorisation_builder(1).category_id(0).build().unwrap(),
+ make_fake_transaction_categorisation_builder(0).bucket_id(0).build().unwrap(),
+ make_fake_transaction_categorisation_builder(1).bucket_id(0).build().unwrap(),
];
let _ = queries::transaction_categorisations::insert_transaction_categorisations(&transaction_categorisations, connection);
@@ -91,11 +91,11 @@ fn given_deleted_transaction_categorisations_when_get_all_transaction_categorisa
let context = TestContext::new();
let connection = &mut SqliteConnection::establish(&context.db_url).unwrap();
given_accounts(connection);
- given_categories(connection);
+ given_buckets(connection);
given_transactions(connection);
let transaction_categorisations = [
- make_fake_transaction_categorisation_builder(0).category_id(0).build().unwrap(),
- make_fake_transaction_categorisation_builder(1).category_id(0).build().unwrap(),
+ make_fake_transaction_categorisation_builder(0).bucket_id(0).build().unwrap(),
+ make_fake_transaction_categorisation_builder(1).bucket_id(0).build().unwrap(),
];
let _ = queries::transaction_categorisations::insert_transaction_categorisations(&transaction_categorisations, connection);
let _ = queries::transaction_categorisations::delete_all_transaction_categorisations(connection);
@@ -106,25 +106,25 @@ fn given_deleted_transaction_categorisations_when_get_all_transaction_categorisa
}
#[test]
-fn given_transaction_categorisations_when_sum_quantity_per_category_id_then_returns_sum_quantity_per_category_id() {
+fn given_transaction_categorisations_when_sum_quantity_per_bucket_id_then_returns_sum_quantity_per_bucket_id() {
let context = TestContext::new();
let connection = &mut SqliteConnection::establish(&context.db_url).unwrap();
given_accounts(connection);
- let categories = given_categories(connection);
+ let buckets = given_buckets(connection);
given_transactions(connection);
let transaction_categorisations = [
- make_fake_transaction_categorisation_builder(0).category_id(0).quantity(1).build().unwrap(),
- make_fake_transaction_categorisation_builder(1).category_id(0).quantity(2).build().unwrap(),
- make_fake_transaction_categorisation_builder(2).category_id(1).quantity(4).build().unwrap(),
+ make_fake_transaction_categorisation_builder(0).bucket_id(0).quantity(1).build().unwrap(),
+ make_fake_transaction_categorisation_builder(1).bucket_id(0).quantity(2).build().unwrap(),
+ make_fake_transaction_categorisation_builder(2).bucket_id(1).quantity(4).build().unwrap(),
];
let _ = queries::transaction_categorisations::insert_transaction_categorisations(&transaction_categorisations, connection);
- let sums = queries::transaction_categorisations::sum_transaction_categorisation_quantity_per_category_id(connection);
+ let sums = queries::transaction_categorisations::sum_transaction_categorisation_quantity_per_bucket_id(connection);
assert!(sums.is_ok());
let mut sums = sums.unwrap();
sums.sort_by_key(|sum| sum.0);
- assert_eq!(categories.len(), sums.len());
+ assert_eq!(buckets.len(), sums.len());
assert_eq!(3, sums[0].1);
assert_eq!(4, sums[1].1);
}
diff --git a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/src/schist_state.rs b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/src/schist_state.rs
index 370a0e8..a6c850e 100644
--- a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/src/schist_state.rs
+++ b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/src/schist_state.rs
@@ -1,28 +1,28 @@
use anyhow::Result;
use diesel::SqliteConnection;
use schist_models::{
- account::Account, account_transfer::AccountTransfer, budget_drip::BudgetDrip, category::Category, category_transfer::CategoryTransfer, date_utc::DateUtc, transaction::Transaction, transaction_categorisation::TransactionCategorisation
+ account::Account, account_transfer::AccountTransfer, budget_drip::BudgetDrip, bucket::Bucket, bucket_transfer::BucketTransfer, date_utc::DateUtc, transaction::Transaction, transaction_categorisation::TransactionCategorisation
};
pub struct SchistState {
pub first_transaction_date: DateUtc,
pub accounts: Vec<Account>,
pub account_transfers: Vec<AccountTransfer>,
- pub categories: Vec<Category>,
+ pub buckets: Vec<Bucket>,
pub budget_drips: Vec<BudgetDrip>,
pub transactions: Vec<Transaction>,
pub transaction_categorisations: Vec<TransactionCategorisation>,
- pub category_transfers: Vec<CategoryTransfer>,
+ pub bucket_transfers: Vec<BucketTransfer>,
}
pub fn export_schist_state(schist_state: &SchistState, schist_connection: &mut SqliteConnection) -> Result<()> {
schist_queries::clear::clear(schist_connection)?;
schist_queries::accounts::insert_accounts(&schist_state.accounts, schist_connection)?;
schist_queries::account_transfers::insert_account_transfers(&schist_state.account_transfers, schist_connection)?;
- schist_queries::categories::insert_categories(&schist_state.categories, schist_connection)?;
+ schist_queries::buckets::insert_buckets(&schist_state.buckets, schist_connection)?;
schist_queries::budget_drips::insert_budget_drips(&schist_state.budget_drips, schist_connection)?;
schist_queries::transactions::insert_transactions(&schist_state.transactions, schist_connection)?;
schist_queries::transaction_categorisations::insert_transaction_categorisations(&schist_state.transaction_categorisations, schist_connection)?;
- schist_queries::category_transfers::insert_category_transfers(&schist_state.category_transfers, schist_connection)?;
+ schist_queries::bucket_transfers::insert_bucket_transfers(&schist_state.bucket_transfers, schist_connection)?;
Ok(())
}
diff --git a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/src/transform_state/transform_budget_drips.rs b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/src/transform_state/transform_budget_drips.rs
index 1163e56..01289a0 100644
--- a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/src/transform_state/transform_budget_drips.rs
+++ b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/src/transform_state/transform_budget_drips.rs
@@ -58,7 +58,7 @@ fn map_actualbudget_zero_budget_to_budget_drips(
let budget_drips: Vec<BudgetDrip> = days_in_month.iter().map(|&date|
BudgetDrip {
id: transform_budget_drip_id(&actualbudget_zero_budget, &date),
- category_id: transform_id(&actualbudget_zero_budget.category_id),
+ bucket_id: transform_id(&actualbudget_zero_budget.category_id),
date,
quantity: if date == first_day_of_month {
quantity + remainder_quantity
@@ -277,28 +277,28 @@ mod test {
let budget_drips_jan_category_0: Vec<&BudgetDrip> = budget_drips
.iter()
- .filter(|bd| bd.category_id == category_0_id && bd.date.month() == 1)
+ .filter(|bd| bd.bucket_id == category_0_id && bd.date.month() == 1)
.collect();
assert_eq!(31, budget_drips_jan_category_0.len());
assert!(budget_drips_jan_category_0.iter().all(|bd| bd.quantity == 100));
let budget_drips_jan_category_1: Vec<&BudgetDrip> = budget_drips
.iter()
- .filter(|bd| bd.category_id == category_1_id && bd.date.month() == 1)
+ .filter(|bd| bd.bucket_id == category_1_id && bd.date.month() == 1)
.collect();
assert_eq!(31, budget_drips_jan_category_1.len());
assert!(budget_drips_jan_category_1.iter().all(|bd| bd.quantity == 200));
let budget_drips_feb_category_0: Vec<&BudgetDrip> = budget_drips
.iter()
- .filter(|bd| bd.category_id == category_0_id && bd.date.month() == 2)
+ .filter(|bd| bd.bucket_id == category_0_id && bd.date.month() == 2)
.collect();
assert_eq!(29, budget_drips_feb_category_0.len());
assert!(budget_drips_feb_category_0.iter().all(|bd| bd.quantity == 110));
let budget_drips_feb_category_1: Vec<&BudgetDrip> = budget_drips
.iter()
- .filter(|bd| bd.category_id == category_1_id && bd.date.month() == 2)
+ .filter(|bd| bd.bucket_id == category_1_id && bd.date.month() == 2)
.collect();
assert_eq!(29, budget_drips_feb_category_1.len());
assert!(budget_drips_feb_category_1.iter().all(|bd| bd.quantity == 210));
diff --git a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/src/transform_state/transform_categories.rs b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/src/transform_state/transform_categories.rs
index 17ce194..2a21860 100644
--- a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/src/transform_state/transform_categories.rs
+++ b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/src/transform_state/transform_categories.rs
@@ -1,6 +1,6 @@
use actualbudget_models::{ActualbudgetCategory, ActualbudgetZeroBudget};
use itertools::Itertools;
-use schist_models::{budget_period_unit::BudgetPeriodUnit, category::Category, date_utc::DateUtc};
+use schist_models::{budget_period_unit::BudgetPeriodUnit, bucket::Bucket, date_utc::DateUtc};
use super::transform_id;
@@ -8,7 +8,7 @@ pub fn transform_categories(
actualbudget_categories: &[ActualbudgetCategory],
actualbudget_zero_budgets: &[ActualbudgetZeroBudget],
before_first_activity: &DateUtc,
-) -> Vec<Category> {
+) -> Vec<Bucket> {
let last_non_zero_month = actualbudget_zero_budgets
.iter()
.map(|zb| zb.month.clone())
@@ -28,7 +28,7 @@ pub fn transform_categories(
actualbudget_zero_budgets
};
- actualbudget_categories.iter().map(|actualbudget_category| Category {
+ actualbudget_categories.iter().map(|actualbudget_category| Bucket {
id: transform_id(&actualbudget_category.id.clone()),
name: actualbudget_category.name.clone(),
balance: 0,
@@ -36,6 +36,7 @@ pub fn transform_categories(
budget_period: 1,
budget_period_unit: BudgetPeriodUnit::Month,
budget_quantity: get_budget_quantity(actualbudget_category, actualbudget_zero_budgets),
+ group: String::from("un-named group"),
}).collect()
}
@@ -75,20 +76,20 @@ mod test {
];
let before_first_transaction = DateUtc::now();
- let categories = transform_categories(
+ let buckets = transform_categories(
&actualbudget_categories,
&actualbudget_zero_budgets,
&before_first_transaction,
);
- assert_eq!(1, categories.len());
- let category = categories.get(0).unwrap();
- assert_eq!("Food", category.name);
- assert_eq!(0, category.balance);
- assert_eq!(before_first_transaction, category.balance_date);
- assert_eq!(1, category.budget_period);
- assert_eq!(BudgetPeriodUnit::Month, category.budget_period_unit);
- assert_eq!(100, category.budget_quantity);
+ assert_eq!(1, buckets.len());
+ let bucket = buckets.get(0).unwrap();
+ assert_eq!("Food", bucket.name);
+ assert_eq!(0, bucket.balance);
+ assert_eq!(before_first_transaction, bucket.balance_date);
+ assert_eq!(1, bucket.budget_period);
+ assert_eq!(BudgetPeriodUnit::Month, bucket.budget_period_unit);
+ assert_eq!(100, bucket.budget_quantity);
}
#[test]
@@ -99,20 +100,20 @@ mod test {
let actualbudget_zero_budgets = [];
let before_first_transaction = DateUtc::now();
- let categories = transform_categories(
+ let buckets = transform_categories(
&actualbudget_categories,
&actualbudget_zero_budgets,
&before_first_transaction,
);
- assert_eq!(1, categories.len());
- let category = categories.get(0).unwrap();
- assert_eq!("Food", category.name);
- assert_eq!(0, category.balance);
- assert_eq!(before_first_transaction, category.balance_date);
- assert_eq!(1, category.budget_period);
- assert_eq!(BudgetPeriodUnit::Month, category.budget_period_unit);
- assert_eq!(0, category.budget_quantity);
+ assert_eq!(1, buckets.len());
+ let bucket = buckets.get(0).unwrap();
+ assert_eq!("Food", bucket.name);
+ assert_eq!(0, bucket.balance);
+ assert_eq!(before_first_transaction, bucket.balance_date);
+ assert_eq!(1, bucket.budget_period);
+ assert_eq!(BudgetPeriodUnit::Month, bucket.budget_period_unit);
+ assert_eq!(0, bucket.budget_quantity);
}
#[test]
@@ -130,20 +131,20 @@ mod test {
];
let before_first_transaction = DateUtc::now();
- let categories = transform_categories(
+ let buckets = transform_categories(
&actualbudget_categories,
&actualbudget_zero_budgets,
&before_first_transaction,
);
- assert_eq!(1, categories.len());
- let category = categories.get(0).unwrap();
- assert_eq!("Food", category.name);
- assert_eq!(0, category.balance);
- assert_eq!(before_first_transaction, category.balance_date);
- assert_eq!(1, category.budget_period);
- assert_eq!(BudgetPeriodUnit::Month, category.budget_period_unit);
- assert_eq!(300, category.budget_quantity);
+ assert_eq!(1, buckets.len());
+ let bucket = buckets.get(0).unwrap();
+ assert_eq!("Food", bucket.name);
+ assert_eq!(0, bucket.balance);
+ assert_eq!(before_first_transaction, bucket.balance_date);
+ assert_eq!(1, bucket.budget_period);
+ assert_eq!(BudgetPeriodUnit::Month, bucket.budget_period_unit);
+ assert_eq!(300, bucket.budget_quantity);
}
#[test]
@@ -169,36 +170,36 @@ mod test {
];
let before_first_transaction = DateUtc::now();
- let categories = transform_categories(
+ let buckets = transform_categories(
&actualbudget_categories,
&actualbudget_zero_budgets,
&before_first_transaction,
);
- assert_eq!(3, categories.len());
-
- let category_0 = categories.iter().filter(|c| c.id == transform_id("0")).last().unwrap();
- assert_eq!("Food", category_0.name);
- assert_eq!(0, category_0.balance);
- assert_eq!(before_first_transaction, category_0.balance_date);
- assert_eq!(1, category_0.budget_period);
- assert_eq!(BudgetPeriodUnit::Month, category_0.budget_period_unit);
- assert_eq!(300, category_0.budget_quantity);
-
- let category_1 = categories.iter().filter(|c| c.id == transform_id("1")).last().unwrap();
- assert_eq!("Clothes", category_1.name);
- assert_eq!(0, category_1.balance);
- assert_eq!(before_first_transaction, category_1.balance_date);
- assert_eq!(1, category_1.budget_period);
- assert_eq!(BudgetPeriodUnit::Month, category_1.budget_period_unit);
- assert_eq!(310, category_1.budget_quantity);
-
- let category_2 = categories.iter().filter(|c| c.id == transform_id("2")).last().unwrap();
- assert_eq!("Rent", category_2.name);
- assert_eq!(0, category_2.balance);
- assert_eq!(before_first_transaction, category_2.balance_date);
- assert_eq!(1, category_2.budget_period);
- assert_eq!(BudgetPeriodUnit::Month, category_2.budget_period_unit);
- assert_eq!(320, category_2.budget_quantity);
+ assert_eq!(3, buckets.len());
+
+ let bucket_0 = buckets.iter().filter(|c| c.id == transform_id("0")).last().unwrap();
+ assert_eq!("Food", bucket_0.name);
+ assert_eq!(0, bucket_0.balance);
+ assert_eq!(before_first_transaction, bucket_0.balance_date);
+ assert_eq!(1, bucket_0.budget_period);
+ assert_eq!(BudgetPeriodUnit::Month, bucket_0.budget_period_unit);
+ assert_eq!(300, bucket_0.budget_quantity);
+
+ let bucket_1 = buckets.iter().filter(|c| c.id == transform_id("1")).last().unwrap();
+ assert_eq!("Clothes", bucket_1.name);
+ assert_eq!(0, bucket_1.balance);
+ assert_eq!(before_first_transaction, bucket_1.balance_date);
+ assert_eq!(1, bucket_1.budget_period);
+ assert_eq!(BudgetPeriodUnit::Month, bucket_1.budget_period_unit);
+ assert_eq!(310, bucket_1.budget_quantity);
+
+ let bucket_2 = buckets.iter().filter(|c| c.id == transform_id("2")).last().unwrap();
+ assert_eq!("Rent", bucket_2.name);
+ assert_eq!(0, bucket_2.balance);
+ assert_eq!(before_first_transaction, bucket_2.balance_date);
+ assert_eq!(1, bucket_2.budget_period);
+ assert_eq!(BudgetPeriodUnit::Month, bucket_2.budget_period_unit);
+ assert_eq!(320, bucket_2.budget_quantity);
}
}
diff --git a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/src/transform_state/transform_category_transfers.rs b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/src/transform_state/transform_category_transfers.rs
index 318e88c..11ed2e3 100644
--- a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/src/transform_state/transform_category_transfers.rs
+++ b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/src/transform_state/transform_category_transfers.rs
@@ -4,14 +4,14 @@ use actualbudget_models::{
};
use anyhow::{bail, Context, Result};
use itertools::Itertools;
-use schist_models::category_transfer::CategoryTransfer;
+use schist_models::bucket_transfer::BucketTransfer;
use super::{is_category_transfer, transform_id};
pub fn transform_category_transfers(
actualbudget_transactions: &[ActualbudgetTransaction],
actualbudget_category_transfers_account: &Option<ActualbudgetAccount>,
-) -> Result<Vec<CategoryTransfer>> {
+) -> Result<Vec<BucketTransfer>> {
let actualbudget_category_transfers = actualbudget_transactions
.iter()
.filter(|transaction|
@@ -32,7 +32,7 @@ pub fn transform_category_transfers(
.map(|pct| transform_category_transfer(pct, &actualbudget_child_category_transfers))
.filter_ok(Option::is_some)
.map_ok(Option::unwrap)
- .collect::<Result<Vec<CategoryTransfer>>>()
+ .collect::<Result<Vec<BucketTransfer>>>()
.with_context(|| "failed to transform category transfers")?
)
}
@@ -40,7 +40,7 @@ pub fn transform_category_transfers(
fn transform_category_transfer(
actualbudget_parent_category_transfer: &ActualbudgetTransaction,
actualbudget_child_category_transfers: &[ActualbudgetTransaction],
-) -> Result<Option<CategoryTransfer>> {
+) -> Result<Option<BucketTransfer>> {
transform_category_transfer_without_context(
actualbudget_parent_category_transfer,
actualbudget_child_category_transfers,
@@ -50,7 +50,7 @@ fn transform_category_transfer(
fn transform_category_transfer_without_context(
actualbudget_parent_category_transfer: &ActualbudgetTransaction,
actualbudget_child_category_transfers: &[ActualbudgetTransaction],
-) -> Result<Option<CategoryTransfer>> {
+) -> Result<Option<BucketTransfer>> {
let actualbudget_child_category_transfers = actualbudget_child_category_transfers
.iter()
.filter(|t|
@@ -100,15 +100,15 @@ fn transform_category_transfer_without_context(
bail!("actualbudget category transfer amounts did not sum to zero");
}
- Ok(Some(CategoryTransfer {
+ Ok(Some(BucketTransfer {
id: transform_id(&actualbudget_parent_category_transfer.id),
description: actualbudget_parent_category_transfer
.notes
.clone()
.unwrap_or_else(String::new),
quantity: to_transfer.amount.try_into().unwrap(),
- from_category_id,
- to_category_id,
+ from_bucket_id: from_category_id,
+ to_bucket_id: to_category_id,
}))
}
@@ -116,7 +116,7 @@ fn transform_category_transfer_without_context(
mod test {
use actualbudget_fakes::{actualbudget_account::make_fake_actualbudget_account, actualbudget_transaction::make_fake_actualbudget_transaction_builder};
use actualbudget_models::{ActualbudgetTransaction, ActualbudgetTransactionBuilder};
- use schist_models::category_transfer::CategoryTransfer;
+ use schist_models::bucket_transfer::BucketTransfer;
use crate::transform_state::transform_id::transform_id;
@@ -137,13 +137,13 @@ mod test {
);
assert!(result.is_ok());
- let category_transfers = result.unwrap();
- assert_eq!(1, category_transfers.len());
- let category_transfer = category_transfers.get(0).unwrap();
- assert_eq!(100, category_transfer.quantity);
- assert_eq!("I was a parent transaction", category_transfer.description);
- assert_eq!(transform_id("0"), category_transfer.from_category_id);
- assert_eq!(transform_id("1"), category_transfer.to_category_id);
+ let bucket_transfers = result.unwrap();
+ assert_eq!(1, bucket_transfers.len());
+ let bucket_transfer = bucket_transfers.get(0).unwrap();
+ assert_eq!(100, bucket_transfer.quantity);
+ assert_eq!("I was a parent transaction", bucket_transfer.description);
+ assert_eq!(transform_id("0"), bucket_transfer.from_bucket_id);
+ assert_eq!(transform_id("1"), bucket_transfer.to_bucket_id);
}
#[test]
@@ -166,26 +166,26 @@ mod test {
);
assert!(result.is_ok());
- let category_transfers = result.unwrap();
- assert_eq!(2, category_transfers.len());
+ let bucket_transfers = result.unwrap();
+ assert_eq!(2, bucket_transfers.len());
- let category_transfer_0: Vec<&CategoryTransfer> = category_transfers
+ let bucket_transfer_0: Vec<&BucketTransfer> = bucket_transfers
.iter()
.filter(|ct| ct.quantity == 100)
.collect();
- assert_eq!(1, category_transfer_0.len());
- let category_transfer_0 = category_transfer_0.get(0).unwrap();
- assert_eq!(transform_id("0"), category_transfer_0.from_category_id);
- assert_eq!(transform_id("1"), category_transfer_0.to_category_id);
+ assert_eq!(1, bucket_transfer_0.len());
+ let bucket_transfer_0 = bucket_transfer_0.get(0).unwrap();
+ assert_eq!(transform_id("0"), bucket_transfer_0.from_bucket_id);
+ assert_eq!(transform_id("1"), bucket_transfer_0.to_bucket_id);
- let category_transfer_1: Vec<&CategoryTransfer> = category_transfers
+ let bucket_transfer_1: Vec<&BucketTransfer> = bucket_transfers
.iter()
.filter(|ct| ct.quantity == 200)
.collect();
- assert_eq!(1, category_transfer_1.len());
- let category_transfer_1 = category_transfer_1.get(0).unwrap();
- assert_eq!(transform_id("1"), category_transfer_1.from_category_id);
- assert_eq!(transform_id("0"), category_transfer_1.to_category_id);
+ assert_eq!(1, bucket_transfer_1.len());
+ let bucket_transfer_1 = bucket_transfer_1.get(0).unwrap();
+ assert_eq!(transform_id("1"), bucket_transfer_1.from_bucket_id);
+ assert_eq!(transform_id("0"), bucket_transfer_1.to_bucket_id);
}
#[test]
diff --git a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/src/transform_state/transform_state.rs b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/src/transform_state/transform_state.rs
index 7c64e35..575e624 100644
--- a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/src/transform_state/transform_state.rs
+++ b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/src/transform_state/transform_state.rs
@@ -1,5 +1,5 @@
use anyhow::{bail, Context, Result};
-use schist_models::{account::Account, category::Category, category_transfer::CategoryTransfer, date_utc::DateUtc, transaction::Transaction, transaction_categorisation::TransactionCategorisation};
+use schist_models::{account::Account, bucket::Bucket, bucket_transfer::BucketTransfer, date_utc::DateUtc, transaction::Transaction, transaction_categorisation::TransactionCategorisation};
use crate::{actualbudget_state::ActualbudgetState, schist_state::SchistState};
@@ -24,7 +24,7 @@ fn transform_state_without_context(actualbudget_state: ActualbudgetState) -> Res
&first_activity_date,
);
let budget_drips = transform_budget_drips(&actualbudget_state.actualbudget_zero_budgets)?;
- let categories: Vec<Category> = transform_categories(
+ let buckets: Vec<Bucket> = transform_categories(
&actualbudget_state.actualbudget_categories,
&actualbudget_state.actualbudget_zero_budgets,
&before_first_activity_date,
@@ -35,7 +35,7 @@ fn transform_state_without_context(actualbudget_state: ActualbudgetState) -> Res
&actualbudget_state.actualbudget_category_transfers_account,
&actualbudget_state.actualbudget_payees,
)?;
- let category_transfers: Vec<CategoryTransfer> = transform_category_transfers(
+ let bucket_transfers: Vec<BucketTransfer> = transform_category_transfers(
&remaining_transactions,
&actualbudget_state.actualbudget_category_transfers_account,
)?;
@@ -44,11 +44,11 @@ fn transform_state_without_context(actualbudget_state: ActualbudgetState) -> Res
first_transaction_date: first_activity_date,
accounts,
account_transfers,
- categories,
+ buckets,
budget_drips,
transactions,
transaction_categorisations,
- category_transfers,
+ bucket_transfers,
})
}
diff --git a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/src/transform_state/transform_transactions.rs b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/src/transform_state/transform_transactions.rs
index f7fb098..f24e8b6 100644
--- a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/src/transform_state/transform_transactions.rs
+++ b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/src/transform_state/transform_transactions.rs
@@ -75,7 +75,7 @@ fn transform_transactions_without_context(
description: String::new(),
quantity: atomic_actualbudget_transaction.amount.try_into().unwrap(),
transaction_id,
- category_id: transform_id(&actualbudget_category_id),
+ bucket_id: transform_id(&actualbudget_category_id),
});
}
@@ -113,7 +113,7 @@ fn transform_transactions_without_context(
description: child_actualbudget_transaction.notes.clone().unwrap_or_else(String::new),
quantity: child_actualbudget_transaction.amount.try_into().unwrap(),
transaction_id,
- category_id: transform_id(&actualbudget_category_id),
+ bucket_id: transform_id(&actualbudget_category_id),
});
}
}
@@ -191,7 +191,7 @@ mod test {
assert_eq!("", transaction_categorisation.description);
assert_eq!(100, transaction_categorisation.quantity);
assert_eq!(transaction.id, transaction_categorisation.transaction_id);
- assert_eq!(transform_id("0"), transaction_categorisation.category_id);
+ assert_eq!(transform_id("0"), transaction_categorisation.bucket_id);
}
#[test]
@@ -238,7 +238,7 @@ mod test {
.last()
.unwrap();
assert_eq!(transaction.id, transaction_categorisation_0.transaction_id);
- assert_eq!(transform_id("0"), transaction_categorisation_0.category_id);
+ assert_eq!(transform_id("0"), transaction_categorisation_0.bucket_id);
assert_eq!("notes A", transaction_categorisation_0.description);
let transaction_categorisation_1 = transaction_categorisations
@@ -247,7 +247,7 @@ mod test {
.last()
.unwrap();
assert_eq!(transaction.id, transaction_categorisation_1.transaction_id);
- assert_eq!(transform_id("0"), transaction_categorisation_1.category_id);
+ assert_eq!(transform_id("0"), transaction_categorisation_1.bucket_id);
assert_eq!("notes B", transaction_categorisation_1.description);
}
}
diff --git a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/bucket_matchers.rs b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/bucket_matchers.rs
new file mode 100644
index 0000000..76189d3
--- /dev/null
+++ b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/bucket_matchers.rs
@@ -0,0 +1,34 @@
+use schist_models::{budget_period_unit::BudgetPeriodUnit, bucket::Bucket};
+
+use super::bucket_names::{BUCKET_NAMES, BUCKET_NAME_BILLS, BUCKET_NAME_BILLS_FLEXIBLE, BUCKET_NAME_FOOD, BUCKET_NAME_GENERAL, BUCKET_NAME_INCOME, BUCKET_NAME_SAVINGS, BUCKET_NAME_STARTING_BALANCES};
+
+pub fn get_bucket_matchers(
+) -> Vec<Box<dyn Fn(&Bucket) -> bool>> {
+ BUCKET_NAMES
+ .iter()
+ .map(|bucket_name| -> Box<dyn Fn(&Bucket) -> bool> {
+ Box::new(|c| matches_bucket(c, bucket_name))
+ }).collect()
+}
+
+fn matches_bucket(bucket: &Bucket, bucket_name: &str,) -> bool {
+ bucket.name == bucket_name
+ && bucket.balance == 0
+ && bucket.balance_date < "2024-08-01".parse().unwrap()
+ && bucket.budget_period == 1
+ && bucket.budget_period_unit == BudgetPeriodUnit::Month
+ && bucket.budget_quantity == get_expected_budget_quantity(bucket_name)
+}
+
+fn get_expected_budget_quantity(bucket_name: &str) -> i32 {
+ match bucket_name {
+ BUCKET_NAME_FOOD => 200_00,
+ BUCKET_NAME_GENERAL => 100_00,
+ BUCKET_NAME_BILLS => 125_00,
+ BUCKET_NAME_BILLS_FLEXIBLE => 25_00,
+ BUCKET_NAME_SAVINGS => 400_00,
+ BUCKET_NAME_STARTING_BALANCES => 0,
+ BUCKET_NAME_INCOME => 0,
+ _ => panic!("unexpected bucket name {}", bucket_name),
+ }
+}
diff --git a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/bucket_names.rs b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/bucket_names.rs
new file mode 100644
index 0000000..5f232a8
--- /dev/null
+++ b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/bucket_names.rs
@@ -0,0 +1,37 @@
+pub const BUCKET_NAME_FOOD: &str = "Food";
+pub const BUCKET_NAME_GENERAL: &str = "General";
+pub const BUCKET_NAME_BILLS: &str = "Bills";
+pub const BUCKET_NAME_BILLS_FLEXIBLE: &str = "Bills (Flexible)";
+pub const BUCKET_NAME_SAVINGS: &str = "Savings";
+pub const BUCKET_NAME_STARTING_BALANCES: &str = "Starting Balances";
+pub const BUCKET_NAME_INCOME: &str = "Income";
+
+pub const BUCKET_NAMES: &[&'static str] = &[
+ BUCKET_NAME_FOOD,
+ BUCKET_NAME_GENERAL,
+ BUCKET_NAME_BILLS,
+ BUCKET_NAME_BILLS_FLEXIBLE,
+ BUCKET_NAME_SAVINGS,
+ BUCKET_NAME_STARTING_BALANCES,
+ BUCKET_NAME_INCOME,
+];
+
+pub struct BucketNamesDict {
+ pub food: &'static str,
+ pub general: &'static str,
+ pub bills: &'static str,
+ pub bills_flexible: &'static str,
+ pub savings: &'static str,
+ pub starting_balances: &'static str,
+ pub income: &'static str,
+}
+
+pub const BUCKET_NAMES_DICT: BucketNamesDict = BucketNamesDict {
+ food: BUCKET_NAME_FOOD,
+ general: BUCKET_NAME_GENERAL,
+ bills: BUCKET_NAME_BILLS,
+ bills_flexible: BUCKET_NAME_BILLS_FLEXIBLE,
+ savings: BUCKET_NAME_SAVINGS,
+ starting_balances: BUCKET_NAME_STARTING_BALANCES,
+ income: BUCKET_NAME_INCOME,
+};
diff --git a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/bucket_transfer_matchers.rs b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/bucket_transfer_matchers.rs
new file mode 100644
index 0000000..3b46d76
--- /dev/null
+++ b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/bucket_transfer_matchers.rs
@@ -0,0 +1,38 @@
+use schist_models::{bucket::Bucket, bucket_transfer::BucketTransfer};
+
+use super::bucket_names::{BUCKET_NAME_GENERAL, BUCKET_NAME_SAVINGS};
+
+pub fn get_bucket_transfer_matchers(
+) -> Vec<Box<dyn Fn(&BucketTransfer, &[Bucket]) -> bool>> {
+ vec![
+ Box::new(|ct, c| matches_120_savings_to_general_23_oct_2024(ct, c)),
+ ]
+}
+
+fn matches_120_savings_to_general_23_oct_2024(
+ bucket_transfer: &BucketTransfer,
+ buckets: &[Bucket],
+) -> bool {
+ let savings_bucket = buckets
+ .iter()
+ .find(|c| c.name == BUCKET_NAME_SAVINGS)
+ .expect("failed to find savings bucket");
+
+ let general_bucket = buckets
+ .iter()
+ .find(|c| c.name == BUCKET_NAME_GENERAL)
+ .expect("failed to find general bucket");
+
+ match bucket_transfer {
+ BucketTransfer {
+ id: _id,
+ description,
+ quantity: 120_00,
+ from_bucket_id,
+ to_bucket_id,
+ } => *from_bucket_id == savings_bucket.id
+ && *to_bucket_id == general_bucket.id
+ && description.as_str() == "",
+ _ => false,
+ }
+}
diff --git a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/budget_drip_matchers.rs b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/budget_drip_matchers.rs
index 04be584..97f81a2 100644
--- a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/budget_drip_matchers.rs
+++ b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/budget_drip_matchers.rs
@@ -1,19 +1,19 @@
use std::sync::LazyLock;
-use schist_models::{budget_drip::BudgetDrip, category::Category, date_utc::DateUtc};
+use schist_models::{budget_drip::BudgetDrip, bucket::Bucket, date_utc::DateUtc};
use schist_traits::dateable::Dateable;
-use crate::common::category_names::{CATEGORY_NAME_BILLS, CATEGORY_NAME_BILLS_FLEXIBLE, CATEGORY_NAME_FOOD, CATEGORY_NAME_GENERAL, CATEGORY_NAME_SAVINGS};
+use crate::common::bucket_names::{BUCKET_NAME_BILLS, BUCKET_NAME_BILLS_FLEXIBLE, BUCKET_NAME_FOOD, BUCKET_NAME_GENERAL, BUCKET_NAME_SAVINGS};
pub fn get_num_expected_budget_drips() -> usize {
let num_expected_dates = DATES.len();
- let num_expected_categories = 5;
- num_expected_dates * num_expected_categories
+ let num_expected_buckets = 5;
+ num_expected_dates * num_expected_buckets
}
pub fn assert_budget_drip_matches(
budget_drip: &BudgetDrip,
- categories: &[Category],
+ buckets: &[Bucket],
) {
assert!(
DATES.iter().any(|date| *LazyLock::force(date) == budget_drip.date),
@@ -21,55 +21,55 @@ pub fn assert_budget_drip_matches(
budget_drip,
);
- let category_name = categories
+ let bucket_name = buckets
.iter()
- .find(|c| c.id == budget_drip.category_id)
+ .find(|c| c.id == budget_drip.bucket_id)
.map(|c| c.name.clone())
.expect(format!(
- "budget drip {:?} had unexpected category ID. categories were: {:?}",
+ "budget drip {:?} had unexpected bucket ID. buckets were: {:?}",
budget_drip,
- categories,
+ buckets,
).as_str());
let expected_quantity = match (
- category_name.as_str(),
+ bucket_name.as_str(),
budget_drip.date.month(),
budget_drip.date.day(),
) {
- (CATEGORY_NAME_FOOD, 8 | 10, 1) => 6_50,
- (CATEGORY_NAME_FOOD, 8 | 10, _) => 6_45,
- (CATEGORY_NAME_FOOD, 9 | 11, 1) => 6_86,
- (CATEGORY_NAME_FOOD, 9 | 11, _) => 6_66,
- (CATEGORY_NAME_FOOD, _, _) => panic!("budget drip {:?} had unexpected date", budget_drip),
+ (BUCKET_NAME_FOOD, 8 | 10, 1) => 6_50,
+ (BUCKET_NAME_FOOD, 8 | 10, _) => 6_45,
+ (BUCKET_NAME_FOOD, 9 | 11, 1) => 6_86,
+ (BUCKET_NAME_FOOD, 9 | 11, _) => 6_66,
+ (BUCKET_NAME_FOOD, _, _) => panic!("budget drip {:?} had unexpected date", budget_drip),
- (CATEGORY_NAME_GENERAL, 8 | 10, 1) => 3_40,
- (CATEGORY_NAME_GENERAL, 8 | 10, _) => 3_22,
- (CATEGORY_NAME_GENERAL, 9 | 11, 1) => 3_43,
- (CATEGORY_NAME_GENERAL, 9 | 11, _) => 3_33,
- (CATEGORY_NAME_GENERAL, _, _) => panic!("budget drip {:?} had unexpected date", budget_drip),
+ (BUCKET_NAME_GENERAL, 8 | 10, 1) => 3_40,
+ (BUCKET_NAME_GENERAL, 8 | 10, _) => 3_22,
+ (BUCKET_NAME_GENERAL, 9 | 11, 1) => 3_43,
+ (BUCKET_NAME_GENERAL, 9 | 11, _) => 3_33,
+ (BUCKET_NAME_GENERAL, _, _) => panic!("budget drip {:?} had unexpected date", budget_drip),
- (CATEGORY_NAME_BILLS, 8 | 10, 1) => 4_10,
- (CATEGORY_NAME_BILLS, 8 | 10, _) => 4_03,
- (CATEGORY_NAME_BILLS, 9 | 11, 1) => 4_36,
- (CATEGORY_NAME_BILLS, 9 | 11, _) => 4_16,
- (CATEGORY_NAME_BILLS, _, _) => panic!("budget drip {:?} had unexpected date", budget_drip),
+ (BUCKET_NAME_BILLS, 8 | 10, 1) => 4_10,
+ (BUCKET_NAME_BILLS, 8 | 10, _) => 4_03,
+ (BUCKET_NAME_BILLS, 9 | 11, 1) => 4_36,
+ (BUCKET_NAME_BILLS, 9 | 11, _) => 4_16,
+ (BUCKET_NAME_BILLS, _, _) => panic!("budget drip {:?} had unexpected date", budget_drip),
- (CATEGORY_NAME_BILLS_FLEXIBLE, 8 | 10, 1) => 1_00,
- (CATEGORY_NAME_BILLS_FLEXIBLE, 8 | 10, _) => 80,
- (CATEGORY_NAME_BILLS_FLEXIBLE, 9 | 11, 1) => 93,
- (CATEGORY_NAME_BILLS_FLEXIBLE, 9 | 11, _) => 83,
- (CATEGORY_NAME_BILLS_FLEXIBLE, _, _) => panic!("budget drip {:?} had unexpected date", budget_drip),
+ (BUCKET_NAME_BILLS_FLEXIBLE, 8 | 10, 1) => 1_00,
+ (BUCKET_NAME_BILLS_FLEXIBLE, 8 | 10, _) => 80,
+ (BUCKET_NAME_BILLS_FLEXIBLE, 9 | 11, 1) => 93,
+ (BUCKET_NAME_BILLS_FLEXIBLE, 9 | 11, _) => 83,
+ (BUCKET_NAME_BILLS_FLEXIBLE, _, _) => panic!("budget drip {:?} had unexpected date", budget_drip),
- (CATEGORY_NAME_SAVINGS, 8 | 10, 1) => 13_00,
- (CATEGORY_NAME_SAVINGS, 8 | 10, _) => 12_90,
- (CATEGORY_NAME_SAVINGS, 9 | 11, 1) => 13_43,
- (CATEGORY_NAME_SAVINGS, 9 | 11, _) => 13_33,
- (CATEGORY_NAME_SAVINGS, _, _) => panic!("budget drip {:?} had unexpected date", budget_drip),
+ (BUCKET_NAME_SAVINGS, 8 | 10, 1) => 13_00,
+ (BUCKET_NAME_SAVINGS, 8 | 10, _) => 12_90,
+ (BUCKET_NAME_SAVINGS, 9 | 11, 1) => 13_43,
+ (BUCKET_NAME_SAVINGS, 9 | 11, _) => 13_33,
+ (BUCKET_NAME_SAVINGS, _, _) => panic!("budget drip {:?} had unexpected date", budget_drip),
(_, _, _) => panic!(
- "budget drip {:?} had unexpected category name {}",
+ "budget drip {:?} had unexpected bucket name {}",
budget_drip,
- category_name,
+ bucket_name,
),
};
diff --git a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/category_matchers.rs b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/category_matchers.rs
deleted file mode 100644
index 6660add..0000000
--- a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/category_matchers.rs
+++ /dev/null
@@ -1,34 +0,0 @@
-use schist_models::{budget_period_unit::BudgetPeriodUnit, category::Category};
-
-use super::category_names::{CATEGORY_NAMES, CATEGORY_NAME_BILLS, CATEGORY_NAME_BILLS_FLEXIBLE, CATEGORY_NAME_FOOD, CATEGORY_NAME_GENERAL, CATEGORY_NAME_INCOME, CATEGORY_NAME_SAVINGS, CATEGORY_NAME_STARTING_BALANCES};
-
-pub fn get_category_matchers(
-) -> Vec<Box<dyn Fn(&Category) -> bool>> {
- CATEGORY_NAMES
- .iter()
- .map(|category_name| -> Box<dyn Fn(&Category) -> bool> {
- Box::new(|c| matches_category(c, category_name))
- }).collect()
-}
-
-fn matches_category(category: &Category, category_name: &str,) -> bool {
- category.name == category_name
- && category.balance == 0
- && category.balance_date < "2024-08-01".parse().unwrap()
- && category.budget_period == 1
- && category.budget_period_unit == BudgetPeriodUnit::Month
- && category.budget_quantity == get_expected_budget_quantity(category_name)
-}
-
-fn get_expected_budget_quantity(category_name: &str) -> i32 {
- match category_name {
- CATEGORY_NAME_FOOD => 200_00,
- CATEGORY_NAME_GENERAL => 100_00,
- CATEGORY_NAME_BILLS => 125_00,
- CATEGORY_NAME_BILLS_FLEXIBLE => 25_00,
- CATEGORY_NAME_SAVINGS => 400_00,
- CATEGORY_NAME_STARTING_BALANCES => 0,
- CATEGORY_NAME_INCOME => 0,
- _ => panic!("unexpected category name {}", category_name),
- }
-}
diff --git a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/category_names.rs b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/category_names.rs
deleted file mode 100644
index 601f294..0000000
--- a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/category_names.rs
+++ /dev/null
@@ -1,37 +0,0 @@
-pub const CATEGORY_NAME_FOOD: &str = "Food";
-pub const CATEGORY_NAME_GENERAL: &str = "General";
-pub const CATEGORY_NAME_BILLS: &str = "Bills";
-pub const CATEGORY_NAME_BILLS_FLEXIBLE: &str = "Bills (Flexible)";
-pub const CATEGORY_NAME_SAVINGS: &str = "Savings";
-pub const CATEGORY_NAME_STARTING_BALANCES: &str = "Starting Balances";
-pub const CATEGORY_NAME_INCOME: &str = "Income";
-
-pub const CATEGORY_NAMES: &[&'static str] = &[
- CATEGORY_NAME_FOOD,
- CATEGORY_NAME_GENERAL,
- CATEGORY_NAME_BILLS,
- CATEGORY_NAME_BILLS_FLEXIBLE,
- CATEGORY_NAME_SAVINGS,
- CATEGORY_NAME_STARTING_BALANCES,
- CATEGORY_NAME_INCOME,
-];
-
-pub struct CategoryNamesDict {
- pub food: &'static str,
- pub general: &'static str,
- pub bills: &'static str,
- pub bills_flexible: &'static str,
- pub savings: &'static str,
- pub starting_balances: &'static str,
- pub income: &'static str,
-}
-
-pub const CATEGORY_NAMES_DICT: CategoryNamesDict = CategoryNamesDict {
- food: CATEGORY_NAME_FOOD,
- general: CATEGORY_NAME_GENERAL,
- bills: CATEGORY_NAME_BILLS,
- bills_flexible: CATEGORY_NAME_BILLS_FLEXIBLE,
- savings: CATEGORY_NAME_SAVINGS,
- starting_balances: CATEGORY_NAME_STARTING_BALANCES,
- income: CATEGORY_NAME_INCOME,
-};
diff --git a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/category_transfer_matchers.rs b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/category_transfer_matchers.rs
deleted file mode 100644
index 6d11c8a..0000000
--- a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/category_transfer_matchers.rs
+++ /dev/null
@@ -1,38 +0,0 @@
-use schist_models::{category::Category, category_transfer::CategoryTransfer};
-
-use super::category_names::{CATEGORY_NAME_GENERAL, CATEGORY_NAME_SAVINGS};
-
-pub fn get_category_transfer_matchers(
-) -> Vec<Box<dyn Fn(&CategoryTransfer, &[Category]) -> bool>> {
- vec![
- Box::new(|ct, c| matches_120_savings_to_general_23_oct_2024(ct, c)),
- ]
-}
-
-fn matches_120_savings_to_general_23_oct_2024(
- category_transfer: &CategoryTransfer,
- categories: &[Category],
-) -> bool {
- let savings_category = categories
- .iter()
- .find(|c| c.name == CATEGORY_NAME_SAVINGS)
- .expect("failed to find savings category");
-
- let general_category = categories
- .iter()
- .find(|c| c.name == CATEGORY_NAME_GENERAL)
- .expect("failed to find general category");
-
- match category_transfer {
- CategoryTransfer {
- id: _id,
- description,
- quantity: 120_00,
- from_category_id,
- to_category_id,
- } => *from_category_id == savings_category.id
- && *to_category_id == general_category.id
- && description.as_str() == "",
- _ => false,
- }
-}
diff --git a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/mod.rs b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/mod.rs
index c67f62e..62255b0 100644
--- a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/mod.rs
+++ b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/mod.rs
@@ -2,9 +2,9 @@ mod account_matchers;
mod account_names;
mod account_transfer_matchers;
mod budget_drip_matchers;
-mod category_matchers;
-mod category_names;
-mod category_transfer_matchers;
+mod bucket_matchers;
+mod bucket_names;
+mod bucket_transfer_matchers;
mod db_url;
mod test_context;
mod transaction_matchers;
@@ -15,9 +15,9 @@ pub use account_names::ACCOUNT_NAMES_DICT;
pub use account_transfer_matchers::get_account_transfer_matchers;
pub use budget_drip_matchers::assert_budget_drip_matches;
pub use budget_drip_matchers::get_num_expected_budget_drips;
-pub use category_names::CATEGORY_NAMES_DICT;
-pub use category_matchers::get_category_matchers;
-pub use category_transfer_matchers::get_category_transfer_matchers;
+pub use bucket_names::BUCKET_NAMES_DICT;
+pub use bucket_matchers::get_bucket_matchers;
+pub use bucket_transfer_matchers::get_bucket_transfer_matchers;
pub use db_url::TEST_IN_DB_URL;
pub use db_url::TEST_OUT_DB_URL;
pub use test_context::TestContext;
diff --git a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/transaction_categorisation_matchers.rs b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/transaction_categorisation_matchers.rs
index 04ce6a7..8082055 100644
--- a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/transaction_categorisation_matchers.rs
+++ b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/common/transaction_categorisation_matchers.rs
@@ -1,9 +1,9 @@
-use schist_models::{account::Account, category::Category, transaction::Transaction, transaction_categorisation::TransactionCategorisation};
+use schist_models::{account::Account, bucket::Bucket, transaction::Transaction, transaction_categorisation::TransactionCategorisation};
-use super::{category_names::{CATEGORY_NAME_FOOD, CATEGORY_NAME_INCOME, CATEGORY_NAME_STARTING_BALANCES}, matches_bank_account_initial_transaction, matches_cash_account_initial_transaction, matches_food_transaction, matches_income_transaction};
+use super::{bucket_names::{BUCKET_NAME_FOOD, BUCKET_NAME_INCOME, BUCKET_NAME_STARTING_BALANCES}, matches_bank_account_initial_transaction, matches_cash_account_initial_transaction, matches_food_transaction, matches_income_transaction};
pub fn get_transaction_categorisation_matchers(
-) -> Vec<Box<dyn Fn(&TransactionCategorisation, &[Transaction], &[Category], &[Account]) -> bool>> {
+) -> Vec<Box<dyn Fn(&TransactionCategorisation, &[Transaction], &[Bucket], &[Account]) -> bool>> {
vec![
Box::new(|tc, t, c, a| matches_bank_account_initial_transaction_categorisation(tc, t, c, a)),
Box::new(|tc, t, c, a| matches_cash_account_initial_transaction_categorisation(tc, t, c, a)),
@@ -21,7 +21,7 @@ pub fn get_transaction_categorisation_matchers(
fn matches_bank_account_initial_transaction_categorisation(
transaction_categorisation: &TransactionCategorisation,
transactions: &[Transaction],
- categories: &[Category],
+ buckets: &[Bucket],
accounts: &[Account],
) -> bool {
let bank_account_initial_transaction = transactions
@@ -29,10 +29,10 @@ fn matches_bank_account_initial_transaction_categorisation(
.find(|t| matches_bank_account_initial_transaction(t, accounts))
.expect("failed to find bank account initial transaction");
- let starting_balance_category = categories
+ let starting_balance_bucket = buckets
.iter()
- .find(|c| c.name == CATEGORY_NAME_STARTING_BALANCES)
- .expect("failed to find starting balance category");
+ .find(|c| c.name == BUCKET_NAME_STARTING_BALANCES)
+ .expect("failed to find starting balance bucket");
match transaction_categorisation {
TransactionCategorisation {
@@ -40,10 +40,10 @@ fn matches_bank_account_initial_transaction_categorisation(
description,
quantity: 1200_00,
transaction_id,
- category_id,
+ bucket_id,
} => description == ""
&& *transaction_id == bank_account_initial_transaction.id
- && *category_id == starting_balance_category.id,
+ && *bucket_id == starting_balance_bucket.id,
_ => false,
}
}
@@ -51,7 +51,7 @@ fn matches_bank_account_initial_transaction_categorisation(
fn matches_cash_account_initial_transaction_categorisation(
transaction_categorisation: &TransactionCategorisation,
transactions: &[Transaction],
- categories: &[Category],
+ buckets: &[Bucket],
accounts: &[Account],
) -> bool {
let cash_account_initial_transaction = transactions
@@ -59,10 +59,10 @@ fn matches_cash_account_initial_transaction_categorisation(
.find(|t| matches_cash_account_initial_transaction(t, accounts))
.expect("failed to find cash account initial transaction");
- let starting_balance_category = categories
+ let starting_balance_bucket = buckets
.iter()
- .find(|c| c.name == CATEGORY_NAME_STARTING_BALANCES)
- .expect("failed to find starting balance category");
+ .find(|c| c.name == BUCKET_NAME_STARTING_BALANCES)
+ .expect("failed to find starting balance bucket");
match transaction_categorisation {
TransactionCategorisation {
@@ -70,10 +70,10 @@ fn matches_cash_account_initial_transaction_categorisation(
description,
quantity: 45_10,
transaction_id,
- category_id,
+ bucket_id,
} => description == ""
&& *transaction_id == cash_account_initial_transaction.id
- && *category_id == starting_balance_category.id,
+ && *bucket_id == starting_balance_bucket.id,
_ => false,
}
}
@@ -81,7 +81,7 @@ fn matches_cash_account_initial_transaction_categorisation(
fn matches_income_transaction_categorisation(
transaction_categorisation: &TransactionCategorisation,
transactions: &[Transaction],
- categories: &[Category],
+ buckets: &[Bucket],
accounts: &[Account],
month: &str,
) -> bool {
@@ -90,10 +90,10 @@ fn matches_income_transaction_categorisation(
.find(|t| matches_income_transaction(t, accounts, month))
.expect(format!("failed to find income transaction for month {}", month).as_str());
- let income_category = categories
+ let income_bucket = buckets
.iter()
- .find(|c| c.name == CATEGORY_NAME_INCOME)
- .expect("failed to find income category");
+ .find(|c| c.name == BUCKET_NAME_INCOME)
+ .expect("failed to find income bucket");
match transaction_categorisation {
TransactionCategorisation {
@@ -101,10 +101,10 @@ fn matches_income_transaction_categorisation(
description,
quantity: 846_46,
transaction_id,
- category_id,
+ bucket_id,
} => description == ""
&& *transaction_id == income_transaction.id
- && *category_id == income_category.id,
+ && *bucket_id == income_bucket.id,
_ => false,
}
}
@@ -112,7 +112,7 @@ fn matches_income_transaction_categorisation(
fn matches_food_transaction_categorisation(
transaction_categorisation: &TransactionCategorisation,
transactions: &[Transaction],
- categories: &[Category],
+ buckets: &[Bucket],
accounts: &[Account],
month: &str,
) -> bool {
@@ -121,10 +121,10 @@ fn matches_food_transaction_categorisation(
.find(|t| matches_food_transaction(t, accounts, month))
.expect(format!("failed to find food transaction for month {}", month).as_str());
- let food_category = categories
+ let food_bucket = buckets
.iter()
- .find(|c| c.name == CATEGORY_NAME_FOOD)
- .expect("failed to find food category");
+ .find(|c| c.name == BUCKET_NAME_FOOD)
+ .expect("failed to find food bucket");
match transaction_categorisation {
TransactionCategorisation {
@@ -132,10 +132,10 @@ fn matches_food_transaction_categorisation(
description,
quantity: -200_00,
transaction_id,
- category_id,
+ bucket_id,
} => description == ""
&& *transaction_id == food_transaction.id
- && *category_id == food_category.id,
+ && *bucket_id == food_bucket.id,
_ => false,
}
}
diff --git a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/run.rs b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/run.rs
index e882dc5..4c13d55 100644
--- a/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/run.rs
+++ b/transformers/actualbudget_transformer/actualbudget_to_schist_transformer/tests/run.rs
@@ -1,9 +1,9 @@
pub mod common;
use actualbudget_to_schist_transformer::run::run;
-use common::{assert_budget_drip_matches, get_account_matchers, get_account_transfer_matchers, get_category_matchers, get_category_transfer_matchers, get_num_expected_budget_drips, get_transaction_categorisation_matchers, get_transaction_matchers, TestContext, TEST_IN_DB_URL, TEST_OUT_DB_URL};
+use common::{assert_budget_drip_matches, get_account_matchers, get_account_transfer_matchers, get_bucket_matchers, get_bucket_transfer_matchers, get_num_expected_budget_drips, get_transaction_categorisation_matchers, get_transaction_matchers, TestContext, TEST_IN_DB_URL, TEST_OUT_DB_URL};
use diesel::{Connection, SqliteConnection};
-use schist_queries::{account_transfers::get_all_account_transfers, accounts::get_all_accounts, budget_drips::get_all_budget_drips, categories::get_all_categories, category_transfers::get_all_category_transfers, transaction_categorisations::get_all_transaction_categorisations, transactions::get_all_transactions};
+use schist_queries::{account_transfers::get_all_account_transfers, accounts::get_all_accounts, budget_drips::get_all_budget_drips, buckets::get_all_buckets, bucket_transfers::get_all_bucket_transfers, transaction_categorisations::get_all_transaction_categorisations, transactions::get_all_transactions};
#[test]
fn given_test_database_when_run_then_exports_expected_schist_state() {
@@ -13,8 +13,8 @@ fn given_test_database_when_run_then_exports_expected_schist_state() {
let accounts = get_all_accounts(connection).unwrap();
let account_transfers = get_all_account_transfers(connection).unwrap();
let budget_drips = get_all_budget_drips(connection).unwrap();
- let categories = get_all_categories(connection).unwrap();
- let category_transfers = get_all_category_transfers(connection).unwrap();
+ let buckets = get_all_buckets(connection).unwrap();
+ let bucket_transfers = get_all_bucket_transfers(connection).unwrap();
let transactions = get_all_transactions(connection).unwrap();
let transaction_categorisations = get_all_transaction_categorisations(connection).unwrap();
@@ -40,26 +40,26 @@ fn given_test_database_when_run_then_exports_expected_schist_state() {
assert_eq!(get_num_expected_budget_drips(), budget_drips.len());
for budget_drip in budget_drips {
- assert_budget_drip_matches(&budget_drip, &categories);
+ assert_budget_drip_matches(&budget_drip, &buckets);
}
- let category_matchers = get_category_matchers();
- assert_eq!(category_matchers.len(), categories.len());
- for category in categories.clone() {
+ let bucket_matchers = get_bucket_matchers();
+ assert_eq!(bucket_matchers.len(), buckets.len());
+ for bucket in buckets.clone() {
assert!(
- category_matchers.iter().any(|m| m(&category)),
- "no match found for category {:?}",
- category,
+ bucket_matchers.iter().any(|m| m(&bucket)),
+ "no match found for bucket {:?}",
+ bucket,
);
}
- let category_transfer_matchers = get_category_transfer_matchers();
- assert_eq!(category_transfer_matchers.len(), category_transfers.len());
- for category_transfer in category_transfers {
+ let bucket_transfer_matchers = get_bucket_transfer_matchers();
+ assert_eq!(bucket_transfer_matchers.len(), bucket_transfers.len());
+ for bucket_transfer in bucket_transfers {
assert!(
- category_transfer_matchers.iter().any(|m| m(&category_transfer, &categories)),
- "no match found for category_transfer {:?}",
- category_transfer,
+ bucket_transfer_matchers.iter().any(|m| m(&bucket_transfer, &buckets)),
+ "no match found for bucket_transfer {:?}",
+ bucket_transfer,
);
}
@@ -80,7 +80,7 @@ fn given_test_database_when_run_then_exports_expected_schist_state() {
transaction_categorisation_matchers.iter().any(|m| m(
&transaction_categorisation,
&transactions,
- &categories,
+ &buckets,
&accounts,
)),
"no match found for transaction_categorisation {:?}",