diff options
| author | Joe Carstairs <jcarstairs@scottlogic.com> | 2025-07-28 13:22:53 +0100 |
|---|---|---|
| committer | Joe Carstairs <jcarstairs@scottlogic.com> | 2025-07-28 13:30:27 +0100 |
| commit | 2361adeb0ca77904138e3466d51c2f44cf6df613 (patch) | |
| tree | f6e7192908f99fab62061913d8a1e9d2b918414b /transformers/actualbudget_transformer/actualbudget_models | |
| parent | c7ed1e61ce2218be0b9e60577454124c4e43a366 (diff) | |
Tidier folders
Diffstat (limited to 'transformers/actualbudget_transformer/actualbudget_models')
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 |
