summaryrefslogtreecommitdiff
path: root/rust/actualbudget_to_schist_transformer/src/transform_state
diff options
context:
space:
mode:
authorJoe Carstairs <me@joeac.net>2024-12-05 23:15:46 +0000
committerJoe Carstairs <me@joeac.net>2024-12-05 23:15:46 +0000
commitee191d50c7bd61fd419ac7928a3cb6498ee34503 (patch)
tree0eaeaaad626943dc53c768ed2c9c330e61cf3972 /rust/actualbudget_to_schist_transformer/src/transform_state
parentd7081a6e0c5eed4438f9f3e8950901031bfe70ec (diff)
Gets first activity date from AB state
Diffstat (limited to 'rust/actualbudget_to_schist_transformer/src/transform_state')
-rw-r--r--rust/actualbudget_to_schist_transformer/src/transform_state/transform_accounts.rs4
-rw-r--r--rust/actualbudget_to_schist_transformer/src/transform_state/transform_categories.rs24
-rw-r--r--rust/actualbudget_to_schist_transformer/src/transform_state/transform_state.rs12
3 files changed, 30 insertions, 10 deletions
diff --git a/rust/actualbudget_to_schist_transformer/src/transform_state/transform_accounts.rs b/rust/actualbudget_to_schist_transformer/src/transform_state/transform_accounts.rs
index f4c0773..28d8162 100644
--- a/rust/actualbudget_to_schist_transformer/src/transform_state/transform_accounts.rs
+++ b/rust/actualbudget_to_schist_transformer/src/transform_state/transform_accounts.rs
@@ -6,14 +6,14 @@ use super::transform_id;
pub fn transform_accounts(
actualbudget_accounts: &[ActualbudgetAccount],
actualbudget_category_transfers_account: &Option<ActualbudgetAccount>,
- first_transaction_date: &DateUtc,
+ first_activity_date: &DateUtc,
) -> Vec<Account> {
actualbudget_accounts
.iter()
.filter(|a| actualbudget_category_transfers_account
.clone()
.is_some_and(|cta| cta.id != a.id)
- ).map(|a| transform_account(a, first_transaction_date))
+ ).map(|a| transform_account(a, first_activity_date))
.collect()
}
diff --git a/rust/actualbudget_to_schist_transformer/src/transform_state/transform_categories.rs b/rust/actualbudget_to_schist_transformer/src/transform_state/transform_categories.rs
index b78fd2b..17ce194 100644
--- a/rust/actualbudget_to_schist_transformer/src/transform_state/transform_categories.rs
+++ b/rust/actualbudget_to_schist_transformer/src/transform_state/transform_categories.rs
@@ -1,4 +1,5 @@
use actualbudget_models::{ActualbudgetCategory, ActualbudgetZeroBudget};
+use itertools::Itertools;
use schist_models::{budget_period_unit::BudgetPeriodUnit, category::Category, date_utc::DateUtc};
use super::transform_id;
@@ -6,13 +7,32 @@ use super::transform_id;
pub fn transform_categories(
actualbudget_categories: &[ActualbudgetCategory],
actualbudget_zero_budgets: &[ActualbudgetZeroBudget],
- before_first_transaction: &DateUtc,
+ before_first_activity: &DateUtc,
) -> Vec<Category> {
+ let last_non_zero_month = actualbudget_zero_budgets
+ .iter()
+ .map(|zb| zb.month.clone())
+ .unique()
+ .filter(|month| actualbudget_zero_budgets
+ .iter()
+ .any(|zb| zb.month == *month && zb.amount != 0)
+ ).max();
+
+ let actualbudget_zero_budgets = if let Some(last_non_zero_month) = last_non_zero_month {
+ &actualbudget_zero_budgets
+ .iter()
+ .filter(|zb| zb.month == last_non_zero_month)
+ .cloned()
+ .collect::<Vec<_>>()
+ } else {
+ actualbudget_zero_budgets
+ };
+
actualbudget_categories.iter().map(|actualbudget_category| Category {
id: transform_id(&actualbudget_category.id.clone()),
name: actualbudget_category.name.clone(),
balance: 0,
- balance_date: before_first_transaction.clone(),
+ balance_date: before_first_activity.clone(),
budget_period: 1,
budget_period_unit: BudgetPeriodUnit::Month,
budget_quantity: get_budget_quantity(actualbudget_category, actualbudget_zero_budgets),
diff --git a/rust/actualbudget_to_schist_transformer/src/transform_state/transform_state.rs b/rust/actualbudget_to_schist_transformer/src/transform_state/transform_state.rs
index 2864f38..38eabcc 100644
--- a/rust/actualbudget_to_schist_transformer/src/transform_state/transform_state.rs
+++ b/rust/actualbudget_to_schist_transformer/src/transform_state/transform_state.rs
@@ -14,20 +14,20 @@ fn transform_state_without_context(actualbudget_state: ActualbudgetState) -> Res
let (remaining_transactions, account_transfers) = transform_account_transfers(
&actualbudget_state.actualbudget_transactions,
)?;
- let first_transaction_date =
- transform_date(&actualbudget_state.actualbudget_first_transaction_date)?;
- let before_first_transaction_date = find_date_before(&first_transaction_date)?;
+ let first_activity_date =
+ transform_date(&actualbudget_state.actualbudget_first_activity_date)?;
+ let before_first_activity_date = find_date_before(&first_activity_date)?;
let accounts: Vec<Account> =
transform_accounts(
&actualbudget_state.actualbudget_accounts,
&actualbudget_state.actualbudget_category_transfers_account,
- &first_transaction_date,
+ &first_activity_date,
);
let budget_drips = transform_budget_drips(&actualbudget_state.actualbudget_zero_budgets)?;
let categories: Vec<Category> = transform_categories(
&actualbudget_state.actualbudget_categories,
&actualbudget_state.actualbudget_zero_budgets,
- &before_first_transaction_date,
+ &before_first_activity_date,
);
let (transactions, transaction_categorisations): (Vec<Transaction>, Vec<TransactionCategorisation>) =
transform_transactions(
@@ -40,7 +40,7 @@ fn transform_state_without_context(actualbudget_state: ActualbudgetState) -> Res
)?;
Ok(SchistState {
- first_transaction_date,
+ first_transaction_date: first_activity_date,
accounts,
account_transfers,
categories,