diff --git a/src/main/java/de/deadlocker8/budgetmaster/charts/DefaultCharts.java b/src/main/java/de/deadlocker8/budgetmaster/charts/DefaultCharts.java index 258bed052e26d70f432fbf2abd4d1f03f9d41daf..4a631588b0993103ce7146aecdf8e1ed90856339 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 0000000000000000000000000000000000000000..fb272fd413f0d3defdc711e1a63dc52f80d1e40b --- /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 c4dfee473de2ae910d4be2dde08eea58800f98cb..638888eefa3bf1c5ae91bd816b2a283df465cc63 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 19615067477e8168b0ae764b1f39d30d8dd4ce70..cd4002cc3c730d0ef9ba7e02d6d2e8489b9a3780 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