diff options
Diffstat (limited to 'rust')
4 files changed, 38 insertions, 13 deletions
diff --git a/rust/actualbudget_to_schist_transformer/src/actualbudget_state.rs b/rust/actualbudget_to_schist_transformer/src/actualbudget_state.rs index 76b5114..5379b62 100644 --- a/rust/actualbudget_to_schist_transformer/src/actualbudget_state.rs +++ b/rust/actualbudget_to_schist_transformer/src/actualbudget_state.rs @@ -1,10 +1,12 @@ +use std::cmp::min; + use actualbudget_models::{ActualbudgetAccount, ActualbudgetCategory, ActualbudgetDate, ActualbudgetPayee, ActualbudgetTransaction, ActualbudgetZeroBudget}; -use actualbudget_queries::{actualbudget_accounts::{get_all_actualbudget_accounts, get_category_transfers_account}, actualbudget_categories::get_all_actualbudget_categories, actualbudget_payees::get_all_actualbudget_payees, 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_payees::get_all_actualbudget_payees, actualbudget_transactions::{get_all_actualbudget_transactions, get_first_actualbudget_transaction_date}, actualbudget_zero_budgets::{get_all_actualbudget_zero_budgets, get_first_zero_budget_date}}; use anyhow::Result; use diesel::SqliteConnection; pub struct ActualbudgetState { - pub actualbudget_first_transaction_date: ActualbudgetDate, + pub actualbudget_first_activity_date: ActualbudgetDate, pub actualbudget_accounts: Vec<ActualbudgetAccount>, pub actualbudget_categories: Vec<ActualbudgetCategory>, pub actualbudget_payees: Vec<ActualbudgetPayee>, @@ -15,7 +17,10 @@ pub struct ActualbudgetState { pub fn read_actualbudget_state(actualbudget_connection: &mut SqliteConnection) -> Result<ActualbudgetState> { Ok(ActualbudgetState { - actualbudget_first_transaction_date: get_first_actualbudget_transaction_date(actualbudget_connection)?, + actualbudget_first_activity_date: min( + get_first_actualbudget_transaction_date(actualbudget_connection)?, + get_first_zero_budget_date(actualbudget_connection)?, + ), actualbudget_accounts: get_all_actualbudget_accounts(actualbudget_connection)?, actualbudget_categories: get_all_actualbudget_categories(actualbudget_connection)?, actualbudget_payees: get_all_actualbudget_payees(actualbudget_connection)?, diff --git a/rust/actualbudget_to_schist_transformer/src/transform_state/transform_accounts.rs b/rust/actualbudget_to_schist_transformer/src/transform_state/transform_accounts.rs index f4c0773..28d8162 100644 --- a/rust/actualbudget_to_schist_transformer/src/transform_state/transform_accounts.rs +++ b/rust/actualbudget_to_schist_transformer/src/transform_state/transform_accounts.rs @@ -6,14 +6,14 @@ use super::transform_id; pub fn transform_accounts( actualbudget_accounts: &[ActualbudgetAccount], actualbudget_category_transfers_account: &Option<ActualbudgetAccount>, - first_transaction_date: &DateUtc, + first_activity_date: &DateUtc, ) -> Vec<Account> { actualbudget_accounts .iter() .filter(|a| actualbudget_category_transfers_account .clone() .is_some_and(|cta| cta.id != a.id) - ).map(|a| transform_account(a, first_transaction_date)) + ).map(|a| transform_account(a, first_activity_date)) .collect() } diff --git a/rust/actualbudget_to_schist_transformer/src/transform_state/transform_categories.rs b/rust/actualbudget_to_schist_transformer/src/transform_state/transform_categories.rs index b78fd2b..17ce194 100644 --- a/rust/actualbudget_to_schist_transformer/src/transform_state/transform_categories.rs +++ b/rust/actualbudget_to_schist_transformer/src/transform_state/transform_categories.rs @@ -1,4 +1,5 @@ use actualbudget_models::{ActualbudgetCategory, ActualbudgetZeroBudget}; +use itertools::Itertools; use schist_models::{budget_period_unit::BudgetPeriodUnit, category::Category, date_utc::DateUtc}; use super::transform_id; @@ -6,13 +7,32 @@ use super::transform_id; pub fn transform_categories( actualbudget_categories: &[ActualbudgetCategory], actualbudget_zero_budgets: &[ActualbudgetZeroBudget], - before_first_transaction: &DateUtc, + before_first_activity: &DateUtc, ) -> Vec<Category> { + let last_non_zero_month = actualbudget_zero_budgets + .iter() + .map(|zb| zb.month.clone()) + .unique() + .filter(|month| actualbudget_zero_budgets + .iter() + .any(|zb| zb.month == *month && zb.amount != 0) + ).max(); + + let actualbudget_zero_budgets = if let Some(last_non_zero_month) = last_non_zero_month { + &actualbudget_zero_budgets + .iter() + .filter(|zb| zb.month == last_non_zero_month) + .cloned() + .collect::<Vec<_>>() + } else { + actualbudget_zero_budgets + }; + actualbudget_categories.iter().map(|actualbudget_category| Category { id: transform_id(&actualbudget_category.id.clone()), name: actualbudget_category.name.clone(), balance: 0, - balance_date: before_first_transaction.clone(), + balance_date: before_first_activity.clone(), budget_period: 1, budget_period_unit: BudgetPeriodUnit::Month, budget_quantity: get_budget_quantity(actualbudget_category, actualbudget_zero_budgets), diff --git a/rust/actualbudget_to_schist_transformer/src/transform_state/transform_state.rs b/rust/actualbudget_to_schist_transformer/src/transform_state/transform_state.rs index 2864f38..38eabcc 100644 --- a/rust/actualbudget_to_schist_transformer/src/transform_state/transform_state.rs +++ b/rust/actualbudget_to_schist_transformer/src/transform_state/transform_state.rs @@ -14,20 +14,20 @@ fn transform_state_without_context(actualbudget_state: ActualbudgetState) -> Res let (remaining_transactions, account_transfers) = transform_account_transfers( &actualbudget_state.actualbudget_transactions, )?; - let first_transaction_date = - transform_date(&actualbudget_state.actualbudget_first_transaction_date)?; - let before_first_transaction_date = find_date_before(&first_transaction_date)?; + let first_activity_date = + transform_date(&actualbudget_state.actualbudget_first_activity_date)?; + let before_first_activity_date = find_date_before(&first_activity_date)?; let accounts: Vec<Account> = transform_accounts( &actualbudget_state.actualbudget_accounts, &actualbudget_state.actualbudget_category_transfers_account, - &first_transaction_date, + &first_activity_date, ); let budget_drips = transform_budget_drips(&actualbudget_state.actualbudget_zero_budgets)?; let categories: Vec<Category> = transform_categories( &actualbudget_state.actualbudget_categories, &actualbudget_state.actualbudget_zero_budgets, - &before_first_transaction_date, + &before_first_activity_date, ); let (transactions, transaction_categorisations): (Vec<Transaction>, Vec<TransactionCategorisation>) = transform_transactions( @@ -40,7 +40,7 @@ fn transform_state_without_context(actualbudget_state: ActualbudgetState) -> Res )?; Ok(SchistState { - first_transaction_date, + first_transaction_date: first_activity_date, accounts, account_transfers, categories, |
