aboutsummaryrefslogtreecommitdiff
path: root/src/payer.rs
blob: 48cee52db81b6ae04e8c55aea3a3490356e6d1d8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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()
}