summaryrefslogtreecommitdiff
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
parentd7081a6e0c5eed4438f9f3e8950901031bfe70ec (diff)
Gets first activity date from AB state
-rw-r--r--rust/actualbudget_to_schist_transformer/src/actualbudget_state.rs11
-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
4 files changed, 38 insertions, 13 deletions
diff --git a/rust/actualbudget_to_schist_transformer/src/actualbudget_state.rs b/rust/actualbudget_to_schist_transformer/src/actualbudget_state.rs
index 76b5114..5379b62 100644
--- a/rust/actualbudget_to_schist_transformer/src/actualbudget_state.rs
+++ b/rust/actualbudget_to_schist_transformer/src/actualbudget_state.rs
@@ -1,10 +1,12 @@
+use std::cmp::min;
+
use actualbudget_models::{ActualbudgetAccount, ActualbudgetCategory, ActualbudgetDate, ActualbudgetPayee, ActualbudgetTransaction, ActualbudgetZeroBudget};
-use actualbudget_queries::{actualbudget_accounts::{get_all_actualbudget_accounts, get_category_transfers_account}, actualbudget_categories::get_all_actualbudget_categories, actualbudget_payees::get_all_actualbudget_payees, actualbudget_transactions::{get_all_actualbudget_transactions, get_first_actualbudget_transaction_date}, actualbudget_zero_budgets::get_all_actualbudget_zero_budgets};
+use actualbudget_queries::{actualbudget_accounts::{get_all_actualbudget_accounts, get_category_transfers_account}, actualbudget_categories::get_all_actualbudget_categories, actualbudget_payees::get_all_actualbudget_payees, actualbudget_transactions::{get_all_actualbudget_transactions, get_first_actualbudget_transaction_date}, actualbudget_zero_budgets::{get_all_actualbudget_zero_budgets, get_first_zero_budget_date}};
use anyhow::Result;
use diesel::SqliteConnection;
pub struct ActualbudgetState {
- pub actualbudget_first_transaction_date: ActualbudgetDate,
+ pub actualbudget_first_activity_date: ActualbudgetDate,
pub actualbudget_accounts: Vec<ActualbudgetAccount>,
pub actualbudget_categories: Vec<ActualbudgetCategory>,
pub actualbudget_payees: Vec<ActualbudgetPayee>,
@@ -15,7 +17,10 @@ pub struct ActualbudgetState {
pub fn read_actualbudget_state(actualbudget_connection: &mut SqliteConnection) -> Result<ActualbudgetState> {
Ok(ActualbudgetState {
- actualbudget_first_transaction_date: get_first_actualbudget_transaction_date(actualbudget_connection)?,
+ actualbudget_first_activity_date: min(
+ get_first_actualbudget_transaction_date(actualbudget_connection)?,
+ get_first_zero_budget_date(actualbudget_connection)?,
+ ),
actualbudget_accounts: get_all_actualbudget_accounts(actualbudget_connection)?,
actualbudget_categories: get_all_actualbudget_categories(actualbudget_connection)?,
actualbudget_payees: get_all_actualbudget_payees(actualbudget_connection)?,
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,