summaryrefslogtreecommitdiff
path: root/backend/core/src/utils/calculate_budgets_accrual.rs
diff options
context:
space:
mode:
authorJoe Carstairs <me@joeac.net>2024-10-30 07:27:13 +0000
committerJoe Carstairs <me@joeac.net>2024-10-30 08:50:45 +0000
commit828b9ae9f6217f7e5e97ec704134c786dd401bad (patch)
treec920b8874682e89ba05b6e1ca20275bfd5878d87 /backend/core/src/utils/calculate_budgets_accrual.rs
parent6e9f0069f5d1e4cfbf7f9feb8536795a78c818f6 (diff)
Separates date_utc and datetime_utc
Diffstat (limited to 'backend/core/src/utils/calculate_budgets_accrual.rs')
-rw-r--r--backend/core/src/utils/calculate_budgets_accrual.rs67
1 files changed, 30 insertions, 37 deletions
diff --git a/backend/core/src/utils/calculate_budgets_accrual.rs b/backend/core/src/utils/calculate_budgets_accrual.rs
index 22061ee..56171ca 100644
--- a/backend/core/src/utils/calculate_budgets_accrual.rs
+++ b/backend/core/src/utils/calculate_budgets_accrual.rs
@@ -1,10 +1,9 @@
-use crate::models::{
- budget_update::BudgetUpdate,
- category::Category,
- date_time_utc::DateTimeUtc
-};
+use anyhow::Result;
+use crate::{models::{
+ budget_update::BudgetUpdate, category::Category, date_utc::DateUtc
+}, traits::nowlike::Nowlike};
-pub fn calculate_budgets_accrual(category: &Category, budget_updates: &[BudgetUpdate]) -> i64 {
+pub fn calculate_budgets_accrual(category: &Category, budget_updates: &[BudgetUpdate]) -> Result<i64> {
let mut budget_updates = budget_updates
.iter()
.filter(|bu| bu.category_id == category.id)
@@ -13,28 +12,30 @@ pub fn calculate_budgets_accrual(category: &Category, budget_updates: &[BudgetUp
budget_updates.reverse();
let mut budgets_accrual = 0.0_f64;
- let mut calculated_back_to_date = DateTimeUtc::now();
+ let mut calculated_back_to_date = DateUtc::now();
for budget_update in budget_updates {
let days_on_this_budget = calculated_back_to_date.day_diff(&budget_update.date);
if days_on_this_budget == 0_u32 {
- continue;
+ return Err(anyhow::Error::msg(format!(
+ "failed to calculate budgets accrual since two budget updates had the same date ({})",
+ budget_update.date,
+ )));
}
let budget_per_day = budget_update.new_budget as f64 / budget_update.new_period as f64;
budgets_accrual += days_on_this_budget as f64 * budget_per_day;
calculated_back_to_date = budget_update.date.clone();
}
- budgets_accrual.floor() as i64
+ Ok(budgets_accrual.floor() as i64)
}
#[cfg(test)]
mod test {
- use chrono::{Days, Timelike, Utc};
+ use chrono::{Days, Utc};
use crate::{
- models::{budget_update::BudgetUpdate, category::Category, date_time_utc::DateTimeUtc},
- utils::calculate_budgets_accrual,
+ models::{budget_update::BudgetUpdate, category::Category, date_utc::DateUtc}, traits::nowlike::Nowlike, utils::calculate_budgets_accrual
};
#[test]
@@ -47,7 +48,8 @@ mod test {
let result = calculate_budgets_accrual(&category, &budget_updates);
- assert_eq!(result, 0_i64);
+ assert!(result.is_ok());
+ assert_eq!(result.unwrap(), 0_i64);
}
#[test]
@@ -59,14 +61,15 @@ mod test {
let budget_updates = [BudgetUpdate {
id: 0,
category_id: 1,
- date: DateTimeUtc::now(),
+ date: DateUtc::now(),
new_budget: 100,
new_period: 1,
}];
let result = calculate_budgets_accrual(&category, &budget_updates);
- assert_eq!(result, 0_i64);
+ assert!(result.is_ok());
+ assert_eq!(result.unwrap(), 0_i64);
}
#[test]
@@ -78,14 +81,15 @@ mod test {
let budget_updates = [BudgetUpdate {
id: 0,
category_id: 0,
- date: DateTimeUtc::new(&Utc::now().checked_sub_days(Days::new(120)).unwrap()),
+ date: DateUtc::from(Utc::now().checked_sub_days(Days::new(120)).unwrap()),
new_budget: 100,
new_period: 1,
}];
let result = calculate_budgets_accrual(&category, &budget_updates);
- assert_eq!(result, 12_000);
+ assert!(result.is_ok());
+ assert_eq!(result.unwrap(), 12_000);
}
#[test]
@@ -98,14 +102,14 @@ mod test {
BudgetUpdate {
id: 0,
category_id: 0,
- date: DateTimeUtc::new(&Utc::now().checked_sub_days(Days::new(60)).unwrap()),
+ date: DateUtc::from(&Utc::now().checked_sub_days(Days::new(60)).unwrap()),
new_budget: 200,
new_period: 1,
},
BudgetUpdate {
id: 0,
category_id: 0,
- date: DateTimeUtc::new(&Utc::now().checked_sub_days(Days::new(120)).unwrap()),
+ date: DateUtc::from(&Utc::now().checked_sub_days(Days::new(120)).unwrap()),
new_budget: 100,
new_period: 1,
},
@@ -113,11 +117,12 @@ mod test {
let result = calculate_budgets_accrual(&category, &budget_updates);
- assert_eq!(result, 18_000);
+ assert!(result.is_ok());
+ assert_eq!(result.unwrap(), 18_000);
}
#[test]
- fn when_two_budget_updates_on_same_day_then_uses_latest_only() {
+ fn when_two_budget_updates_on_same_day_then_returns_err() {
let category = Category {
id: 0,
name: String::from("Groceries"),
@@ -126,26 +131,14 @@ mod test {
BudgetUpdate {
id: 0,
category_id: 0,
- date: DateTimeUtc::new(
- &Utc::now()
- .checked_sub_days(Days::new(120))
- .unwrap()
- .with_hour(13)
- .unwrap(),
- ),
+ date: DateUtc::from_ymd(2020, 12, 25).unwrap(),
new_budget: 200,
new_period: 1,
},
BudgetUpdate {
id: 0,
category_id: 0,
- date: DateTimeUtc::new(
- &Utc::now()
- .checked_sub_days(Days::new(120))
- .unwrap()
- .with_hour(12)
- .unwrap(),
- ),
+ date: DateUtc::from_ymd(2020, 12, 25).unwrap(),
new_budget: 100,
new_period: 1,
},
@@ -156,7 +149,7 @@ mod test {
let result_leftways = calculate_budgets_accrual(&category, &budget_updates);
let result_rightways = calculate_budgets_accrual(&category, &budget_updates_reversed);
- assert_eq!(result_leftways, 24_000);
- assert_eq!(result_rightways, 24_000);
+ assert!(result_leftways.is_err());
+ assert!(result_rightways.is_err());
}
}