aboutsummaryrefslogtreecommitdiff
path: root/src/payer.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/payer.rs')
-rw-r--r--src/payer.rs38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/payer.rs b/src/payer.rs
new file mode 100644
index 0000000..48cee52
--- /dev/null
+++ b/src/payer.rs
@@ -0,0 +1,38 @@
+use std::collections::HashMap;
+
+use crate::model::user::User;
+
+pub fn exceeding(
+ users: &Vec<User>,
+ user_incomes: &HashMap<i64, i64>,
+ user_payments: &HashMap<i64, i64>,
+) -> Vec<(String, i64)> {
+ let ratios = users.into_iter().map(|u| {
+ let income = *user_incomes.get(&u.id).unwrap_or(&0);
+ if income == 0 {
+ (u.name.clone(), 0, 0.0)
+ } else {
+ let payments = *user_payments.get(&u.id).unwrap_or(&0);
+ let ratio = payments as f64 / income as f64;
+ (u.name.clone(), income, ratio)
+ }
+ });
+ let min_ratio = ratios
+ .clone()
+ .map(|r| r.2)
+ .min_by(|r1, r2| {
+ ((r1 * 100_000_000.0).round() as i64)
+ .cmp(&((r2 * 100_000_000.0).round() as i64))
+ })
+ .unwrap_or(0.0);
+ ratios
+ .filter_map(|r| {
+ let exceeding = ((r.2 - min_ratio) * r.1 as f64).round() as i64;
+ if exceeding == 0 {
+ None
+ } else {
+ Some((r.0, exceeding))
+ }
+ })
+ .collect()
+}