diff options
| author | Benedict Börger <benedict@0xb8000.de> | 2019-06-28 21:41:23 +0200 |
|---|---|---|
| committer | Benedict Börger <benedict@0xb8000.de> | 2019-06-28 21:41:23 +0200 |
| commit | 5d33ed945c5be832d6a6e08eda4e35dde00ac362 (patch) | |
| tree | 7d4b6b7d56aaa298bae655f35ab0c7af12be57a0 | |
| parent | 04c9461ef53f5eaa8e7d72442e211d91546b88e3 (diff) | |
[web_fronted] added new site asset/risk_chart
| -rw-r--r-- | src/banking/account.rs | 8 | ||||
| -rw-r--r-- | src/banking/asset.rs | 10 | ||||
| -rw-r--r-- | src/main.rs | 3 | ||||
| -rw-r--r-- | src/web_frontend/asset_risk_chart.rs | 47 | ||||
| -rw-r--r-- | src/web_frontend/mod.rs | 1 | ||||
| -rw-r--r-- | templates/asset.html.tera | 1 | ||||
| -rw-r--r-- | templates/asset_risk_chart.html.tera | 80 | ||||
| -rw-r--r-- | templates/balance.html.tera | 1 | ||||
| -rw-r--r-- | templates/chart.html.tera | 1 | ||||
| -rw-r--r-- | templates/transaction.html.tera | 3 |
10 files changed, 148 insertions, 7 deletions
diff --git a/src/banking/account.rs b/src/banking/account.rs index 95cb71b..b13e72f 100644 --- a/src/banking/account.rs +++ b/src/banking/account.rs @@ -7,12 +7,12 @@ pub struct Account { pub transactions : Vec<Transaction>, pub institute : String, pub groupFile : String, - pub category : String - + pub category : String, + pub riskCategory : String } impl Account { - pub fn new(name : String, iban : String, transactions : Vec<String>, institute : String, groupFile : String, category : String) -> Account { + pub fn new(name : String, iban : String, transactions : Vec<String>, institute : String, groupFile : String, category : String, riskCategory : String) -> Account { let mut trans = Vec::new(); if institute == "SpecialParser" { } @@ -29,7 +29,7 @@ impl Account { } } } - Account { name : name, iban : iban, transactions : trans, institute : institute, groupFile : groupFile, category : category } + Account { name : name, iban : iban, transactions : trans, institute : institute, groupFile : groupFile, category : category, riskCategory : riskCategory } } pub fn get_balance(&self, date : chrono::NaiveDate) -> f32 { diff --git a/src/banking/asset.rs b/src/banking/asset.rs index 642f153..3255b29 100644 --- a/src/banking/asset.rs +++ b/src/banking/asset.rs @@ -59,6 +59,14 @@ impl Asset { if let Some(i) = tmp.get(0) { category = i.to_string(); } + match config.get("RiskCategory") { + Some(i) => tmp = i, + None => panic!("asset: ini file: no \"RiskCategory\" for account: {}", account_name) + } + let mut risk_category = String::from(""); + if let Some(i) = tmp.get(0) { + risk_category = i.to_string(); + } match config.get("IBAN") { Some(i) => tmp = i, None => panic!("asset: no name for account {}", account_name) @@ -75,7 +83,7 @@ impl Asset { if let Some(i) = tmp.get(0) { groupFile = i.to_string(); } - accounts.push(Account::new(account_name, iban, trans_files.to_vec(), institute, groupFile, category)); + accounts.push(Account::new(account_name, iban, trans_files.to_vec(), institute, groupFile, category, risk_category)); } diff --git a/src/main.rs b/src/main.rs index c085bfc..47848d5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -26,6 +26,7 @@ fn main() { .attach(Template::fairing()) .mount("/", routes![web_frontend::transactions::transaction_handler, web_frontend::balance::balance_handler, web_frontend::static_handler, - web_frontend::chart::chart_handler, web_frontend::asset::asset_handler]) + web_frontend::chart::chart_handler, web_frontend::asset::asset_handler, + web_frontend::asset_risk_chart::asset_risk_chart_handler]) .launch(); } diff --git a/src/web_frontend/asset_risk_chart.rs b/src/web_frontend/asset_risk_chart.rs new file mode 100644 index 0000000..560a6f3 --- /dev/null +++ b/src/web_frontend/asset_risk_chart.rs @@ -0,0 +1,47 @@ +use std::collections::HashMap; +use rocket_contrib::templates::Template; +use crate::parsers::ini::IniFile; +use crate::parsers::csv::CsvFile; +use chrono::Utc; + + +#[derive(Serialize)] +pub struct AssetRiskContext { + risk_category : Vec<RiskCategory> +} + +#[derive(Serialize)] +pub struct RiskCategory{ + name : String, + balance : f32 +} + +#[get("/asset/risk_chart")] +pub fn asset_risk_chart_handler() -> rocket_contrib::templates::Template { + let asset_file = "data/asset.ini"; + let asset = crate::banking::asset::Asset::from_ini_file(asset_file); + + let mut acc : Vec<RiskCategory> = Vec::new(); + + let today = Utc::today().naive_utc(); + + for account in asset.iter() { + println!("{}", account.riskCategory); + let mut found = false; + for mut t in &mut acc { + if t.name == account.riskCategory { + found = true; + t.balance = t.balance + account.get_balance(today); + } + } + if !found { + acc.push( RiskCategory { + name : account.riskCategory.to_string(), + balance : account.get_balance(today) + }); + } + } + + let context = AssetRiskContext { risk_category : acc }; + Template::render("asset_risk_chart", context) +} diff --git a/src/web_frontend/mod.rs b/src/web_frontend/mod.rs index 3f58227..3dbc693 100644 --- a/src/web_frontend/mod.rs +++ b/src/web_frontend/mod.rs @@ -2,6 +2,7 @@ pub mod transactions; pub mod balance; pub mod chart; pub mod asset; +pub mod asset_risk_chart; mod util; use rocket::response::NamedFile; use std::path::{PathBuf, Path}; diff --git a/templates/asset.html.tera b/templates/asset.html.tera index 746c4b2..75e8e85 100644 --- a/templates/asset.html.tera +++ b/templates/asset.html.tera @@ -23,6 +23,7 @@ </a> <div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink"> <a class="dropdown-item" href="/asset">Overview</a> + <a class="dropdown-item" href="/asset/risk_chart">Risk Chart</a> </div> </li> <li class="nav-item"> diff --git a/templates/asset_risk_chart.html.tera b/templates/asset_risk_chart.html.tera new file mode 100644 index 0000000..e5eb5c5 --- /dev/null +++ b/templates/asset_risk_chart.html.tera @@ -0,0 +1,80 @@ +<!DOCTYPE html> +<html lang="en"> +<head> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1"> + <!-- <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"> --> + <link rel="stylesheet" href="/static/bootstrap.min.css"> + <link rel="stylesheet" href="/static/custom.css"> + <script src="/static/chart.js"></script> +<script type="text/javascript"> + google.charts.load("current", {packages:["corechart"]}); + google.charts.setOnLoadCallback(drawChart); + function drawChart() { + var data = google.visualization.arrayToDataTable([ + ['Money spent', 'EUR'], + {% for cat in risk_category %} + ['{{ cat.name }}', {{ cat.balance }}], + {% endfor %} + ]); + + var options = { + pieHole: 0.4, + legend : { position : 'right', alignment : 'center' }, + }; + + var chart = new google.visualization.PieChart(document.getElementById('donutchart')); + chart.draw(data, options); + + google.visualization.events.addListener(chart, 'select', selectHandler); + + function selectHandler(e) { + var link_data = [ + {% for cat in risk_category %} + ['{{ cat.name }}', {{ cat.balance }}], + {% endfor %} + ] + var filter = link_data[chart.getSelection()[0].row][1]; + + } + + } + </script> + <title>Asset risk chart</title> +</head> +<body> +<nav class="navbar navbar-expand-lg navbar-light bg-light"> + <a class="navbar-brand" href="#">Finz</a> + <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNavDropdown" aria-controls="navbarNavDropdown" aria-expanded="false" aria-label="Toggle navigation"> + <span class="navbar-toggler-icon"></span> + </button> + <div class="collapse navbar-collapse" id="navbarNavDropdown"> + <ul class="navbar-nav"> + <li class="nav-item active"> + <li class="nav-item dropdown active"> + <a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> + Asset + </a> + <div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink"> + <a class="dropdown-item" href="/asset">Overview</a> + <a class="dropdown-item" href="/asset/risk_chart">Risk chart</a> + </div> + </li> + <li class="nav-item"> + <a class="nav-link" href="#">Investing</a> + </li> + </ul> + </div> +</nav> +<!-- content --> +<div class="container"> +<h1>Asset risk chart</h1> + <!-- stack coln charts to compare months --> + <div id="donutchart" style="margin: auto; width: 100%; height: 700px;"></div> +</div> + + <script src="/static/jquery.min.js"></script> + <script src="/static/popper.min.js"></script> + <script src="/static/bootstrap.min.js"></script> +</body> +</html> diff --git a/templates/balance.html.tera b/templates/balance.html.tera index 332c8c1..1d3fce1 100644 --- a/templates/balance.html.tera +++ b/templates/balance.html.tera @@ -33,6 +33,7 @@ </a> <div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink"> <a class="dropdown-item" href="/asset">Overview</a> + <a class="dropdown-item" href="/asset/risk_chart">Risk chart</a> </div> </li> <li class="nav-item"> diff --git a/templates/chart.html.tera b/templates/chart.html.tera index acded96..2c1754c 100644 --- a/templates/chart.html.tera +++ b/templates/chart.html.tera @@ -68,6 +68,7 @@ </a> <div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink"> <a class="dropdown-item" href="/asset">Overview</a> + <a class="dropdown-item" href="/asset/risk_chart">Risk chart</a> <a class="dropdown-item" href="/chart">Girokonto</a> </div> </li> diff --git a/templates/transaction.html.tera b/templates/transaction.html.tera index b36b12a..f009b63 100644 --- a/templates/transaction.html.tera +++ b/templates/transaction.html.tera @@ -33,6 +33,7 @@ </a> <div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink"> <a class="dropdown-item" href="/asset">Overview</a> + <a class="dropdown-item" href="/asset/risk_chart">Risk chart</a> </div> </li> <li class="nav-item"> @@ -51,7 +52,7 @@ <input id="filter" name="filter" class="form-control" type="text" value="{{ filter }}"> {% endif %} <input type="submit" style="visibility: hidden; display: none" /> - <h6 style="padding-top:5px; visibility: hidden;" id="help" class="text-success">Help: search single rows with: sender=value; logical || and && are also possible</h6> + <h6 style="padding-top:5px; visibility: hidden;" id="help" class="text-success">Help: search single rows with: sender-value;reference-value; this is OR matched </h6> </div> <div style="text-align:center; margin: auto; width:100%; padding: 10px;"> <input type="month" id="start" name="start" value="{{ date_start }}"> to <input type="month" id="end" name="end" value="{{ date_end }}"> |
