From 41df9d4e94bad6b89f0b4e4e535a6e30576b2879 Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Sat, 17 Aug 2019 04:24:54 -0400 Subject: display the account name too --- src/views/txn_table.rs | 6 +++ src/ynab/budget.rs | 130 ++++++++++++++++++++++++++---------------------- src/ynab/transaction.rs | 3 ++ 3 files changed, 79 insertions(+), 60 deletions(-) diff --git a/src/views/txn_table.rs b/src/views/txn_table.rs index 5b93829..7314337 100644 --- a/src/views/txn_table.rs +++ b/src/views/txn_table.rs @@ -4,6 +4,7 @@ use cursive::view::{Identifiable, ViewWrapper}; enum TxnColumn { Selected, Date, + Account, Payee, Amount, TotalAmount, @@ -52,6 +53,9 @@ impl cursive_table_view::TableViewItem } } TxnColumn::Date => self.date.clone(), + TxnColumn::Account => { + self.account.clone().unwrap_or_else(|| "".to_string()) + } TxnColumn::Payee => { self.payee.clone().unwrap_or_else(|| "".to_string()) } @@ -73,6 +77,7 @@ impl cursive_table_view::TableViewItem match column { TxnColumn::Selected => std::cmp::Ordering::Equal, TxnColumn::Date => self.date.cmp(&other.date), + TxnColumn::Account => self.account.cmp(&other.account), TxnColumn::Payee => self.payee.cmp(&other.payee), TxnColumn::Amount => self.amount.cmp(&other.amount), TxnColumn::TotalAmount => self.amount.cmp(&other.total_amount), @@ -107,6 +112,7 @@ fn txn_table( let mut table = cursive_table_view::TableView::new() .column(TxnColumn::Selected, "Sel", |c| c.width(3)) .column(TxnColumn::Date, "Date", |c| c.width(10)) + .column(TxnColumn::Account, "Account", |c| c.width(15)) .column(TxnColumn::Payee, "Payee", |c| c) .column(TxnColumn::Amount, "Amount", |c| { c.align(cursive::align::HAlign::Right).width(10) diff --git a/src/ynab/budget.rs b/src/ynab/budget.rs index dfaaf81..c5a9cde 100644 --- a/src/ynab/budget.rs +++ b/src/ynab/budget.rs @@ -60,78 +60,88 @@ impl Budget { panic!("no categories found") }; - let mut reimbursables = vec![]; + let mut payee_map = std::collections::HashMap::new(); if let Some(payees) = &budget.payees { - let mut payee_map = std::collections::HashMap::new(); for p in payees { payee_map.insert(p.id.clone(), p.name.clone()); } - let payee_map = payee_map; - - let mut transaction_map = std::collections::HashMap::new(); - if let Some(transactions) = &budget.transactions { - for t in transactions { - transaction_map.insert(t.id.clone(), t); - - if let Some(category_id) = &t.category_id { - if category_id != &reimbursables_id { - continue; - } - } else { + } else { + panic!("no payees?"); + } + let payee_map = payee_map; + + let mut account_map = std::collections::HashMap::new(); + if let Some(accounts) = &budget.accounts { + for a in accounts { + account_map.insert(a.id.clone(), a.name.clone()); + } + } + + let mut reimbursables = vec![]; + + let mut transaction_map = std::collections::HashMap::new(); + if let Some(transactions) = &budget.transactions { + for t in transactions { + transaction_map.insert(t.id.clone(), t); + + if let Some(category_id) = &t.category_id { + if category_id != &reimbursables_id { continue; } - - let payee = t - .payee_id - .iter() - .map(|payee_id| payee_map.get(payee_id).cloned()) - .next() - .unwrap_or(None); - - let mut txn = - super::transaction::Transaction::from_transaction(t); - txn.payee = payee; - reimbursables.push(txn); + } else { + continue; } + + let payee = t + .payee_id + .iter() + .map(|payee_id| payee_map.get(payee_id).cloned()) + .next() + .unwrap_or(None); + let account = account_map.get(&t.account_id).cloned(); + + let mut txn = + super::transaction::Transaction::from_transaction(t); + txn.payee = payee; + txn.account = account; + reimbursables.push(txn); } - let transaction_map = transaction_map; - - if let Some(subtransactions) = &budget.subtransactions { - for st in subtransactions { - if let Some(category_id) = &st.category_id { - if category_id != &reimbursables_id { - continue; - } - } else { + } + let transaction_map = transaction_map; + + if let Some(subtransactions) = &budget.subtransactions { + for st in subtransactions { + if let Some(category_id) = &st.category_id { + if category_id != &reimbursables_id { continue; } - - let t = transaction_map[&st.transaction_id]; - let payee = st - .payee_id - .iter() - .map(|payee_id| payee_map.get(payee_id).cloned()) - .next() - .unwrap_or_else(|| { - t.payee_id - .iter() - .map(|payee_id| { - payee_map.get(payee_id).cloned() - }) - .next() - .unwrap_or(None) - }); - - let mut txn = - super::transaction::Transaction::from_sub_transaction( - t, st, - ); - txn.payee = payee; - reimbursables.push(txn); + } else { + continue; } + + let t = transaction_map[&st.transaction_id]; + let payee = st + .payee_id + .iter() + .map(|payee_id| payee_map.get(payee_id).cloned()) + .next() + .unwrap_or_else(|| { + t.payee_id + .iter() + .map(|payee_id| payee_map.get(payee_id).cloned()) + .next() + .unwrap_or(None) + }); + let account = account_map.get(&t.account_id).cloned(); + + let mut txn = + super::transaction::Transaction::from_sub_transaction( + t, st, + ); + txn.payee = payee; + txn.account = account; + reimbursables.push(txn); } - } else { - panic!("no payees?"); } reimbursables.sort_by_cached_key(|t| t.date.clone()); diff --git a/src/ynab/transaction.rs b/src/ynab/transaction.rs index 38e5d54..be31019 100644 --- a/src/ynab/transaction.rs +++ b/src/ynab/transaction.rs @@ -12,6 +12,7 @@ pub struct Transaction { pub category_id: Option, pub import_id: Option, + pub account: Option, pub payee: Option, pub total_amount: i64, pub reimbursed: bool, @@ -40,6 +41,7 @@ impl Transaction { category_id: t.category_id.clone(), import_id: t.import_id.clone(), + account: None, payee: None, total_amount: t.amount, reimbursed, @@ -69,6 +71,7 @@ impl Transaction { category_id: t.category_id.clone(), import_id: t.import_id.clone(), + account: None, payee: None, total_amount: t.amount, reimbursed, -- cgit v1.2.3