summaryrefslogtreecommitdiff
path: root/src/banking
diff options
context:
space:
mode:
Diffstat (limited to 'src/banking')
-rw-r--r--src/banking/account.rs77
-rw-r--r--src/banking/asset.rs57
-rw-r--r--src/banking/mod.rs61
3 files changed, 136 insertions, 59 deletions
diff --git a/src/banking/account.rs b/src/banking/account.rs
new file mode 100644
index 0000000..6994bb4
--- /dev/null
+++ b/src/banking/account.rs
@@ -0,0 +1,77 @@
+use parsers::csv::CsvFile;
+
+pub struct Account {
+ pub name : String,
+ pub iban : String,
+ pub transactions : Vec<Transaction>,
+ pub institute : String
+}
+
+impl Account {
+ pub fn new(name : String, iban : String, transactions : Vec<String>, institute : String) -> Account {
+ let mut trans = Vec::new();
+ if institute == "Sparkasse" {
+ // TODO als function/lambda übergeben die konvertierung..
+ for trans_file in transactions {
+ let file = CsvFile::from_file(&trans_file, ";", true);
+ match file {
+ Ok(f) => { let mut tran = Transaction::from_sparkasse_csv_file(f);
+ trans.append(&mut tran);
+ },
+ Err(e) => panic!("account: new: error reading csv transaction file: {}", e)
+ }
+ }
+ }
+ Account { name : name, iban : iban, transactions : trans, institute : institute }
+ }
+}
+
+#[derive(Serialize)]
+#[derive(Clone)]
+pub struct Transaction {
+ pub sender_name : String,
+ pub amount : f32,
+ pub reference : String,
+ pub date : chrono::NaiveDate
+}
+
+impl Transaction {
+ pub fn from_sparkasse_csv_file(file : CsvFile) -> Vec<Transaction> {
+ let mut ret = Vec::new();
+ for line in file.iter() {
+ let mut sender_name_f = String::from("");
+ let mut sender_iban_f = String::from("");
+ let mut amount_f : f32 = 0.0;
+ let mut reference_f = String::from("");
+ let mut date_f = chrono::NaiveDate::parse_from_str("01.01.2019", "%d.%m.%Y").unwrap();
+ match line.get(&String::from("Kontonummer")) {
+ Some(value) => sender_iban_f = value.to_string(),
+ None => println!("missing sender")
+ }
+ match line.get(&String::from("Beguenstigter/Zahlungspflichtiger")) {
+ Some(value) => sender_name_f = value.to_string(),
+ None => println!("missing sender")
+ }
+ match line.get(&String::from("Verwendungszweck")) {
+ Some(value) => reference_f = value.to_string(),
+ None => println!("missing refernce")
+ }
+ match line.get(&String::from("Betrag")) {
+ Some(value) => amount_f = value.parse().unwrap(),
+ None => println!("missing amount")
+ }
+ match line.get(&String::from("Valutadatum")) {
+ Some(value) => {
+ date_f = chrono::NaiveDate::parse_from_str(value, "%d.%m.%y").unwrap();} ,
+ None => println!("missing date")
+ }
+ ret.push(Transaction {
+ sender_name : sender_name_f,
+ amount : amount_f,
+ reference : reference_f,
+ date : date_f });
+
+ }
+ ret
+ }
+}
diff --git a/src/banking/asset.rs b/src/banking/asset.rs
new file mode 100644
index 0000000..7b7287b
--- /dev/null
+++ b/src/banking/asset.rs
@@ -0,0 +1,57 @@
+use crate::banking::account::Account;
+use crate::parsers::ini::IniFile;
+
+pub struct Asset {
+ accounts : Vec<Account>
+}
+
+impl Asset {
+ pub fn from_ini_file(file_name : &str) -> Asset {
+ // read in ini file
+ let t = crate::parsers::ini::IniFile::from_file(file_name);
+ let file;
+ match t {
+ Ok(f) => file = f,
+ Err(e) => panic!("asset: from_ini_file: could not read ini file: {}", e)
+ }
+
+ let mut accounts = Vec::new();
+ for (account_name, config) in file.sections {
+ let mut tmp;
+ match config.get("Institut") {
+ Some(i) => tmp = i,
+ None => panic!("asset: parse ini file: could not find \"Institute\" key for account {}", account_name)
+ }
+ let mut institute = String::from("");
+ if let Some(i) = tmp.get(0) {
+ institute = i.to_string();
+ }
+ let trans_files;
+ match config.get("TransactionFile") {
+ Some(i) => trans_files = i,
+ None => panic!("asset: ini file: no \"TransactionFile\" for account: {}", account_name)
+ }
+ match config.get("IBAN") {
+ Some(i) => tmp = i,
+ None => panic!("asset: no name for account {}", account_name)
+ }
+ let mut iban = String::from("");
+ if let Some(i) = tmp.get(0) {
+ iban = i.to_string();
+ }
+ accounts.push(Account::new(account_name, iban, trans_files.to_vec(), institute));
+
+
+ }
+ Asset { accounts : accounts }
+ }
+
+ pub fn get_account_by_name(self, name : &str) -> Option<Account> {
+ for account in self.accounts {
+ if account.name == name {
+ return Some(account);
+ }
+ }
+ None
+ }
+}
diff --git a/src/banking/mod.rs b/src/banking/mod.rs
index 410bae1..e936286 100644
--- a/src/banking/mod.rs
+++ b/src/banking/mod.rs
@@ -1,59 +1,2 @@
-
-use parsers::csv::CsvFile;
-
-
-pub struct Account {
- name : String,
- iban : String,
- transactions : Vec<Transaction>
-}
-
-
-#[derive(Serialize)]
-pub struct Transaction {
- pub sender_name : String,
- pub amount : f32,
- pub reference : String,
- pub date : chrono::NaiveDate
-}
-
-impl Transaction {
- pub fn from_sparkasse_csv_file(file : CsvFile) -> Vec<Transaction> {
- let mut ret = Vec::new();
- for line in file.iter() {
- let mut sender_name_f = String::from("");
- let mut sender_iban_f = String::from("");
- let mut amount_f : f32 = 0.0;
- let mut reference_f = String::from("");
- let mut date_f = chrono::NaiveDate::parse_from_str("01.01.2019", "%d.%m.%Y").unwrap();
- match line.get(&String::from("Kontonummer")) {
- Some(value) => sender_iban_f = value.to_string(),
- None => println!("missing sender")
- }
- match line.get(&String::from("Beguenstigter/Zahlungspflichtiger")) {
- Some(value) => sender_name_f = value.to_string(),
- None => println!("missing sender")
- }
- match line.get(&String::from("Verwendungszweck")) {
- Some(value) => reference_f = value.to_string(),
- None => println!("missing refernce")
- }
- match line.get(&String::from("Betrag")) {
- Some(value) => amount_f = value.parse().unwrap(),
- None => println!("missing amount")
- }
- match line.get(&String::from("Valutadatum")) {
- Some(value) => {
- date_f = chrono::NaiveDate::parse_from_str(value, "%d.%m.%y").unwrap();} ,
- None => println!("missing date")
- }
- ret.push(Transaction {
- sender_name : sender_name_f,
- amount : amount_f,
- reference : reference_f,
- date : date_f });
-
- }
- ret
- }
-}
+pub mod asset;
+pub mod account;