From b8b08c5eea44552df593b906a9efc00b27a40a5d Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Wed, 23 Oct 2019 20:27:05 +0200
Subject: [PATCH] Fixed #489 - new default chart: rest per month

---
 .../budgetmaster/charts/DefaultCharts.java    |  5 ++
 src/main/resources/charts/RestPerMonth.js     | 80 +++++++++++++++++++
 src/main/resources/languages/_de.properties   |  3 +-
 src/main/resources/languages/_en.properties   |  3 +-
 4 files changed, 89 insertions(+), 2 deletions(-)
 create mode 100644 src/main/resources/charts/RestPerMonth.js

diff --git a/src/main/java/de/deadlocker8/budgetmaster/charts/DefaultCharts.java b/src/main/java/de/deadlocker8/budgetmaster/charts/DefaultCharts.java
index 258bed052..4a631588b 100644
--- a/src/main/java/de/deadlocker8/budgetmaster/charts/DefaultCharts.java
+++ b/src/main/java/de/deadlocker8/budgetmaster/charts/DefaultCharts.java
@@ -42,6 +42,10 @@ public class DefaultCharts
 			getChartFromFile("charts/IncomesAndExpendituresPerMonthByCategories.js"),
 			ChartType.DEFAULT, 13);
 
+	private static final Chart CHART_REST_PER_MONTH = new Chart("charts.default.restPerMonth",
+			getChartFromFile("charts/RestPerMonth.js"),
+			ChartType.DEFAULT, 2);
+
 
 	public static List<Chart> getDefaultCharts()
 	{
@@ -52,6 +56,7 @@ public class DefaultCharts
 		charts.add(CHART_INCOMES_AND_EXPENDITURES_BY_CATEGORY_BAR);
 		charts.add(CHART_INCOMES_AND_EXPENDITURES_BY_CATEGORY_PIE);
 		charts.add(CHART_INCOMES_AND_EXPENDITURES_PER_MONTH_BY_CATEGORIES);
+		charts.add(CHART_REST_PER_MONTH);
 
 		charts.sort(Comparator.comparing(Chart::getName));
 		return charts;
diff --git a/src/main/resources/charts/RestPerMonth.js b/src/main/resources/charts/RestPerMonth.js
new file mode 100644
index 000000000..fb272fd41
--- /dev/null
+++ b/src/main/resources/charts/RestPerMonth.js
@@ -0,0 +1,80 @@
+/* This list will be dynamically filled with all the transactions between
+ * the start and and date you select on the "Show Chart" page
+ * and filtered according to your specified filter.
+ * An example entry for this list and tutorial about how to create custom charts ca be found in the BudgetMaster wiki:
+ * https://github.com/deadlocker8/BudgetMaster/wiki/How-to-create-custom-charts
+ */
+var transactionData = [];
+
+// Note: All variables starting with "localized" are only available inside default charts.
+moment.locale(localizedLocale);
+
+var dates = [];
+var rests = [];
+
+transactionData = transactionData.reverse();
+
+for(var i = 0; i < transactionData.length; i++)
+{
+    var transaction = transactionData[i];
+
+    // create new sums if month is not already in list
+    var date = moment(transaction.date).startOf('month').format('MMM YY');
+    if(!dates.includes(date))
+    {
+        dates.push(date);
+        rests.push(0);
+    }
+
+    var lastIndex = rests.length - 1;
+    rests[lastIndex] = rests[lastIndex] + transaction.amount;
+}
+
+// convert all sums to decimal
+rests.forEach(function(value, index)
+{
+    this[index] = value / 100;
+}, rests);
+
+// Prepare your chart settings here (mandatory)
+var plotlyData = [
+    {
+        x: dates,
+        y: rests,
+        type: 'bar',
+    },
+];
+
+// Add your Plotly layout settings here (optional)
+var plotlyLayout = {
+    title: {
+        text: localizedTitle
+    },
+    yaxis: {
+        title: localizedData['label1'] + localizedCurrency,
+        rangemode: 'tozero',
+        tickformat: '.2f',
+        showline: true
+    },
+    xaxis: {
+        tickformat: '%d.%m.%y'
+    }
+};
+
+// Add your Plotly configuration settings here (optional)
+var plotlyConfig = {
+    showSendToCloud: false,
+    displaylogo: false,
+    showLink: false,
+    responsive: true,
+    displayModeBar: true,
+    toImageButtonOptions: {
+        format: 'png',
+        filename: 'BudgetMaster_chart_export',
+        height: 1080,
+        width: 1920,
+    }
+};
+
+// Don't touch this line
+Plotly.newPlot('chart-canvas', plotlyData, plotlyLayout, plotlyConfig);
\ No newline at end of file
diff --git a/src/main/resources/languages/_de.properties b/src/main/resources/languages/_de.properties
index c4dfee473..638888eef 100644
--- a/src/main/resources/languages/_de.properties
+++ b/src/main/resources/languages/_de.properties
@@ -341,7 +341,8 @@ charts.default.incomesAndExpendituresByCategoryPie=Eingaben/Ausgaben nach Katego
 charts.default.incomesAndExpendituresByCategoryPie.localization='{"label1": "Ausgaben", "label2": "Einnahmen"'}
 charts.default.incomesAndExpendituresPerMonthByCategories=Eingaben/Ausgaben pro Monat (nach Kategorien)
 charts.default.incomesAndExpendituresPerMonthByCategories.localization='{"label1": "Ausgaben", "label2": "Einnahmen"'}
-charts.default.categoryBudget=Verbrauch nach Kategorien
+charts.default.restPerMonth=Rest pro Monat
+charts.default.restPerMonth.localization='{"label1": "Rest in "'}
 
 chart.new.label.name=Name
 chart.new.label.script=Script
diff --git a/src/main/resources/languages/_en.properties b/src/main/resources/languages/_en.properties
index 196150674..cd4002cc3 100644
--- a/src/main/resources/languages/_en.properties
+++ b/src/main/resources/languages/_en.properties
@@ -341,7 +341,8 @@ charts.default.incomesAndExpendituresByCategoryPie=Incomes/Expenditures by categ
 charts.default.incomesAndExpendituresByCategoryPie.localization='{"label1": "Expenditures", "label2": "Incomes"'}
 charts.default.incomesAndExpendituresPerMonthByCategories=Incomes/Expenditures per month (By categories)
 charts.default.incomesAndExpendituresPerMonthByCategories.localization='{"label1": "Expenditures", "label2": "Incomes"'}
-charts.default.categoryBudget=Consumption by categories
+charts.default.restPerMonth=Rest per month
+charts.default.restPerMonth.localization='{"label1": "Rest in "'}
 
 chart.new.label.name=Name
 chart.new.label.script=Script
-- 
GitLab