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);
+ }
+ }
+}