diff options
| author | Joe Carstairs <me@joeac.net> | 2024-11-11 08:04:36 +0000 |
|---|---|---|
| committer | Joe Carstairs <me@joeac.net> | 2024-11-11 08:04:36 +0000 |
| commit | 3c7218be1446f8cf914063b1c52c1cbdc8497c8c (patch) | |
| tree | ee2bf1886157e76db5d354ffea57b2d8685df18d | |
| parent | 6a0ae1fd4b8ff6fda6a5f0f8e85917d39ad23c7e (diff) | |
Update actualbudget importer
4 files changed, 58 insertions, 26 deletions
diff --git a/backend/importers/actualbudget/Cargo.lock b/backend/importers/actualbudget/Cargo.lock index 1a461d5..edaab83 100644 --- a/backend/importers/actualbudget/Cargo.lock +++ b/backend/importers/actualbudget/Cargo.lock @@ -46,6 +46,7 @@ version = "0.1.0" dependencies = [ "anyhow", "chrono", + "derive_builder", "diesel", "diesel_migrations", "serde", @@ -138,6 +139,37 @@ dependencies = [ ] [[package]] +name = "derive_builder" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" +dependencies = [ + "derive_builder_macro", +] + +[[package]] +name = "derive_builder_core" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "derive_builder_macro" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" +dependencies = [ + "derive_builder_core", + "syn", +] + +[[package]] name = "diesel" version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" diff --git a/backend/importers/actualbudget/src/main.rs b/backend/importers/actualbudget/src/main.rs index 84f5102..cb69bb5 100644 --- a/backend/importers/actualbudget/src/main.rs +++ b/backend/importers/actualbudget/src/main.rs @@ -12,12 +12,12 @@ fn main() -> Result<()> { let connection_src = &mut SqliteConnection::establish("in.sqlite").unwrap(); let connection_dest = &mut SqliteConnection::establish("out.sqlite").unwrap(); - let actualbudget_first_transaction_date = get_first_actualbudget_transaction_date(connection_src).map_err(|e| e.to_string())?; - let actualbudget_accounts = get_all_actualbudget_accounts(connection_src).map_err(|e| e.to_string())?; - let actualbudget_categories = get_all_actualbudget_categories(connection_src).map_err(|e| e.to_string())?; - let actualbudget_zero_budgets = get_all_actualbudget_zero_budgets(connection_src).map_err(|e| e.to_string())?; - let actualbudget_category_transfers_account = get_category_transfers_account(connection_src).map_err(|e| e.to_string())?; - let actualbudget_transactions = get_all_actualbudget_transactions(connection_src).map_err(|e| e.to_string())?; + let actualbudget_first_transaction_date = get_first_actualbudget_transaction_date(connection_src)?; + let actualbudget_accounts = get_all_actualbudget_accounts(connection_src)?; + let actualbudget_categories = get_all_actualbudget_categories(connection_src)?; + let actualbudget_zero_budgets = get_all_actualbudget_zero_budgets(connection_src)?; + let actualbudget_category_transfers_account = get_category_transfers_account(connection_src)?; + let actualbudget_transactions = get_all_actualbudget_transactions(connection_src)?; let first_transaction_date = transformers::transform_date(&actualbudget_first_transaction_date)?; let accounts = @@ -33,13 +33,13 @@ fn main() -> Result<()> { &actualbudget_category_transfers_account, ); - budgeting_app_queries::clear::clear(connection_dest).map_err(|e| e.to_string())?; - budgeting_app_queries::accounts::insert_accounts(&accounts, connection_dest).map_err(|e| e.to_string())?; - budgeting_app_queries::categories::insert_categories(&categories, connection_dest).map_err(|e| e.to_string())?; - budgeting_app_queries::budget_updates::insert_budget_updates(&budget_updates, connection_dest).map_err(|e| e.to_string())?; - budgeting_app_queries::transactions::insert_transactions(&transactions, connection_dest).map_err(|e| e.to_string())?; - budgeting_app_queries::transaction_categorisations::insert_transaction_categorisations(&transaction_categorisations, connection_dest).map_err(|e| e.to_string())?; - budgeting_app_queries::category_transfers::insert_category_transfers(&category_transfers, connection_dest).map_err(|e| e.to_string())?; + budgeting_app_queries::clear::clear(connection_dest)?; + budgeting_app_queries::accounts::insert_accounts(&accounts, connection_dest)?; + budgeting_app_queries::categories::insert_categories(&categories, connection_dest)?; + budgeting_app_queries::budget_updates::insert_budget_updates(&budget_updates, connection_dest)?; + budgeting_app_queries::transactions::insert_transactions(&transactions, connection_dest)?; + budgeting_app_queries::transaction_categorisations::insert_transaction_categorisations(&transaction_categorisations, connection_dest)?; + budgeting_app_queries::category_transfers::insert_category_transfers(&category_transfers, connection_dest)?; Ok(()) } diff --git a/backend/importers/actualbudget/src/queries/actualbudget_transactions/get_first_date.rs b/backend/importers/actualbudget/src/queries/actualbudget_transactions/get_first_date.rs index dabfbd6..b958c37 100644 --- a/backend/importers/actualbudget/src/queries/actualbudget_transactions/get_first_date.rs +++ b/backend/importers/actualbudget/src/queries/actualbudget_transactions/get_first_date.rs @@ -1,10 +1,11 @@ +use anyhow::Result; use crate::{models::actualbudget_date::ActualbudgetDate, schema::transactions::{ self as transactions_schema, dsl::transactions as transactions_table, }}; use diesel::{dsl::min, result::Error, QueryDsl, RunQueryDsl, SqliteConnection}; -pub fn get_first_actualbudget_transaction_date(connection: &mut SqliteConnection) -> Result<ActualbudgetDate, Error> { +pub fn get_first_actualbudget_transaction_date(connection: &mut SqliteConnection) -> Result<ActualbudgetDate> { let date_as_int = transactions_table .select(min(transactions_schema::date)) .first::<Option<i32>>(connection) diff --git a/backend/importers/actualbudget/src/transformers.rs b/backend/importers/actualbudget/src/transformers.rs index 76001d1..dd4d154 100644 --- a/backend/importers/actualbudget/src/transformers.rs +++ b/backend/importers/actualbudget/src/transformers.rs @@ -1,20 +1,19 @@ +use anyhow::Result; use budgeting_app_core::models::{ - account::Account, budget_update::BudgetUpdate, category::Category, - category_transfer::CategoryTransfer, date_time_utc::DateTimeUtc, transaction::Transaction, - transaction_categorisation::TransactionCategorisation, + account::Account, budget_update::BudgetUpdate, category::Category, category_transfer::CategoryTransfer, date_utc::DateUtc, datetime_utc::DatetimeUtc, transaction::Transaction, transaction_categorisation::TransactionCategorisation }; use core::panic; use std::hash::{DefaultHasher, Hash, Hasher}; use crate::models::{actualbudget_account::ActualbudgetAccount, actualbudget_category::ActualbudgetCategory, actualbudget_date::ActualbudgetDate, actualbudget_transaction::ActualbudgetTransaction, actualbudget_zero_budget::ActualbudgetZeroBudget}; -pub fn transform_date(actualbudget_date: &ActualbudgetDate) -> Result<DateTimeUtc, String> { - DateTimeUtc::from_date_str(&actualbudget_date.to_iso()).map_err(|e| e.to_string()) +pub fn transform_date(actualbudget_date: &ActualbudgetDate) -> Result<DatetimeUtc> { + actualbudget_date.to_iso().parse() } pub fn transform_accounts( actualbudget_accounts: &[ActualbudgetAccount], - first_transaction_date: &DateTimeUtc, + first_transaction_date: &DatetimeUtc, ) -> Vec<Account> { let mut accounts = Vec::<Account>::new(); for account in actualbudget_accounts { @@ -25,7 +24,7 @@ pub fn transform_accounts( fn transform_account( actualbudget_account: &ActualbudgetAccount, - opening_date: &DateTimeUtc, + opening_date: &DatetimeUtc, ) -> Account { Account { id: transform_id(&actualbudget_account.id.clone()), @@ -58,7 +57,7 @@ fn transform_id(actualbudget_id: &str) -> i32 { pub fn transform_budget_updates( actualbudget_zero_budgets: &[ActualbudgetZeroBudget], -) -> Result<Vec<BudgetUpdate>, String> { +) -> Result<Vec<BudgetUpdate>> { let mut budget_updates = Vec::<BudgetUpdate>::new(); for zero_budget in actualbudget_zero_budgets { let first_zero_budget_in_category = get_first_zero_budget_in_category( @@ -71,7 +70,7 @@ pub fn transform_budget_updates( budget_updates.push(BudgetUpdate { id: transform_id(&zero_budget.id.clone()), category_id: transform_id(&zero_budget.category_id.clone()), - date: transform_date(&zero_budget.month.clone()).map_err(|e| e.to_string())?, + date: DateUtc::from(transform_date(&zero_budget.month.clone())?), new_budget: zero_budget.amount.try_into().unwrap(), new_period: 30, }) @@ -94,7 +93,7 @@ fn get_first_zero_budget_in_category( pub fn transform_transactions( actualbudget_transactions: &[ActualbudgetTransaction], actualbudget_category_transfers_account: &ActualbudgetAccount, -) -> Result<(Vec<Transaction>, Vec<TransactionCategorisation>), String> { +) -> Result<(Vec<Transaction>, Vec<TransactionCategorisation>)> { let mut transactions = Vec::<Transaction>::new(); let mut transaction_categorisations = Vec::<TransactionCategorisation>::new(); @@ -116,7 +115,7 @@ pub fn transform_transactions( description: atomic_actualbudget_transaction.notes, payee: atomic_actualbudget_transaction.payee, quantity: atomic_actualbudget_transaction.amount.try_into().unwrap(), - date: transform_date(&atomic_actualbudget_transaction.date).map_err(|e| e.to_string())?, + date: transform_date(&atomic_actualbudget_transaction.date)?, account_id: transform_id(&atomic_actualbudget_transaction.account_id), }); @@ -144,7 +143,7 @@ pub fn transform_transactions( description: parent_actualbudget_transaction.notes, payee: parent_actualbudget_transaction.payee, quantity: parent_actualbudget_transaction.amount.try_into().unwrap(), - date: transform_date(&parent_actualbudget_transaction.date).map_err(|e| e.to_string())?, + date: transform_date(&parent_actualbudget_transaction.date)?, account_id: transform_id(&parent_actualbudget_transaction.account_id), }); |
