summaryrefslogtreecommitdiff
path: root/src/web_frontend/transactions.rs
blob: 6e5ae8c8498461e1ff7b115c3b31fd17ef53a8df (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
use parsers::csv::CsvFile;
use crate::banking::account::Account;
use crate::banking::asset::Asset;
//use parsers::ini::IniFile;
use std::collections::HashMap;
use rocket_contrib::templates::Template;
use rocket::response::NamedFile;
use std::path::{PathBuf, Path};
use rocket::request::Form;
use rocket::http::RawStr;
use rocket::http::uri::Uri;
use regex::Regex;
use chrono::{NaiveDate, Utc};
use chrono::Datelike;

/*
 * This context is passed to the template rendering engine
 * If you modify this structure, adapt also the template to include the
 * changes!
 */
#[derive(Serialize)]
struct TransactionContext {
	transactions : Vec<crate::banking::account::Transaction>,
	account_name : String,
	filter : String,
	date_start : String,
	date_end : String
}


#[get("/transactions/<account>?<start>&<end>&<filter>")]
pub fn transaction_handler(account : &RawStr, start : Option<&RawStr>, end : Option<&RawStr>,
			   filter : Option<&RawStr>) -> rocket_contrib::templates::Template {
	let account_name = account.to_string();
	let date_start = match start {
		Some(s) => { let mut tmp = s.to_string();
			tmp.push_str("-01");
			chrono::NaiveDate::parse_from_str(&tmp, "%Y-%m-%d").unwrap() },
		None => Utc::today().naive_utc()
	};
	let date_end = match end {
		Some(s) => { let mut tmp = s.to_string();
			tmp.push_str("-01");
			chrono::NaiveDate::parse_from_str(&tmp, "%Y-%m-%d").unwrap() },
		None => Utc::today().naive_utc() 
	};
	let transaction_filter = match filter {
		Some(s) => s.to_string(),
		None => String::from("")
	};
	let tf_c = transaction_filter.clone();
	let test = Uri::percent_decode_lossy(tf_c.as_bytes());
	let transaction_filter = test.to_string();
	let asset_ini = "data/asset.ini";
	let asset : Asset = crate::banking::asset::Asset::from_ini_file(asset_ini);
    let transactions = asset.get_account_by_name(&account_name);
    let acc;
    match transactions {
	    Some(trans) => acc = trans,
	    None => panic!("could not read file")
    }
    let t = acc.transactions;
    // apply parameters
    // apply date filters
	let date_range = crate::web_frontend::util::DateRange::new(date_start, date_end);	
	let mut t_filtered = Vec::new();
	for date in date_range {
		let tc = t.clone();
		let mut tmp : Vec<_> = tc.into_iter().filter(|x| x.date.month() == date.month() && x.date.year() == date.year()).collect();
		t_filtered.append(&mut tmp);
	}

   // apply filter
    let ft = crate::web_frontend::util::apply_transaction_filter(transaction_filter.clone(), t_filtered);

    let context = TransactionContext { transactions: ft, account_name : account_name,
    			filter : transaction_filter, date_start : date_start.to_string()[0..7].to_string(),
    			date_end : date_end.to_string()[0..7].to_string()};
    Template::render("transaction", context)
}