diff options
| author | Joe Carstairs <me@joeac.net> | 2024-11-30 19:27:46 +0000 |
|---|---|---|
| committer | Joe Carstairs <me@joeac.net> | 2024-11-30 19:27:46 +0000 |
| commit | f75546ed680c80b300dcf4112f03bc3517c84a15 (patch) | |
| tree | 3f6ff67ba4cfac3552e0cc0c71fe5d02acc49bdb /rust/actualbudget_queries/tests/common/payee_matchers.rs | |
| parent | 1e09de031629662e87f14eaa0b6355e3518167cf (diff) | |
AB queries for payees
Diffstat (limited to 'rust/actualbudget_queries/tests/common/payee_matchers.rs')
| -rw-r--r-- | rust/actualbudget_queries/tests/common/payee_matchers.rs | 124 |
1 files changed, 124 insertions, 0 deletions
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<Box<dyn Fn(&ActualbudgetPayee, &HashMap<String, ActualbudgetAccount>) -> 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<String, ActualbudgetAccount>, +) -> 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<String, ActualbudgetAccount>, +) -> 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<String, ActualbudgetAccount>, +) -> 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<String, ActualbudgetAccount>, +) -> 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<String, ActualbudgetAccount>, +) -> 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<String, ActualbudgetAccount>, +) -> bool { + match payee { + ActualbudgetPayee { + name, + transfer_account_id, + .. + } => transfer_account_id.is_none() + && name == PAYEE_NAMES_DICT.tesco, + } +} |
