adding and listing transactions baby

This commit is contained in:
thatscringebro
2025-12-10 09:10:10 -05:00
parent 4c4967d50a
commit d512dedd21
3 changed files with 185 additions and 3 deletions

View File

@@ -1,4 +1,5 @@
use crate::entities::*;
use chrono::DateTime;
use sqlite::{Connection, State};
pub fn setup(con: &Connection) {
@@ -20,7 +21,7 @@ pub fn setup(con: &Connection) {
account_id INTEGER NOT NULL,
type_id INTEGER NOT NULL,
amount FLOAT NOT NULL,
date DATE NOT NULL,
date INTEGER NOT NULL,
description TEXT,
FOREIGN KEY(account_id) REFERENCES Accounts(id),
FOREIGN KEY(type_id) REFERENCES TransactionTypes(id)
@@ -150,3 +151,106 @@ pub fn get_transaction_types(con: &Connection) -> Vec<TransactionType> {
return vec;
}
pub fn upsert_transaction(con: &Connection, tr: Transaction) -> Transaction {
let query;
if tr.get_id() == 0 {
query = "INSERT INTO Transactions
(account_id, type_id, amount, date, description)
VALUES (?, ?, ?, ?, ?)
RETURNING id;";
} else {
query = "UPDATE Transactions
SET account_id = ?, type_id = ?, amount = ?, date = ?, description = ?
WHERE id = ? RETURNING id;";
}
let mut statement = con.prepare(query).unwrap();
statement.bind((1, tr.get_account().get_id())).unwrap();
statement.bind((2, tr.get_type().get_id())).unwrap();
statement.bind((3, tr.get_amount())).unwrap();
statement.bind((4, tr.get_date().timestamp())).unwrap();
statement.bind((5, &tr.get_desc() as &str)).unwrap();
if tr.get_id() != 0 {
statement.bind((6, tr.get_id())).unwrap();
}
let id;
if let Ok(State::Row) = statement.next() {
id = statement.read::<i64, _>("id").unwrap();
} else {
id = 0;
}
return Transaction::new(
id,
tr.get_account().get_id(),
tr.get_amount(),
tr.get_date(),
tr.get_desc(),
tr.get_type().get_id(),
con,
);
}
pub fn get_transaction(con: &Connection, id: i64) -> Transaction {
let query = "SELECT * FROM Transactions WHERE id = ?";
let mut statement = con.prepare(query).unwrap();
statement.bind((1, id)).unwrap();
if let Ok(State::Row) = statement.next() {
return Transaction::new(
statement.read::<i64, _>("id").unwrap(),
statement.read::<i64, _>("account_id").unwrap(),
statement.read::<f64, _>("amount").unwrap(),
DateTime::from_timestamp(statement.read::<i64, _>("date").unwrap(), 0).unwrap(),
statement.read::<String, _>("description").unwrap(),
statement.read::<i64, _>("type_id").unwrap(),
con,
);
} else {
return Transaction::new_empty();
}
}
pub fn get_account_transactions(con: &Connection, ac_id: i64) -> Vec<Transaction> {
let query = "SELECT * FROM Transactions WHERE account_id = ?";
let mut statement = con.prepare(query).unwrap();
statement.bind((1, ac_id)).unwrap();
let mut vec = Vec::<Transaction>::new();
while let Ok(State::Row) = statement.next() {
vec.push(Transaction::new(
statement.read::<i64, _>("id").unwrap(),
statement.read::<i64, _>("account_id").unwrap(),
statement.read::<f64, _>("amount").unwrap(),
DateTime::from_timestamp(statement.read::<i64, _>("date").unwrap(), 0).unwrap(),
statement.read::<String, _>("description").unwrap(),
statement.read::<i64, _>("type_id").unwrap(),
con,
));
}
return vec;
}
pub fn get_transactions(con: &Connection) -> Vec<Transaction> {
let query = "SELECT * FROM TransactionTypes";
let mut statement = con.prepare(query).unwrap();
let mut vec = Vec::<Transaction>::new();
while let Ok(State::Row) = statement.next() {
vec.push(Transaction::new(
statement.read::<i64, _>("id").unwrap(),
statement.read::<i64, _>("account_id").unwrap(),
statement.read::<f64, _>("amount").unwrap(),
DateTime::from_timestamp(statement.read::<i64, _>("date").unwrap(), 0).unwrap(),
statement.read::<String, _>("description").unwrap(),
statement.read::<i64, _>("type_id").unwrap(),
con,
));
}
return vec;
}