summaryrefslogtreecommitdiff
path: root/rust/schist_models/src
diff options
context:
space:
mode:
Diffstat (limited to 'rust/schist_models/src')
-rw-r--r--rust/schist_models/src/budget.rs43
-rw-r--r--rust/schist_models/src/budget_drip.rs14
-rw-r--r--rust/schist_models/src/budget_period_unit.rs112
-rw-r--r--rust/schist_models/src/budget_update.rs16
-rw-r--r--rust/schist_models/src/category.rs7
-rw-r--r--rust/schist_models/src/category_balance.rs7
-rw-r--r--rust/schist_models/src/category_budget.rs9
-rw-r--r--rust/schist_models/src/lib.rs6
-rw-r--r--rust/schist_models/src/schema.rs14
9 files changed, 144 insertions, 84 deletions
diff --git a/rust/schist_models/src/budget.rs b/rust/schist_models/src/budget.rs
deleted file mode 100644
index 03261e5..0000000
--- a/rust/schist_models/src/budget.rs
+++ /dev/null
@@ -1,43 +0,0 @@
-use serde::Serialize;
-
-use super::budget_update::BudgetUpdate;
-
-#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize)]
-pub struct Budget {
- pub quantity: i32,
- pub period: i32,
-}
-
-impl From<&BudgetUpdate> for Budget {
- fn from(budget_update: &BudgetUpdate) -> Self {
- Self {
- quantity: budget_update.new_budget,
- period: budget_update.new_period,
- }
- }
-}
-
-#[cfg(test)]
-mod test {
- use crate::date_utc::DateUtc;
- use schist_traits::nowlike::Nowlike;
-
- use super::*;
-
- #[test]
- fn when_from_budget_update_then_returns_budget() {
- let quantity = 2;
- let period = 3;
- let budget_update = BudgetUpdate {
- id: 0,
- category_id: 1,
- date: DateUtc::now(),
- new_budget: quantity,
- new_period: period,
- };
-
- let budget = Budget::from(&budget_update);
-
- assert_eq!(budget, Budget { quantity, period });
- }
-}
diff --git a/rust/schist_models/src/budget_drip.rs b/rust/schist_models/src/budget_drip.rs
new file mode 100644
index 0000000..f467ecd
--- /dev/null
+++ b/rust/schist_models/src/budget_drip.rs
@@ -0,0 +1,14 @@
+use derive_builder::Builder;
+use diesel::prelude::{Identifiable, Insertable, Queryable, Selectable};
+use serde::{Deserialize, Serialize};
+
+use crate::date_utc::DateUtc;
+
+#[derive(Builder, Queryable, Identifiable, Selectable, Debug, PartialEq, Serialize, Deserialize, Insertable)]
+#[diesel(table_name = crate::schema::budget_drips)]
+pub struct BudgetDrip {
+ pub id: i32,
+ pub category_id: i32,
+ pub date: DateUtc,
+ pub quantity: i32,
+}
diff --git a/rust/schist_models/src/budget_period_unit.rs b/rust/schist_models/src/budget_period_unit.rs
new file mode 100644
index 0000000..77d8641
--- /dev/null
+++ b/rust/schist_models/src/budget_period_unit.rs
@@ -0,0 +1,112 @@
+use core::fmt;
+use std::str::FromStr;
+
+use anyhow::{Result, bail};
+use diesel::{backend::Backend, deserialize::{self, FromSql, FromSqlRow}, expression::AsExpression, serialize::{self, ToSql}, sql_types::Text, sqlite::Sqlite};
+use serde::{Deserialize, Serialize};
+
+#[derive(
+ Eq,
+ PartialEq,
+ Serialize,
+ Deserialize,
+ Clone,
+ Debug,
+ AsExpression,
+ FromSqlRow,
+)]
+#[diesel(sql_type=Text)]
+pub enum BudgetPeriodUnit {
+ Day,
+ Month,
+ Year,
+}
+
+impl fmt::Display for BudgetPeriodUnit {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ match self {
+ BudgetPeriodUnit::Day => "DAY".fmt(f),
+ BudgetPeriodUnit::Month => "MONTH".fmt(f),
+ BudgetPeriodUnit::Year => "YEAR".fmt(f),
+ }
+ }
+}
+
+impl FromStr for BudgetPeriodUnit {
+ type Err = anyhow::Error;
+
+ fn from_str(s: &str) -> Result<Self> {
+ match s {
+ "DAY" => Ok(BudgetPeriodUnit::Day),
+ "MONTH" => Ok(BudgetPeriodUnit::Month),
+ "YEAR" => Ok(BudgetPeriodUnit::Year),
+ _ => bail!("\"{}\" is not a valid budget period unit. Valid values are: DAY, MONTH, YEAR", s),
+ }
+ }
+}
+
+impl ToSql<Text, Sqlite> for BudgetPeriodUnit {
+ fn to_sql<'b>(
+ &'b self,
+ out: &mut diesel::serialize::Output<'b, '_, Sqlite>,
+ ) -> serialize::Result {
+ out.set_value(self.to_string());
+ Ok(serialize::IsNull::No)
+ }
+}
+
+impl FromSql<Text, Sqlite> for BudgetPeriodUnit {
+ fn from_sql(bytes: <Sqlite as Backend>::RawValue<'_>) -> deserialize::Result<BudgetPeriodUnit> {
+ let str = <String as FromSql<Text, Sqlite>>::from_sql(bytes)?;
+ Ok(str.parse()?)
+ }
+}
+
+#[cfg(test)]
+mod test {
+ use anyhow::Result;
+
+ use super::BudgetPeriodUnit;
+
+ #[test]
+ fn display_when_day_then_day() {
+ assert_eq!("DAY", format!("{}", BudgetPeriodUnit::Day));
+ }
+
+ #[test]
+ fn display_when_month_then_month() {
+ assert_eq!("MONTH", format!("{}", BudgetPeriodUnit::Month));
+ }
+
+ #[test]
+ fn display_when_year_then_year() {
+ assert_eq!("YEAR", format!("{}", BudgetPeriodUnit::Year));
+ }
+
+ #[test]
+ fn from_str_when_day_then_day() {
+ let result: Result<BudgetPeriodUnit> = "DAY".parse();
+ assert!(result.is_ok());
+ assert_eq!(BudgetPeriodUnit::Day, result.unwrap());
+ }
+
+ #[test]
+ fn from_str_when_month_then_month() {
+ let result: Result<BudgetPeriodUnit> = "MONTH".parse();
+ assert!(result.is_ok());
+ assert_eq!(BudgetPeriodUnit::Month, result.unwrap());
+ }
+
+ #[test]
+ fn from_str_when_year_then_year() {
+ let result: Result<BudgetPeriodUnit> = "YEAR".parse();
+ assert!(result.is_ok());
+ assert_eq!(BudgetPeriodUnit::Year, result.unwrap());
+ }
+
+ #[test]
+ fn from_str_when_sentence_case_day_then_err() {
+ let result: Result<BudgetPeriodUnit> = "Day".parse();
+ assert!(result.is_err());
+ }
+}
diff --git a/rust/schist_models/src/budget_update.rs b/rust/schist_models/src/budget_update.rs
deleted file mode 100644
index 86645cb..0000000
--- a/rust/schist_models/src/budget_update.rs
+++ /dev/null
@@ -1,16 +0,0 @@
-use derive_builder::Builder;
-use diesel::prelude::*;
-use serde::Serialize;
-
-use crate::{category::Category, date_utc::DateUtc};
-
-#[derive(Builder, Clone, Serialize, Queryable, Identifiable, Selectable, Associations, Debug, PartialEq, Eq, Insertable)]
-#[diesel(table_name = crate::schema::budget_updates)]
-#[diesel(belongs_to(Category))]
-pub struct BudgetUpdate {
- pub id: i32,
- pub category_id: i32,
- pub date: DateUtc,
- pub new_budget: i32,
- pub new_period: i32,
-}
diff --git a/rust/schist_models/src/category.rs b/rust/schist_models/src/category.rs
index 55c7b97..c85ff51 100644
--- a/rust/schist_models/src/category.rs
+++ b/rust/schist_models/src/category.rs
@@ -2,9 +2,16 @@ use derive_builder::Builder;
use diesel::prelude::*;
use serde::{Deserialize, Serialize};
+use crate::{budget_period_unit::BudgetPeriodUnit, date_utc::DateUtc};
+
#[derive(Builder, Queryable, Identifiable, Selectable, Debug, PartialEq, Serialize, Deserialize, Insertable)]
#[diesel(table_name = crate::schema::categories)]
pub struct Category {
pub id: i32,
pub name: String,
+ pub balance: i32,
+ pub balance_date: DateUtc,
+ pub budget_period: i32,
+ pub budget_period_unit: BudgetPeriodUnit,
+ pub budget_quantity: i32,
}
diff --git a/rust/schist_models/src/category_balance.rs b/rust/schist_models/src/category_balance.rs
deleted file mode 100644
index 796b40b..0000000
--- a/rust/schist_models/src/category_balance.rs
+++ /dev/null
@@ -1,7 +0,0 @@
-use serde::Serialize;
-
-#[derive(Serialize)]
-pub struct CategoryBalance {
- pub category_id: i32,
- pub balance: i32,
-}
diff --git a/rust/schist_models/src/category_budget.rs b/rust/schist_models/src/category_budget.rs
deleted file mode 100644
index 9796261..0000000
--- a/rust/schist_models/src/category_budget.rs
+++ /dev/null
@@ -1,9 +0,0 @@
-use serde::Serialize;
-
-use super::budget::Budget;
-
-#[derive(Serialize)]
-pub struct CategoryBudget {
- pub category_id: i32,
- pub budget: Option<Budget>,
-}
diff --git a/rust/schist_models/src/lib.rs b/rust/schist_models/src/lib.rs
index 9e60e80..1712c36 100644
--- a/rust/schist_models/src/lib.rs
+++ b/rust/schist_models/src/lib.rs
@@ -1,9 +1,7 @@
pub mod account;
-pub mod budget;
-pub mod budget_update;
+pub mod budget_drip;
+pub mod budget_period_unit;
pub mod category;
-pub mod category_balance;
-pub mod category_budget;
pub mod category_transfer;
pub mod date_utc;
pub mod datetime_utc;
diff --git a/rust/schist_models/src/schema.rs b/rust/schist_models/src/schema.rs
index 372f8f3..5164d07 100644
--- a/rust/schist_models/src/schema.rs
+++ b/rust/schist_models/src/schema.rs
@@ -10,12 +10,11 @@ diesel::table! {
}
diesel::table! {
- budget_updates (id) {
+ budget_drips (id) {
id -> Integer,
category_id -> Integer,
date -> Text,
- new_budget -> Integer,
- new_period -> Integer,
+ quantity -> Integer,
}
}
@@ -23,6 +22,11 @@ diesel::table! {
categories (id) {
id -> Integer,
name -> Text,
+ balance -> Integer,
+ balance_date -> Text,
+ budget_period -> Integer,
+ budget_period_unit -> Text,
+ budget_quantity -> Integer,
}
}
@@ -57,14 +61,14 @@ diesel::table! {
}
}
-diesel::joinable!(budget_updates -> categories (category_id));
+diesel::joinable!(budget_drips -> categories (category_id));
diesel::joinable!(transaction_categorisations -> categories (category_id));
diesel::joinable!(transaction_categorisations -> transactions (transaction_id));
diesel::joinable!(transactions -> accounts (account_id));
diesel::allow_tables_to_appear_in_same_query!(
accounts,
- budget_updates,
+ budget_drips,
categories,
category_transfers,
transaction_categorisations,