use parsers::csv::CsvFile; use 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 regex::Regex; use chrono::{NaiveDate, Utc}; use chrono::Datelike; use crate::web_frontend::util; #[derive(Serialize)] struct MonthEarnSpend { name : String, earned : f32, spent : f32, } #[derive(Serialize)] struct BalanceContext { account_name : String, months : Vec, date_start : String, date_end : String } #[get("/balance/?&")] pub fn balance_handler(account : &RawStr, start : Option<&RawStr>, end : 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 date_range = crate::web_frontend::util::DateRange::new(date_start, date_end); 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; let mut earn_spend_v = Vec::new(); for date in date_range { let result : Vec<_> = t.iter().filter(|x| x.date.month() == date.month() && x.date.year() == date.year()).collect(); let mut earn = 0.0; let mut spend = 0.0; for r in &result { if r.amount > 0.0 { earn = earn + r.amount; } else { spend = spend + r.amount.abs(); } } earn_spend_v.push(MonthEarnSpend { name : date.to_string(), earned : earn, spent : spend}); } let context = BalanceContext { account_name : account_name, months : earn_spend_v , date_start : date_start.to_string()[0..7].to_string(), date_end : date_end.to_string()[0..7].to_string()}; Template::render("balance", context) }