From f75546ed680c80b300dcf4112f03bc3517c84a15 Mon Sep 17 00:00:00 2001 From: Joe Carstairs Date: Sat, 30 Nov 2024 19:27:46 +0000 Subject: AB queries for payees --- rust/actualbudget_queries/tests/common/mod.rs | 2 + .../tests/common/payee_matchers.rs | 124 +++++++++++++++++++++ .../tests/common/payee_names.rs | 17 +++ 3 files changed, 143 insertions(+) create mode 100644 rust/actualbudget_queries/tests/common/payee_matchers.rs create mode 100644 rust/actualbudget_queries/tests/common/payee_names.rs (limited to 'rust/actualbudget_queries/tests/common') diff --git a/rust/actualbudget_queries/tests/common/mod.rs b/rust/actualbudget_queries/tests/common/mod.rs index 9c24578..b19b061 100644 --- a/rust/actualbudget_queries/tests/common/mod.rs +++ b/rust/actualbudget_queries/tests/common/mod.rs @@ -2,5 +2,7 @@ pub mod account_names; pub mod category_names; pub mod db_url; pub mod get_reference_data; +pub mod payee_matchers; +pub mod payee_names; pub mod transaction_matchers; pub mod zero_budget_matchers; diff --git a/rust/actualbudget_queries/tests/common/payee_matchers.rs b/rust/actualbudget_queries/tests/common/payee_matchers.rs new file mode 100644 index 0000000..ccba204 --- /dev/null +++ b/rust/actualbudget_queries/tests/common/payee_matchers.rs @@ -0,0 +1,124 @@ +use std::collections::HashMap; + +use actualbudget_models::{ActualbudgetAccount, ActualbudgetPayee}; +use anyhow::Context; + +use super::{account_names::ACCOUNT_NAMES_DICT, payee_names::PAYEE_NAMES_DICT}; + +pub fn get_payee_matchers( +) -> Vec) -> bool>> { + vec![ + Box::new(|p, a| matches_bank_account_transfer_account(p, a)), + Box::new(|p, a| matches_cash_account_transfer_account(p, a)), + Box::new(|p, a| matches_category_transfers_transfer_account(p, a)), + Box::new(|p, a| matches_starting_balances(p, a)), + Box::new(|p, a| matches_employer(p, a)), + Box::new(|p, a| matches_tesco(p, a)), + ] +} + +fn matches_bank_account_transfer_account( + payee: &ActualbudgetPayee, + accounts: &HashMap, +) -> bool { + let bank_account = accounts + .get(ACCOUNT_NAMES_DICT.bank_account) + .with_context(|| "failed to get bank account") + .unwrap(); + + match payee { + ActualbudgetPayee { + name, + transfer_account_id, + .. + } => name == "" + && transfer_account_id.clone().is_some_and( + |account_id| account_id == bank_account.id, + ), + } +} + +fn matches_cash_account_transfer_account( + payee: &ActualbudgetPayee, + accounts: &HashMap, +) -> bool { + let cash_account = accounts + .get(ACCOUNT_NAMES_DICT.cash_account) + .with_context(|| "failed to find cash account") + .unwrap(); + + match payee { + ActualbudgetPayee { + name, + transfer_account_id, + .. + } => name == "" + && transfer_account_id.clone().is_some_and( + |account_id| account_id == cash_account.id, + ), + } +} + +fn matches_category_transfers_transfer_account( + payee: &ActualbudgetPayee, + accounts: &HashMap, +) -> bool { + let category_transfers_account = accounts + .get(ACCOUNT_NAMES_DICT.transfers_account) + .with_context(|| "failed to find category transfers account") + .unwrap(); + + match payee { + ActualbudgetPayee { + name, + transfer_account_id, + .. + } => name == "" + && transfer_account_id.clone().is_some_and( + |account_id| account_id == category_transfers_account.id, + ), + } +} + +fn matches_starting_balances( + payee: &ActualbudgetPayee, + _accounts: &HashMap, +) -> bool { + match payee { + ActualbudgetPayee { + name, + transfer_account_id, + .. + } => transfer_account_id.is_none() + && name.clone() == PAYEE_NAMES_DICT.starting_balances, + } +} + +fn matches_employer( + payee: &ActualbudgetPayee, + _accounts: &HashMap, +) -> bool { + match payee { + ActualbudgetPayee { + name, + transfer_account_id, + .. + } => transfer_account_id.is_none() + && name == PAYEE_NAMES_DICT.employer, + } +} + + +fn matches_tesco( + payee: &ActualbudgetPayee, + _accounts: &HashMap, +) -> bool { + match payee { + ActualbudgetPayee { + name, + transfer_account_id, + .. + } => transfer_account_id.is_none() + && name == PAYEE_NAMES_DICT.tesco, + } +} diff --git a/rust/actualbudget_queries/tests/common/payee_names.rs b/rust/actualbudget_queries/tests/common/payee_names.rs new file mode 100644 index 0000000..42b6024 --- /dev/null +++ b/rust/actualbudget_queries/tests/common/payee_names.rs @@ -0,0 +1,17 @@ +pub const PAYEE_NAMES: &[&'static str] = &[ + "Starting Balance", + "Employer Ltd", + "Tesco", +]; + +pub struct PayeeNamesDict { + pub starting_balances: &'static str, + pub employer: &'static str, + pub tesco: &'static str, +} + +pub const PAYEE_NAMES_DICT: PayeeNamesDict = PayeeNamesDict { + starting_balances: PAYEE_NAMES[0], + employer: PAYEE_NAMES[1], + tesco: PAYEE_NAMES[2], +}; -- cgit v1.2.3