From 5f4468ad1fc515aadd06cfcb59e26cc30c5ba6df Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Sun, 18 Aug 2019 12:58:09 -0400 Subject: run checks on refresh too --- src/ynab/budget.rs | 65 +++++++++++++++++++++++++++++++++++++++++++----------- 1 file changed, 52 insertions(+), 13 deletions(-) (limited to 'src/ynab/budget.rs') diff --git a/src/ynab/budget.rs b/src/ynab/budget.rs index 1d3b80a..b11e72a 100644 --- a/src/ynab/budget.rs +++ b/src/ynab/budget.rs @@ -1,33 +1,39 @@ pub struct Budget { client: super::client::Client, - budget: ynab_api::models::BudgetDetail, + id: String, + name: String, reimbursables: Vec, } impl Budget { - pub fn new( - client: super::client::Client, - budget: ynab_api::models::BudgetDetail, - ) -> Self { + pub fn new(key: &str) -> Self { + let client = super::client::Client::new(key); + let budget = client.default_budget(); let reimbursables = Self::get_reimbursables(&budget); - Self { + let budget = Self { client, - budget, + id: budget.id.clone(), + name: budget.name.clone(), reimbursables, - } + }; + budget.check(); + budget } pub fn refresh(&mut self) { - self.budget = self.client.default_budget(); - self.reimbursables = Self::get_reimbursables(&self.budget) + let budget = self.client.default_budget(); + self.id = budget.id.clone(); + self.name = budget.name.clone(); + self.reimbursables = Self::get_reimbursables(&budget); + self.check(); } pub fn name(&self) -> String { - self.budget.name.clone() + self.name.clone() } pub fn id(&self) -> String { - self.budget.id.clone() + self.id.clone() } pub fn reimbursables(&self) -> &[super::transaction::Transaction] { @@ -49,7 +55,7 @@ impl Budget { }) .collect(), ); - self.client.update_transactions(&self.budget.id, to_update) + self.client.update_transactions(&self.id, to_update) } fn get_reimbursables( @@ -152,4 +158,37 @@ impl Budget { reimbursables.sort_by_cached_key(|t| t.date.clone()); reimbursables } + + fn check(&self) { + self.check_reconciled(); + self.check_has_inflows(); + } + + fn check_reconciled(&self) { + let reconciled_amount: i64 = self + .reimbursables() + .iter() + .filter(|t| t.reimbursed) + .map(|t| t.amount) + .sum(); + if reconciled_amount != 0 { + eprintln!( + "reconciled reimbursables don't sum to $0.00: ${}", + crate::ynab::format_amount(reconciled_amount) + ); + std::process::exit(1); + } + } + + fn check_has_inflows(&self) { + let txns = self + .reimbursables() + .iter() + .filter(|t| !t.reimbursed && t.amount > 0) + .count(); + if txns == 0 { + eprintln!("no transactions to reconcile"); + std::process::exit(1); + } + } } -- cgit v1.2.3-54-g00ecf