From 283475af457c71db280fe7732218450a3163614b Mon Sep 17 00:00:00 2001 From: Joe Carstairs Date: Sat, 30 Nov 2024 22:26:18 +0000 Subject: Transforms budget drips with unique IDs across a single AB zero budget --- .../src/transform_state/transform_budget_drips.rs | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/rust/actualbudget_to_schist_transformer/src/transform_state/transform_budget_drips.rs b/rust/actualbudget_to_schist_transformer/src/transform_state/transform_budget_drips.rs index 2e9125b..7ec41af 100644 --- a/rust/actualbudget_to_schist_transformer/src/transform_state/transform_budget_drips.rs +++ b/rust/actualbudget_to_schist_transformer/src/transform_state/transform_budget_drips.rs @@ -1,3 +1,5 @@ +use std::hash::{DefaultHasher, Hash, Hasher}; + use actualbudget_models::ActualbudgetZeroBudget; use anyhow::{Context, Result}; use itertools::Itertools; @@ -46,7 +48,7 @@ fn map_actualbudget_zero_budget_to_budget_drips( let budget_drips: Vec = days_in_month.iter().map(|&date| BudgetDrip { - id: transform_id(&actualbudget_zero_budget.id), + id: transform_budget_drip_id(&actualbudget_zero_budget, &date), category_id: transform_id(&actualbudget_zero_budget.category_id), date, quantity: if date == first_day_of_month { @@ -85,6 +87,18 @@ fn group_actualbudget_zero_budgets_by_category_id( ).collect() } +fn transform_budget_drip_id( + actualbudget_zero_budget: &ActualbudgetZeroBudget, + date: &DateUtc, +) -> i32 { + let mut hasher = DefaultHasher::new(); + let unique_str = actualbudget_zero_budget.id.clone() + date.to_string().as_str(); + unique_str.hash(&mut hasher); + (hasher.finish() % std::convert::TryInto::::try_into(i32::MAX).unwrap()) + .try_into() + .unwrap() +} + #[cfg(test)] mod test { use actualbudget_fakes::actualbudget_zero_budget::make_fake_actualbudget_zero_budget_builder; -- cgit v1.2.3