diff --git a/src/reporting/builders.rs b/src/reporting/builders.rs index 8cd3c11..54717ae 100644 --- a/src/reporting/builders.rs +++ b/src/reporting/builders.rs @@ -19,6 +19,8 @@ use std::collections::HashMap; use std::fmt::Display; +use crate::transaction::update_balances_from_transactions; + use super::calculator::{has_step_or_can_build, HasStepOrCanBuild, ReportingGraphDependencies}; use super::executor::ReportingExecutionError; use super::types::{ @@ -319,17 +321,7 @@ impl ReportingStep for GenerateBalances { let mut balances = BalancesAt { balances: HashMap::new(), }; - - for transaction in transactions.iter() { - for posting in transaction.postings.iter() { - // FIXME: Do currency conversion - let running_balance = - balances.balances.get(&posting.account).unwrap_or(&0) + posting.quantity; - balances - .balances - .insert(posting.account.clone(), running_balance); - } - } + update_balances_from_transactions(&mut balances.balances, transactions.iter()); // Store result products.insert( @@ -546,17 +538,7 @@ impl ReportingStep for UpdateBalancesAt { let mut balances = BalancesAt { balances: opening_balances_at.balances.clone(), }; - - for transaction in transactions.iter() { - for posting in transaction.postings.iter() { - // FIXME: Do currency conversion - let running_balance = - balances.balances.get(&posting.account).unwrap_or(&0) + posting.quantity; - balances - .balances - .insert(posting.account.clone(), running_balance); - } - } + update_balances_from_transactions(&mut balances.balances, transactions.iter()); // Store result products.insert( @@ -720,17 +702,7 @@ impl ReportingStep for UpdateBalancesBetween { let mut balances = BalancesBetween { balances: opening_balances.clone(), }; - - for transaction in transactions.iter() { - for posting in transaction.postings.iter() { - // FIXME: Do currency conversion - let running_balance = - balances.balances.get(&posting.account).unwrap_or(&0) + posting.quantity; - balances - .balances - .insert(posting.account.clone(), running_balance); - } - } + update_balances_from_transactions(&mut balances.balances, transactions.iter()); // Store result products.insert( diff --git a/src/reporting/steps.rs b/src/reporting/steps.rs index b541f4a..ed87930 100644 --- a/src/reporting/steps.rs +++ b/src/reporting/steps.rs @@ -24,6 +24,7 @@ use std::fmt::Display; use chrono::Datelike; use crate::reporting::types::{BalancesAt, DateStartDateEndArgs, ReportingProductId, Transactions}; +use crate::transaction::update_balances_from_transactions; use crate::util::sofy_from_eofy; use super::calculator::ReportingGraphDependencies; @@ -245,17 +246,7 @@ impl ReportingStep for AllTransactionsIncludingRetainedEarnings { let mut balances = BalancesAt { balances: opening_balances.balances.clone(), }; - - for transaction in transactions.transactions.iter() { - for posting in transaction.postings.iter() { - // FIXME: Do currency conversion - let running_balance = - balances.balances.get(&posting.account).unwrap_or(&0) + posting.quantity; - balances - .balances - .insert(posting.account.clone(), running_balance); - } - } + update_balances_from_transactions(&mut balances.balances, transactions.transactions.iter()); // Store result products.insert( diff --git a/src/transaction.rs b/src/transaction.rs index 5a4c1aa..1220c95 100644 --- a/src/transaction.rs +++ b/src/transaction.rs @@ -16,6 +16,8 @@ along with this program. If not, see . */ +use std::collections::HashMap; + use chrono::NaiveDateTime; use crate::QuantityInt; @@ -42,3 +44,16 @@ pub struct Posting { pub quantity: QuantityInt, pub commodity: String, } + +pub(crate) fn update_balances_from_transactions<'a, I: Iterator>( + balances: &mut HashMap, + transactions: I, +) { + for transaction in transactions { + for posting in transaction.postings.iter() { + // FIXME: Do currency conversion + let running_balance = balances.get(&posting.account).unwrap_or(&0) + posting.quantity; + balances.insert(posting.account.clone(), running_balance); + } + } +}