aboutsummaryrefslogtreecommitdiff
path: root/src/controller/balance.rs
diff options
context:
space:
mode:
authorJoris Guyonvarch2026-04-18 11:04:47 +0200
committerJoris Guyonvarch2026-04-18 11:05:17 +0200
commit6d1300640051baa23360846197b54e1e69ae32e3 (patch)
tree46219dcf5b5c9e5da0920ffd966d49ba80947a9b /src/controller/balance.rs
parentb35589eb90f2e5ee5521964e64eb578e9eb99032 (diff)
Add balancing capabilities
If payment are too unbalanced, it’s easier to make a transfer.
Diffstat (limited to 'src/controller/balance.rs')
-rw-r--r--src/controller/balance.rs20
1 files changed, 19 insertions, 1 deletions
diff --git a/src/controller/balance.rs b/src/controller/balance.rs
index 309f15c..6cb937b 100644
--- a/src/controller/balance.rs
+++ b/src/controller/balance.rs
@@ -7,6 +7,7 @@ use crate::controller::utils;
use crate::controller::wallet::Wallet;
use crate::db;
use crate::model::user::User;
+use crate::model::balancing::Balancing;
use crate::payer;
use crate::templates;
@@ -22,7 +23,10 @@ pub async fn get(wallet: &Wallet) -> Response<Full<Bytes>> {
get_template_user_incomes(&users, &user_incomes);
let total_income: i64 = user_incomes.values().sum();
- let user_payments = db::payments::repartition(&wallet.db_conn).await;
+ let user_payments = with_balancing(
+ db::payments::repartition(&wallet.db_conn).await,
+ db::balancing::list(&wallet.db_conn).await
+ );
let template_user_payments =
get_template_user_payments(&users, &user_payments);
let total_payments: i64 = user_payments.iter().map(|p| p.1).sum();
@@ -67,3 +71,17 @@ fn get_template_user_incomes(
user_incomes.sort_by_key(|i| i.1);
user_incomes
}
+
+fn with_balancing(
+ user_payments: HashMap<i64, i64>,
+ balancings: Vec<Balancing>
+) -> HashMap<i64, i64> {
+ let mut user_payments = user_payments;
+ for balancing in balancings {
+ let src = user_payments.entry(balancing.source).or_insert(0);
+ *src += balancing.amount;
+ let dest = user_payments.entry(balancing.destination).or_insert(0);
+ *dest -= balancing.amount;
+ }
+ user_payments
+}