summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenedict Börger <benedict@0xb8000.de>2019-06-28 21:41:23 +0200
committerBenedict Börger <benedict@0xb8000.de>2019-06-28 21:41:23 +0200
commit5d33ed945c5be832d6a6e08eda4e35dde00ac362 (patch)
tree7d4b6b7d56aaa298bae655f35ab0c7af12be57a0
parent04c9461ef53f5eaa8e7d72442e211d91546b88e3 (diff)
[web_fronted] added new site asset/risk_chart
-rw-r--r--src/banking/account.rs8
-rw-r--r--src/banking/asset.rs10
-rw-r--r--src/main.rs3
-rw-r--r--src/web_frontend/asset_risk_chart.rs47
-rw-r--r--src/web_frontend/mod.rs1
-rw-r--r--templates/asset.html.tera1
-rw-r--r--templates/asset_risk_chart.html.tera80
-rw-r--r--templates/balance.html.tera1
-rw-r--r--templates/chart.html.tera1
-rw-r--r--templates/transaction.html.tera3
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 }}">