summaryrefslogtreecommitdiff
path: root/transformers/actualbudget_transformer/actualbudget_models
diff options
context:
space:
mode:
authorJoe Carstairs <jcarstairs@scottlogic.com>2025-07-28 13:22:53 +0100
committerJoe Carstairs <jcarstairs@scottlogic.com>2025-07-28 13:30:27 +0100
commit2361adeb0ca77904138e3466d51c2f44cf6df613 (patch)
treef6e7192908f99fab62061913d8a1e9d2b918414b /transformers/actualbudget_transformer/actualbudget_models
parentc7ed1e61ce2218be0b9e60577454124c4e43a366 (diff)
Tidier folders
Diffstat (limited to 'transformers/actualbudget_transformer/actualbudget_models')
-rw-r--r--transformers/actualbudget_transformer/actualbudget_models/Cargo.toml8
-rw-r--r--transformers/actualbudget_transformer/actualbudget_models/src/actualbudget_account.rs9
-rw-r--r--transformers/actualbudget_transformer/actualbudget_models/src/actualbudget_category.rs9
-rw-r--r--transformers/actualbudget_transformer/actualbudget_models/src/actualbudget_date.rs79
-rw-r--r--transformers/actualbudget_transformer/actualbudget_models/src/actualbudget_payee.rs10
-rw-r--r--transformers/actualbudget_transformer/actualbudget_models/src/actualbudget_schema.rs66
-rw-r--r--transformers/actualbudget_transformer/actualbudget_models/src/actualbudget_transaction.rs20
-rw-r--r--transformers/actualbudget_transformer/actualbudget_models/src/actualbudget_zero_budget.rs14
-rw-r--r--transformers/actualbudget_transformer/actualbudget_models/src/lib.rs20
-rw-r--r--transformers/actualbudget_transformer/actualbudget_models/user_data.sqlite0
10 files changed, 235 insertions, 0 deletions
diff --git a/transformers/actualbudget_transformer/actualbudget_models/Cargo.toml b/transformers/actualbudget_transformer/actualbudget_models/Cargo.toml
new file mode 100644
index 0000000..8bec23b
--- /dev/null
+++ b/transformers/actualbudget_transformer/actualbudget_models/Cargo.toml
@@ -0,0 +1,8 @@
+[package]
+name = "actualbudget_models"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
+derive_builder = { workspace = true }
+diesel = { workspace = true, features = ["sqlite"] }
diff --git a/transformers/actualbudget_transformer/actualbudget_models/src/actualbudget_account.rs b/transformers/actualbudget_transformer/actualbudget_models/src/actualbudget_account.rs
new file mode 100644
index 0000000..8691ec1
--- /dev/null
+++ b/transformers/actualbudget_transformer/actualbudget_models/src/actualbudget_account.rs
@@ -0,0 +1,9 @@
+use derive_builder::Builder;
+use diesel::prelude::{Queryable, Selectable};
+
+#[derive(Builder, Clone, PartialEq, Eq, Queryable, Selectable)]
+#[diesel(table_name = crate::actualbudget_schema::accounts)]
+pub struct ActualbudgetAccount {
+ pub id: String,
+ pub name: String,
+}
diff --git a/transformers/actualbudget_transformer/actualbudget_models/src/actualbudget_category.rs b/transformers/actualbudget_transformer/actualbudget_models/src/actualbudget_category.rs
new file mode 100644
index 0000000..bf35450
--- /dev/null
+++ b/transformers/actualbudget_transformer/actualbudget_models/src/actualbudget_category.rs
@@ -0,0 +1,9 @@
+use derive_builder::Builder;
+use diesel::{prelude::Queryable, Selectable};
+
+#[derive(Builder, Clone, Queryable, Selectable)]
+#[diesel(table_name = crate::actualbudget_schema::categories)]
+pub struct ActualbudgetCategory {
+ pub id: String,
+ pub name: String,
+}
diff --git a/transformers/actualbudget_transformer/actualbudget_models/src/actualbudget_date.rs b/transformers/actualbudget_transformer/actualbudget_models/src/actualbudget_date.rs
new file mode 100644
index 0000000..13525fc
--- /dev/null
+++ b/transformers/actualbudget_transformer/actualbudget_models/src/actualbudget_date.rs
@@ -0,0 +1,79 @@
+use diesel::{backend::Backend, deserialize::{FromSql, FromSqlRow}, expression::AsExpression, sql_types::Integer, sqlite::Sqlite};
+
+#[derive(Clone, Hash, PartialEq, Eq, Debug, AsExpression, FromSqlRow)]
+#[diesel(sql_type=Integer)]
+pub struct ActualbudgetDate(i32);
+
+#[derive(Clone, PartialOrd, PartialEq, Eq)]
+enum DatePart {
+ MonthOfYear,
+ DayOfMonth,
+}
+
+// actualbudget represents dates as numbers which "look like" the corresponding
+// ISO string when written in decimal. E.g. 20240901 represents 1 Sep 2024. It
+// also uses month specifiers, e.g. 202409 to represent Sep 2024. In this case,
+// we interpret this as the first day of the month, e.g. 2024-09-01.
+
+impl ActualbudgetDate {
+ pub fn to_iso(&self) -> String {
+ format!("{0}-{1}-{2}T00:00:00.000Z", self.year(), self.month(), self.day())
+ }
+
+ pub fn to_iso_date(&self) -> String {
+ format!("{0}-{1}-{2}", self.year(), self.month(), self.day())
+ }
+
+ pub fn year(&self) -> String {
+ self.0.to_string()[0..4].to_string()
+ }
+
+ pub fn month(&self) -> String {
+ self.0.to_string()[4..6].to_string()
+ }
+
+ pub fn day(&self) -> String {
+ match self.date_part() {
+ DatePart::DayOfMonth => self.0.to_string()[6..8].to_string(),
+ DatePart::MonthOfYear => String::from("01"),
+ }
+ }
+
+ pub fn from_i32(i: i32) -> Self {
+ ActualbudgetDate(i)
+ }
+
+ fn date_part(&self) -> DatePart {
+ if self.0 < 10000000 {
+ DatePart::MonthOfYear
+ } else {
+ DatePart::DayOfMonth
+ }
+ }
+
+ fn dayified_value(&self) -> i32 {
+ match self.date_part() {
+ DatePart::DayOfMonth => self.0,
+ DatePart::MonthOfYear => self.0 * 100 + 1,
+ }
+ }
+}
+
+impl Ord for ActualbudgetDate {
+ fn cmp(&self, other: &Self) -> std::cmp::Ordering {
+ self.dayified_value().cmp(&other.dayified_value())
+ }
+}
+
+impl PartialOrd for ActualbudgetDate {
+ fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
+ Some(self.cmp(other))
+ }
+}
+
+impl FromSql<Integer, Sqlite> for ActualbudgetDate {
+ fn from_sql(bytes: <Sqlite as Backend>::RawValue<'_>) -> diesel::deserialize::Result<Self> {
+ let int: i32 = FromSql::<Integer, Sqlite>::from_sql(bytes)?;
+ Ok(ActualbudgetDate(int))
+ }
+}
diff --git a/transformers/actualbudget_transformer/actualbudget_models/src/actualbudget_payee.rs b/transformers/actualbudget_transformer/actualbudget_models/src/actualbudget_payee.rs
new file mode 100644
index 0000000..526b73e
--- /dev/null
+++ b/transformers/actualbudget_transformer/actualbudget_models/src/actualbudget_payee.rs
@@ -0,0 +1,10 @@
+use derive_builder::Builder;
+use diesel::prelude::{Queryable, Selectable};
+
+#[derive(Builder, Clone, Debug, Queryable, Selectable)]
+#[diesel(table_name = crate::actualbudget_schema::payees)]
+pub struct ActualbudgetPayee {
+ pub id: String,
+ pub name: String,
+ pub transfer_account_id: Option<String>,
+}
diff --git a/transformers/actualbudget_transformer/actualbudget_models/src/actualbudget_schema.rs b/transformers/actualbudget_transformer/actualbudget_models/src/actualbudget_schema.rs
new file mode 100644
index 0000000..4e1ba24
--- /dev/null
+++ b/transformers/actualbudget_transformer/actualbudget_models/src/actualbudget_schema.rs
@@ -0,0 +1,66 @@
+diesel::table! {
+ accounts (id) {
+ id -> Text,
+ name -> Text,
+ }
+}
+
+diesel::table! {
+ categories (id) {
+ id -> Text,
+ name -> Text,
+ }
+}
+
+diesel::table! {
+ v_transactions (id) {
+ id -> Text,
+ is_parent -> Bool,
+ is_child -> Bool,
+ parent_id -> Nullable<Text>,
+ #[sql_name = "account"]
+ account_id -> Text,
+ #[sql_name = "category"]
+ category_id -> Nullable<Text>,
+ amount -> Integer,
+ payee -> Nullable<Text>,
+ notes -> Nullable<Text>,
+ date -> Integer,
+ transfer_id -> Nullable<Text>,
+ // imported_id -> Text,
+ // error -> Text,
+ // imported_payee -> Text,
+ // starting_balance_flag -> Integer,
+ // sort_order -> Real,
+ // cleared -> Integer,
+ // reconciled -> Integer,
+ // tombstone -> Integer,
+ // schedule -> Text,
+ }
+}
+
+diesel::table! {
+ payees (id) {
+ id -> Text,
+ name -> Text,
+ #[sql_name = "transfer_acct"]
+ transfer_account_id -> Nullable<Text>,
+ // category -> Nullable<Text>,
+ // favorite -> Bool,
+ // tombstone -> Integer,
+ }
+}
+
+diesel::table! {
+ zero_budgets (id) {
+ id -> Text,
+ month -> Integer,
+ #[sql_name = "category"]
+ category_id -> Text,
+ amount -> Integer,
+ #[sql_name = "carryover"]
+ do_carry_over -> Bool,
+ // goal -> Integer,
+ // long_goal -> Integer,
+ }
+}
diff --git a/transformers/actualbudget_transformer/actualbudget_models/src/actualbudget_transaction.rs b/transformers/actualbudget_transformer/actualbudget_models/src/actualbudget_transaction.rs
new file mode 100644
index 0000000..c8ac522
--- /dev/null
+++ b/transformers/actualbudget_transformer/actualbudget_models/src/actualbudget_transaction.rs
@@ -0,0 +1,20 @@
+use derive_builder::Builder;
+use diesel::prelude::{Identifiable, Queryable, QueryableByName, Selectable};
+
+use crate::actualbudget_date::ActualbudgetDate;
+
+#[derive(Builder, Debug, PartialEq, Eq, Identifiable, QueryableByName, Queryable, Selectable, Clone)]
+#[diesel(table_name = crate::actualbudget_schema::v_transactions)]
+pub struct ActualbudgetTransaction {
+ pub id: String,
+ pub is_parent: bool,
+ pub is_child: bool,
+ pub parent_id: Option<String>,
+ pub account_id: String,
+ pub category_id: Option<String>,
+ pub amount: i32,
+ pub payee: Option<String>,
+ pub notes: Option<String>,
+ pub date: ActualbudgetDate,
+ pub transfer_id: Option<String>,
+}
diff --git a/transformers/actualbudget_transformer/actualbudget_models/src/actualbudget_zero_budget.rs b/transformers/actualbudget_transformer/actualbudget_models/src/actualbudget_zero_budget.rs
new file mode 100644
index 0000000..e18ccc4
--- /dev/null
+++ b/transformers/actualbudget_transformer/actualbudget_models/src/actualbudget_zero_budget.rs
@@ -0,0 +1,14 @@
+use crate::actualbudget_date::ActualbudgetDate;
+use derive_builder::Builder;
+use diesel::{prelude::{Identifiable, Queryable, QueryableByName, Selectable}, sqlite::Sqlite};
+
+#[derive(Builder, Identifiable, QueryableByName, Queryable, Selectable, Clone)]
+#[diesel(table_name = crate::actualbudget_schema::zero_budgets)]
+#[diesel(check_for_backend(Sqlite))]
+pub struct ActualbudgetZeroBudget {
+ pub id: String,
+ pub month: ActualbudgetDate,
+ pub category_id: String,
+ pub amount: i32,
+ pub do_carry_over: bool,
+}
diff --git a/transformers/actualbudget_transformer/actualbudget_models/src/lib.rs b/transformers/actualbudget_transformer/actualbudget_models/src/lib.rs
new file mode 100644
index 0000000..2d7d46c
--- /dev/null
+++ b/transformers/actualbudget_transformer/actualbudget_models/src/lib.rs
@@ -0,0 +1,20 @@
+mod actualbudget_account;
+mod actualbudget_category;
+mod actualbudget_date;
+mod actualbudget_payee;
+mod actualbudget_transaction;
+mod actualbudget_zero_budget;
+
+pub mod actualbudget_schema;
+
+pub use actualbudget_account::ActualbudgetAccount;
+pub use actualbudget_account::ActualbudgetAccountBuilder;
+pub use actualbudget_category::ActualbudgetCategory;
+pub use actualbudget_category::ActualbudgetCategoryBuilder;
+pub use actualbudget_date::ActualbudgetDate;
+pub use actualbudget_payee::ActualbudgetPayee;
+pub use actualbudget_payee::ActualbudgetPayeeBuilder;
+pub use actualbudget_transaction::ActualbudgetTransaction;
+pub use actualbudget_transaction::ActualbudgetTransactionBuilder;
+pub use actualbudget_zero_budget::ActualbudgetZeroBudget;
+pub use actualbudget_zero_budget::ActualbudgetZeroBudgetBuilder;
diff --git a/transformers/actualbudget_transformer/actualbudget_models/user_data.sqlite b/transformers/actualbudget_transformer/actualbudget_models/user_data.sqlite
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/transformers/actualbudget_transformer/actualbudget_models/user_data.sqlite