diff options
| author | Joe Carstairs <me@joeac.net> | 2024-11-17 12:16:19 +0000 |
|---|---|---|
| committer | Joe Carstairs <me@joeac.net> | 2024-11-17 12:20:48 +0000 |
| commit | 99fa72e2b9d572e00cd232bd55a3fa24722c3134 (patch) | |
| tree | 6b50ce600fffa07a0c21b7f14d2447fe5ac3c2ed /rust/schist_actualbudget_importer/src/models | |
| parent | 10f071447594f2bdcec84a461df9ad648f71f44b (diff) | |
Refactors workspace
Diffstat (limited to 'rust/schist_actualbudget_importer/src/models')
6 files changed, 127 insertions, 0 deletions
diff --git a/rust/schist_actualbudget_importer/src/models/actualbudget_account.rs b/rust/schist_actualbudget_importer/src/models/actualbudget_account.rs new file mode 100644 index 0000000..b3d00ac --- /dev/null +++ b/rust/schist_actualbudget_importer/src/models/actualbudget_account.rs @@ -0,0 +1,8 @@ +use diesel::prelude::{Queryable, Selectable}; + +#[derive(Queryable, Selectable)] +#[diesel(table_name = crate::schema::accounts)] +pub struct ActualbudgetAccount { + pub id: String, + pub name: String, +} diff --git a/rust/schist_actualbudget_importer/src/models/actualbudget_category.rs b/rust/schist_actualbudget_importer/src/models/actualbudget_category.rs new file mode 100644 index 0000000..cbea99b --- /dev/null +++ b/rust/schist_actualbudget_importer/src/models/actualbudget_category.rs @@ -0,0 +1,8 @@ +use diesel::{prelude::Queryable, Selectable}; + +#[derive(Queryable, Selectable)] +#[diesel(table_name = crate::schema::categories)] +pub struct ActualbudgetCategory { + pub id: String, + pub name: String, +} diff --git a/rust/schist_actualbudget_importer/src/models/actualbudget_date.rs b/rust/schist_actualbudget_importer/src/models/actualbudget_date.rs new file mode 100644 index 0000000..bef160c --- /dev/null +++ b/rust/schist_actualbudget_importer/src/models/actualbudget_date.rs @@ -0,0 +1,75 @@ +use diesel::{backend::Backend, deserialize::{FromSql, FromSqlRow}, expression::AsExpression, sql_types::Integer, sqlite::Sqlite}; + +#[derive(Clone, PartialEq, Eq, Debug, AsExpression, FromSqlRow)] +#[diesel(sql_type=Integer)] +pub struct ActualbudgetDate(i32); + +#[derive(Clone, PartialOrd, PartialEq, Eq)] +enum DatePart { + MonthOfYear, + DayOfMonth, +} + +// actualbudget represents dates as numbers which "look like" the corresponding +// ISO string when written in decimal. E.g. 20240901 represents 1 Sep 2024. It +// also uses month specifiers, e.g. 202409 to represent Sep 2024. In this case, +// we interpret this as the first day of the month, e.g. 2024-09-01. + +impl ActualbudgetDate { + pub fn to_iso(&self) -> String { + format!("{0}-{1}-{2}", self.year(), self.month(), self.day()) + } + + pub fn year(&self) -> String { + self.0.to_string()[0..4].to_string() + } + + pub fn month(&self) -> String { + self.0.to_string()[4..6].to_string() + } + + pub fn day(&self) -> String { + match self.date_part() { + DatePart::DayOfMonth => self.0.to_string()[6..8].to_string(), + DatePart::MonthOfYear => String::from("01"), + } + } + + pub fn from_i32(i: i32) -> Self { + ActualbudgetDate(i) + } + + fn date_part(&self) -> DatePart { + if self.0 < 10000000 { + DatePart::MonthOfYear + } else { + DatePart::DayOfMonth + } + } + + fn dayified_value(&self) -> i32 { + match self.date_part() { + DatePart::DayOfMonth => self.0, + DatePart::MonthOfYear => self.0 * 100 + 1, + } + } +} + +impl Ord for ActualbudgetDate { + fn cmp(&self, other: &Self) -> std::cmp::Ordering { + self.dayified_value().cmp(&other.dayified_value()) + } +} + +impl PartialOrd for ActualbudgetDate { + fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> { + Some(self.cmp(other)) + } +} + +impl FromSql<Integer, Sqlite> for ActualbudgetDate { + fn from_sql(bytes: <Sqlite as Backend>::RawValue<'_>) -> diesel::deserialize::Result<Self> { + let int: i32 = FromSql::<Integer, Sqlite>::from_sql(bytes)?; + Ok(ActualbudgetDate(int)) + } +} diff --git a/rust/schist_actualbudget_importer/src/models/actualbudget_transaction.rs b/rust/schist_actualbudget_importer/src/models/actualbudget_transaction.rs new file mode 100644 index 0000000..be2ca1a --- /dev/null +++ b/rust/schist_actualbudget_importer/src/models/actualbudget_transaction.rs @@ -0,0 +1,18 @@ +use diesel::prelude::{Identifiable, Queryable, QueryableByName, Selectable}; + +use crate::models::actualbudget_date::ActualbudgetDate; + +#[derive(Identifiable, QueryableByName, Queryable, Selectable, Clone)] +#[diesel(table_name = crate::schema::transactions)] +pub struct ActualbudgetTransaction { + pub id: String, + pub is_parent: bool, + pub is_child: bool, + pub account_id: String, + pub category_id: String, + pub amount: i32, + pub payee: String, + pub notes: String, + pub date: ActualbudgetDate, + pub parent_id: Option<String>, +} diff --git a/rust/schist_actualbudget_importer/src/models/actualbudget_zero_budget.rs b/rust/schist_actualbudget_importer/src/models/actualbudget_zero_budget.rs new file mode 100644 index 0000000..6478d34 --- /dev/null +++ b/rust/schist_actualbudget_importer/src/models/actualbudget_zero_budget.rs @@ -0,0 +1,13 @@ +use crate::models::actualbudget_date::ActualbudgetDate; +use diesel::{prelude::{Identifiable, Queryable, QueryableByName, Selectable}, sqlite::Sqlite}; + +#[derive(Identifiable, QueryableByName, Queryable, Selectable, Clone)] +#[diesel(table_name = crate::schema::zero_budgets)] +#[diesel(check_for_backend(Sqlite))] +pub struct ActualbudgetZeroBudget { + pub id: String, + pub month: ActualbudgetDate, + pub category_id: String, + pub amount: i32, + pub do_carry_over: i32, +} diff --git a/rust/schist_actualbudget_importer/src/models/mod.rs b/rust/schist_actualbudget_importer/src/models/mod.rs new file mode 100644 index 0000000..1c97c65 --- /dev/null +++ b/rust/schist_actualbudget_importer/src/models/mod.rs @@ -0,0 +1,5 @@ +pub mod actualbudget_account; +pub mod actualbudget_category; +pub mod actualbudget_date; +pub mod actualbudget_transaction; +pub mod actualbudget_zero_budget; |
