From 19f5040910ad297ecd618f67675cd2fa00771bdd Mon Sep 17 00:00:00 2001 From: Joe Carstairs Date: Sun, 17 Nov 2024 13:00:53 +0000 Subject: Refactors Actualbudget importer --- rust/schist_actualbudget_importer/src/main.rs | 5 +- .../src/models/actualbudget_account.rs | 8 --- .../src/models/actualbudget_category.rs | 8 --- .../src/models/actualbudget_date.rs | 75 ---------------------- .../src/models/actualbudget_transaction.rs | 18 ------ .../src/models/actualbudget_zero_budget.rs | 13 ---- .../schist_actualbudget_importer/src/models/mod.rs | 5 -- .../src/queries/actualbudget_accounts/get_all.rs | 6 -- .../get_category_transfers_account.rs | 13 ---- .../src/queries/actualbudget_accounts/mod.rs | 5 -- .../src/queries/actualbudget_categories/get_all.rs | 6 -- .../src/queries/actualbudget_categories/mod.rs | 3 - .../queries/actualbudget_transactions/get_all.rs | 6 -- .../actualbudget_transactions/get_first_date.rs | 14 ---- .../src/queries/actualbudget_transactions/mod.rs | 5 -- .../queries/actualbudget_zero_budgets/get_all.rs | 6 -- .../src/queries/actualbudget_zero_budgets/mod.rs | 3 - .../src/queries/mod.rs | 4 -- rust/schist_actualbudget_importer/src/schema.rs | 47 -------------- .../src/transformers.rs | 40 +++++++++--- 20 files changed, 33 insertions(+), 257 deletions(-) delete mode 100644 rust/schist_actualbudget_importer/src/models/actualbudget_account.rs delete mode 100644 rust/schist_actualbudget_importer/src/models/actualbudget_category.rs delete mode 100644 rust/schist_actualbudget_importer/src/models/actualbudget_date.rs delete mode 100644 rust/schist_actualbudget_importer/src/models/actualbudget_transaction.rs delete mode 100644 rust/schist_actualbudget_importer/src/models/actualbudget_zero_budget.rs delete mode 100644 rust/schist_actualbudget_importer/src/models/mod.rs delete mode 100644 rust/schist_actualbudget_importer/src/queries/actualbudget_accounts/get_all.rs delete mode 100644 rust/schist_actualbudget_importer/src/queries/actualbudget_accounts/get_category_transfers_account.rs delete mode 100644 rust/schist_actualbudget_importer/src/queries/actualbudget_accounts/mod.rs delete mode 100644 rust/schist_actualbudget_importer/src/queries/actualbudget_categories/get_all.rs delete mode 100644 rust/schist_actualbudget_importer/src/queries/actualbudget_categories/mod.rs delete mode 100644 rust/schist_actualbudget_importer/src/queries/actualbudget_transactions/get_all.rs delete mode 100644 rust/schist_actualbudget_importer/src/queries/actualbudget_transactions/get_first_date.rs delete mode 100644 rust/schist_actualbudget_importer/src/queries/actualbudget_transactions/mod.rs delete mode 100644 rust/schist_actualbudget_importer/src/queries/actualbudget_zero_budgets/get_all.rs delete mode 100644 rust/schist_actualbudget_importer/src/queries/actualbudget_zero_budgets/mod.rs delete mode 100644 rust/schist_actualbudget_importer/src/queries/mod.rs delete mode 100644 rust/schist_actualbudget_importer/src/schema.rs (limited to 'rust/schist_actualbudget_importer/src') diff --git a/rust/schist_actualbudget_importer/src/main.rs b/rust/schist_actualbudget_importer/src/main.rs index ebf5353..2236f73 100644 --- a/rust/schist_actualbudget_importer/src/main.rs +++ b/rust/schist_actualbudget_importer/src/main.rs @@ -1,13 +1,10 @@ -pub mod models; -pub mod queries; -pub mod schema; pub mod transformers; use anyhow::Result; use schist_models::{account::Account, budget_update::BudgetUpdate, category::Category, category_transfer::CategoryTransfer, transaction::Transaction, transaction_categorisation::TransactionCategorisation}; use schist_queries; use diesel::{Connection, SqliteConnection}; -use queries::{actualbudget_accounts::{get_all_actualbudget_accounts, get_category_transfers_account}, actualbudget_categories::get_all_actualbudget_categories, actualbudget_transactions::{get_all_actualbudget_transactions, get_first_actualbudget_transaction_date}, actualbudget_zero_budgets::get_all_actualbudget_zero_budgets}; +use actualbudget_queries::{actualbudget_accounts::{get_all_actualbudget_accounts, get_category_transfers_account}, actualbudget_categories::get_all_actualbudget_categories, actualbudget_transactions::{get_all_actualbudget_transactions, get_first_actualbudget_transaction_date}, actualbudget_zero_budgets::get_all_actualbudget_zero_budgets}; fn main() -> Result<()> { let connection_src = &mut SqliteConnection::establish("in.sqlite").unwrap(); diff --git a/rust/schist_actualbudget_importer/src/models/actualbudget_account.rs b/rust/schist_actualbudget_importer/src/models/actualbudget_account.rs deleted file mode 100644 index b3d00ac..0000000 --- a/rust/schist_actualbudget_importer/src/models/actualbudget_account.rs +++ /dev/null @@ -1,8 +0,0 @@ -use diesel::prelude::{Queryable, Selectable}; - -#[derive(Queryable, Selectable)] -#[diesel(table_name = crate::schema::accounts)] -pub struct ActualbudgetAccount { - pub id: String, - pub name: String, -} diff --git a/rust/schist_actualbudget_importer/src/models/actualbudget_category.rs b/rust/schist_actualbudget_importer/src/models/actualbudget_category.rs deleted file mode 100644 index cbea99b..0000000 --- a/rust/schist_actualbudget_importer/src/models/actualbudget_category.rs +++ /dev/null @@ -1,8 +0,0 @@ -use diesel::{prelude::Queryable, Selectable}; - -#[derive(Queryable, Selectable)] -#[diesel(table_name = crate::schema::categories)] -pub struct ActualbudgetCategory { - pub id: String, - pub name: String, -} diff --git a/rust/schist_actualbudget_importer/src/models/actualbudget_date.rs b/rust/schist_actualbudget_importer/src/models/actualbudget_date.rs deleted file mode 100644 index bef160c..0000000 --- a/rust/schist_actualbudget_importer/src/models/actualbudget_date.rs +++ /dev/null @@ -1,75 +0,0 @@ -use diesel::{backend::Backend, deserialize::{FromSql, FromSqlRow}, expression::AsExpression, sql_types::Integer, sqlite::Sqlite}; - -#[derive(Clone, PartialEq, Eq, Debug, AsExpression, FromSqlRow)] -#[diesel(sql_type=Integer)] -pub struct ActualbudgetDate(i32); - -#[derive(Clone, PartialOrd, PartialEq, Eq)] -enum DatePart { - MonthOfYear, - DayOfMonth, -} - -// actualbudget represents dates as numbers which "look like" the corresponding -// ISO string when written in decimal. E.g. 20240901 represents 1 Sep 2024. It -// also uses month specifiers, e.g. 202409 to represent Sep 2024. In this case, -// we interpret this as the first day of the month, e.g. 2024-09-01. - -impl ActualbudgetDate { - pub fn to_iso(&self) -> String { - format!("{0}-{1}-{2}", self.year(), self.month(), self.day()) - } - - pub fn year(&self) -> String { - self.0.to_string()[0..4].to_string() - } - - pub fn month(&self) -> String { - self.0.to_string()[4..6].to_string() - } - - pub fn day(&self) -> String { - match self.date_part() { - DatePart::DayOfMonth => self.0.to_string()[6..8].to_string(), - DatePart::MonthOfYear => String::from("01"), - } - } - - pub fn from_i32(i: i32) -> Self { - ActualbudgetDate(i) - } - - fn date_part(&self) -> DatePart { - if self.0 < 10000000 { - DatePart::MonthOfYear - } else { - DatePart::DayOfMonth - } - } - - fn dayified_value(&self) -> i32 { - match self.date_part() { - DatePart::DayOfMonth => self.0, - DatePart::MonthOfYear => self.0 * 100 + 1, - } - } -} - -impl Ord for ActualbudgetDate { - fn cmp(&self, other: &Self) -> std::cmp::Ordering { - self.dayified_value().cmp(&other.dayified_value()) - } -} - -impl PartialOrd for ActualbudgetDate { - fn partial_cmp(&self, other: &Self) -> Option { - Some(self.cmp(other)) - } -} - -impl FromSql for ActualbudgetDate { - fn from_sql(bytes: ::RawValue<'_>) -> diesel::deserialize::Result { - let int: i32 = FromSql::::from_sql(bytes)?; - Ok(ActualbudgetDate(int)) - } -} diff --git a/rust/schist_actualbudget_importer/src/models/actualbudget_transaction.rs b/rust/schist_actualbudget_importer/src/models/actualbudget_transaction.rs deleted file mode 100644 index be2ca1a..0000000 --- a/rust/schist_actualbudget_importer/src/models/actualbudget_transaction.rs +++ /dev/null @@ -1,18 +0,0 @@ -use diesel::prelude::{Identifiable, Queryable, QueryableByName, Selectable}; - -use crate::models::actualbudget_date::ActualbudgetDate; - -#[derive(Identifiable, QueryableByName, Queryable, Selectable, Clone)] -#[diesel(table_name = crate::schema::transactions)] -pub struct ActualbudgetTransaction { - pub id: String, - pub is_parent: bool, - pub is_child: bool, - pub account_id: String, - pub category_id: String, - pub amount: i32, - pub payee: String, - pub notes: String, - pub date: ActualbudgetDate, - pub parent_id: Option, -} diff --git a/rust/schist_actualbudget_importer/src/models/actualbudget_zero_budget.rs b/rust/schist_actualbudget_importer/src/models/actualbudget_zero_budget.rs deleted file mode 100644 index 6478d34..0000000 --- a/rust/schist_actualbudget_importer/src/models/actualbudget_zero_budget.rs +++ /dev/null @@ -1,13 +0,0 @@ -use crate::models::actualbudget_date::ActualbudgetDate; -use diesel::{prelude::{Identifiable, Queryable, QueryableByName, Selectable}, sqlite::Sqlite}; - -#[derive(Identifiable, QueryableByName, Queryable, Selectable, Clone)] -#[diesel(table_name = crate::schema::zero_budgets)] -#[diesel(check_for_backend(Sqlite))] -pub struct ActualbudgetZeroBudget { - pub id: String, - pub month: ActualbudgetDate, - pub category_id: String, - pub amount: i32, - pub do_carry_over: i32, -} diff --git a/rust/schist_actualbudget_importer/src/models/mod.rs b/rust/schist_actualbudget_importer/src/models/mod.rs deleted file mode 100644 index 1c97c65..0000000 --- a/rust/schist_actualbudget_importer/src/models/mod.rs +++ /dev/null @@ -1,5 +0,0 @@ -pub mod actualbudget_account; -pub mod actualbudget_category; -pub mod actualbudget_date; -pub mod actualbudget_transaction; -pub mod actualbudget_zero_budget; diff --git a/rust/schist_actualbudget_importer/src/queries/actualbudget_accounts/get_all.rs b/rust/schist_actualbudget_importer/src/queries/actualbudget_accounts/get_all.rs deleted file mode 100644 index 6f667de..0000000 --- a/rust/schist_actualbudget_importer/src/queries/actualbudget_accounts/get_all.rs +++ /dev/null @@ -1,6 +0,0 @@ -use crate::{models::actualbudget_account::ActualbudgetAccount, schema::accounts::dsl::accounts}; -use diesel::{result::Error, QueryDsl, RunQueryDsl, SelectableHelper, SqliteConnection}; - -pub fn get_all_actualbudget_accounts(connection: &mut SqliteConnection) -> Result, Error> { - accounts.select(ActualbudgetAccount::as_select()).load(connection) -} diff --git a/rust/schist_actualbudget_importer/src/queries/actualbudget_accounts/get_category_transfers_account.rs b/rust/schist_actualbudget_importer/src/queries/actualbudget_accounts/get_category_transfers_account.rs deleted file mode 100644 index f05dc78..0000000 --- a/rust/schist_actualbudget_importer/src/queries/actualbudget_accounts/get_category_transfers_account.rs +++ /dev/null @@ -1,13 +0,0 @@ -use diesel::{result::Error, ExpressionMethods, QueryDsl, RunQueryDsl, SelectableHelper, SqliteConnection}; - -use crate::{models::actualbudget_account::ActualbudgetAccount, schema::accounts::{ - self as accounts_schema, - dsl::accounts as accounts_table, -}}; - -pub fn get_category_transfers_account(connection: &mut SqliteConnection) -> Result { - accounts_table - .filter(accounts_schema::name.eq("Category transfers")) - .select(ActualbudgetAccount::as_select()) - .first(connection) -} diff --git a/rust/schist_actualbudget_importer/src/queries/actualbudget_accounts/mod.rs b/rust/schist_actualbudget_importer/src/queries/actualbudget_accounts/mod.rs deleted file mode 100644 index c6d6015..0000000 --- a/rust/schist_actualbudget_importer/src/queries/actualbudget_accounts/mod.rs +++ /dev/null @@ -1,5 +0,0 @@ -mod get_all; -mod get_category_transfers_account; - -pub use get_all::get_all_actualbudget_accounts; -pub use get_category_transfers_account::get_category_transfers_account; diff --git a/rust/schist_actualbudget_importer/src/queries/actualbudget_categories/get_all.rs b/rust/schist_actualbudget_importer/src/queries/actualbudget_categories/get_all.rs deleted file mode 100644 index 4cb7ebc..0000000 --- a/rust/schist_actualbudget_importer/src/queries/actualbudget_categories/get_all.rs +++ /dev/null @@ -1,6 +0,0 @@ -use crate::{models::actualbudget_category::ActualbudgetCategory, schema::categories::dsl::categories}; -use diesel::{result::Error, QueryDsl, RunQueryDsl, SelectableHelper, SqliteConnection}; - -pub fn get_all_actualbudget_categories(connection: &mut SqliteConnection) -> Result, Error> { - categories.select(ActualbudgetCategory::as_select()).load(connection) -} diff --git a/rust/schist_actualbudget_importer/src/queries/actualbudget_categories/mod.rs b/rust/schist_actualbudget_importer/src/queries/actualbudget_categories/mod.rs deleted file mode 100644 index 0c04e53..0000000 --- a/rust/schist_actualbudget_importer/src/queries/actualbudget_categories/mod.rs +++ /dev/null @@ -1,3 +0,0 @@ -mod get_all; - -pub use get_all::get_all_actualbudget_categories; diff --git a/rust/schist_actualbudget_importer/src/queries/actualbudget_transactions/get_all.rs b/rust/schist_actualbudget_importer/src/queries/actualbudget_transactions/get_all.rs deleted file mode 100644 index 84c8d08..0000000 --- a/rust/schist_actualbudget_importer/src/queries/actualbudget_transactions/get_all.rs +++ /dev/null @@ -1,6 +0,0 @@ -use crate::{models::actualbudget_transaction::ActualbudgetTransaction, schema::transactions::dsl::transactions}; -use diesel::{result::Error, QueryDsl, RunQueryDsl, SelectableHelper, SqliteConnection}; - -pub fn get_all_actualbudget_transactions(connection: &mut SqliteConnection) -> Result, Error> { - transactions.select(ActualbudgetTransaction::as_select()).load(connection) -} diff --git a/rust/schist_actualbudget_importer/src/queries/actualbudget_transactions/get_first_date.rs b/rust/schist_actualbudget_importer/src/queries/actualbudget_transactions/get_first_date.rs deleted file mode 100644 index b958c37..0000000 --- a/rust/schist_actualbudget_importer/src/queries/actualbudget_transactions/get_first_date.rs +++ /dev/null @@ -1,14 +0,0 @@ -use anyhow::Result; -use crate::{models::actualbudget_date::ActualbudgetDate, schema::transactions::{ - self as transactions_schema, - dsl::transactions as transactions_table, -}}; -use diesel::{dsl::min, result::Error, QueryDsl, RunQueryDsl, SqliteConnection}; - -pub fn get_first_actualbudget_transaction_date(connection: &mut SqliteConnection) -> Result { - let date_as_int = transactions_table - .select(min(transactions_schema::date)) - .first::>(connection) - .map_or_else(|e| Err(e), |o| o.map_or_else(|| Err(Error::NotFound), |i| Ok(i)))?; - Ok(ActualbudgetDate::from_i32(date_as_int)) -} diff --git a/rust/schist_actualbudget_importer/src/queries/actualbudget_transactions/mod.rs b/rust/schist_actualbudget_importer/src/queries/actualbudget_transactions/mod.rs deleted file mode 100644 index b4ed0dd..0000000 --- a/rust/schist_actualbudget_importer/src/queries/actualbudget_transactions/mod.rs +++ /dev/null @@ -1,5 +0,0 @@ -mod get_all; -mod get_first_date; - -pub use get_all::get_all_actualbudget_transactions; -pub use get_first_date::get_first_actualbudget_transaction_date; diff --git a/rust/schist_actualbudget_importer/src/queries/actualbudget_zero_budgets/get_all.rs b/rust/schist_actualbudget_importer/src/queries/actualbudget_zero_budgets/get_all.rs deleted file mode 100644 index 0c3f695..0000000 --- a/rust/schist_actualbudget_importer/src/queries/actualbudget_zero_budgets/get_all.rs +++ /dev/null @@ -1,6 +0,0 @@ -use crate::{models::actualbudget_zero_budget::ActualbudgetZeroBudget, schema::zero_budgets::dsl::zero_budgets}; -use diesel::{result::Error, QueryDsl, RunQueryDsl, SelectableHelper, SqliteConnection}; - -pub fn get_all_actualbudget_zero_budgets(connection: &mut SqliteConnection) -> Result, Error> { - zero_budgets.select(ActualbudgetZeroBudget::as_select()).load(connection) -} diff --git a/rust/schist_actualbudget_importer/src/queries/actualbudget_zero_budgets/mod.rs b/rust/schist_actualbudget_importer/src/queries/actualbudget_zero_budgets/mod.rs deleted file mode 100644 index ba7e21b..0000000 --- a/rust/schist_actualbudget_importer/src/queries/actualbudget_zero_budgets/mod.rs +++ /dev/null @@ -1,3 +0,0 @@ -mod get_all; - -pub use get_all::get_all_actualbudget_zero_budgets; diff --git a/rust/schist_actualbudget_importer/src/queries/mod.rs b/rust/schist_actualbudget_importer/src/queries/mod.rs deleted file mode 100644 index e16dafc..0000000 --- a/rust/schist_actualbudget_importer/src/queries/mod.rs +++ /dev/null @@ -1,4 +0,0 @@ -pub mod actualbudget_accounts; -pub mod actualbudget_categories; -pub mod actualbudget_transactions; -pub mod actualbudget_zero_budgets; diff --git a/rust/schist_actualbudget_importer/src/schema.rs b/rust/schist_actualbudget_importer/src/schema.rs deleted file mode 100644 index a872231..0000000 --- a/rust/schist_actualbudget_importer/src/schema.rs +++ /dev/null @@ -1,47 +0,0 @@ -diesel::table! { - accounts (id) { - id -> Text, - name -> Text, - } -} - -diesel::table! { - categories (id) { - id -> Text, - name -> Text, - } -} - -diesel::table! { - transactions (id) { - id -> Text, - #[sql_name = "isParent"] - is_parent -> Bool, - #[sql_name = "isChild"] - is_child -> Bool, - #[sql_name = "acct"] - account_id -> Text, - #[sql_name = "category"] - category_id -> Text, - amount -> Integer, - #[sql_name = "description"] - payee -> Text, - notes -> Text, - date -> Integer, - parent_id -> Nullable, - } -} - -diesel::table! { - zero_budgets (id) { - id -> Text, - month -> Integer, - #[sql_name = "category"] - category_id -> Text, - amount -> Integer, - #[sql_name = "carryover"] - do_carry_over -> Integer, - // goal -> Integer, - // long_goal -> Integer, - } -} diff --git a/rust/schist_actualbudget_importer/src/transformers.rs b/rust/schist_actualbudget_importer/src/transformers.rs index d1b1564..cf62608 100644 --- a/rust/schist_actualbudget_importer/src/transformers.rs +++ b/rust/schist_actualbudget_importer/src/transformers.rs @@ -1,3 +1,10 @@ +use actualbudget_models::{ + actualbudget_account::ActualbudgetAccount, + actualbudget_category::ActualbudgetCategory, + actualbudget_date::ActualbudgetDate, + actualbudget_transaction::ActualbudgetTransaction, + actualbudget_zero_budget::ActualbudgetZeroBudget, +}; use anyhow::Result; use schist_models::{ account::Account, @@ -12,8 +19,6 @@ use schist_models::{ use core::panic; use std::hash::{DefaultHasher, Hash, Hasher}; -use crate::models::{actualbudget_account::ActualbudgetAccount, actualbudget_category::ActualbudgetCategory, actualbudget_date::ActualbudgetDate, actualbudget_transaction::ActualbudgetTransaction, actualbudget_zero_budget::ActualbudgetZeroBudget}; - pub fn transform_date(actualbudget_date: &ActualbudgetDate) -> Result { actualbudget_date.to_iso().parse() } @@ -99,14 +104,15 @@ fn get_first_zero_budget_in_category( pub fn transform_transactions( actualbudget_transactions: &[ActualbudgetTransaction], - actualbudget_category_transfers_account: &ActualbudgetAccount, + actualbudget_category_transfers_account: &Option, ) -> Result<(Vec, Vec)> { let mut transactions = Vec::::new(); let mut transaction_categorisations = Vec::::new(); let mut actualbudget_transactions = actualbudget_transactions.to_vec(); - actualbudget_transactions - .retain(|t| t.category_id.clone() != actualbudget_category_transfers_account.id.clone()); + actualbudget_transactions.retain(|transaction| + is_not_category_transfer(transaction, actualbudget_category_transfers_account) + ); let mut parent_actualbudget_transactions = actualbudget_transactions.to_vec(); parent_actualbudget_transactions.retain(|t| t.is_parent); let mut child_actualbudget_transactions = actualbudget_transactions.to_vec(); @@ -170,13 +176,14 @@ pub fn transform_transactions( pub fn transform_category_transfers( actualbudget_transactions: &[ActualbudgetTransaction], - actualbudget_category_transfers_account: &ActualbudgetAccount, + actualbudget_category_transfers_account: &Option, ) -> Vec { let mut category_transfers = Vec::::new(); let mut actualbudget_category_transfers = actualbudget_transactions.to_vec(); - actualbudget_category_transfers - .retain(|t| t.category_id.clone() == actualbudget_category_transfers_account.id.clone()); + actualbudget_category_transfers.retain(|transaction| + is_category_transfer(transaction, actualbudget_category_transfers_account) + ); let mut actualbudget_parent_category_transfers = actualbudget_category_transfers.to_vec(); actualbudget_parent_category_transfers.retain(|t| t.is_parent); let mut actualbudget_child_category_transfers = actualbudget_category_transfers.to_vec(); @@ -223,3 +230,20 @@ pub fn transform_category_transfers( category_transfers } + +fn is_category_transfer( + transaction: &ActualbudgetTransaction, + actualbudget_category_transfers_account: &Option +) -> bool { + match actualbudget_category_transfers_account { + None => false, + Some(acc) => transaction.category_id.clone() == acc.id.clone(), + } +} + +fn is_not_category_transfer( + transaction: &ActualbudgetTransaction, + actualbudget_category_transfers_account: &Option +) -> bool { + !is_category_transfer(transaction, actualbudget_category_transfers_account) +} -- cgit v1.2.3