diff --git a/build/BudgetMaster.exe b/build/BudgetMaster.exe index fb7db919eb7a0748bb8e951a1f063a0cce2e6635..12e350ea3f7f3ae44248587d295ba3436175db09 100644 Binary files a/build/BudgetMaster.exe and b/build/BudgetMaster.exe differ diff --git a/build/BudgetMasterClient.jar b/build/BudgetMasterClient.jar index f389bc9c30fed034c82c2fab6bf1ec7f3be75758..0aab6a2d7bb684ca672674cafc7c5effc3480c06 100644 Binary files a/build/BudgetMasterClient.jar and b/build/BudgetMasterClient.jar differ diff --git a/build/BudgetMasterServer.jar b/build/BudgetMasterServer.jar index 73ae6603501f348f03888b3a177074cbbaace775..0c26a7ec50ad0a4f977d30c450f14c3670d662e5 100644 Binary files a/build/BudgetMasterServer.jar and b/build/BudgetMasterServer.jar differ diff --git a/src/de/deadlocker8/budgetmaster/logic/charts/CategoriesChart.java b/src/de/deadlocker8/budgetmaster/logic/charts/CategoriesChart.java index 37c153d1a0d288ea42667e610b50dee9864f58c0..46c039508c72f972cbd4a741945d83300f0de304 100644 --- a/src/de/deadlocker8/budgetmaster/logic/charts/CategoriesChart.java +++ b/src/de/deadlocker8/budgetmaster/logic/charts/CategoriesChart.java @@ -30,8 +30,9 @@ public class CategoriesChart extends VBox implements ChartExportable private String currency; private double totalIncomes; private double totalPayments; - private LegendType legendType; - + private LegendType legendType; + private final double CHART_HEIGHT = 200; + private final double FULL_LEGEND_ITEM_HEIGHT = 40; public CategoriesChart(String titleIncomes, String titlePayments, ArrayList<CategoryInOutSum> categoryInOutSums, String currency, LegendType legendType) { @@ -295,18 +296,21 @@ public class CategoriesChart extends VBox implements ChartExportable public WritableImage export(int width, int height) { VBox root = new VBox(); - root.setStyle("-fx-background-color: transparent;"); - root.setPadding(new Insets(25)); - - root.getChildren().add(generate(titleIncomes, true)); - root.getChildren().add(generate(titlePayments, false)); - - Region spacer = new Region(); - root.getChildren().add(spacer); - VBox.setVgrow(spacer, Priority.ALWAYS); - - root.getChildren().add(generateFullLegend()); - + + root.setStyle("-fx-background-color: transparent;"); + root.setPadding(new Insets(25)); + root.setSpacing(10); + + root.getChildren().add(generate(titleIncomes, true)); + root.getChildren().add(generate(titlePayments, false)); + + Region spacer = new Region(); + spacer.setMinHeight(25); + root.getChildren().add(spacer); + VBox.setVgrow(spacer, Priority.ALWAYS); + + root.getChildren().add(generateFullLegend()); + Stage newStage = new Stage(); newStage.initModality(Modality.NONE); newStage.setScene(new Scene(root, width, height)); @@ -329,6 +333,6 @@ public class CategoriesChart extends VBox implements ChartExportable @Override public double getSuggestedHeight() { - return getHeight() + 100; + return CHART_HEIGHT + categoryInOutSums.size() * FULL_LEGEND_ITEM_HEIGHT + 50; } } \ No newline at end of file diff --git a/src/de/deadlocker8/budgetmaster/logic/report/ColumnType.java b/src/de/deadlocker8/budgetmaster/logic/report/ColumnType.java index b7503a80ce55a7b2d0da8699c98f17edf4f022c4..e810df6179e46af257690ba2648abbd5139a8303 100644 --- a/src/de/deadlocker8/budgetmaster/logic/report/ColumnType.java +++ b/src/de/deadlocker8/budgetmaster/logic/report/ColumnType.java @@ -2,24 +2,31 @@ package de.deadlocker8.budgetmaster.logic.report; public enum ColumnType { - POSITION("Nr."), - DATE("Datum"), - REPEATING("Wiederholend"), - CATEGORY("Kategorie"), - NAME("Name"), - DESCRIPTION("Notiz"), - RATING("Bewertung"), - AMOUNT("Betrag"); + POSITION("Nr.", 1), + DATE("Datum", 2), + REPEATING("Wiederholend", 1), + CATEGORY("Kategorie", 3), + NAME("Name", 3), + DESCRIPTION("Notiz", 3), + RATING("+/-", 1), + AMOUNT("Betrag", 2); private String name; + private float proportion; - private ColumnType(String name) + private ColumnType(String name, float proportion) { this.name = name; + this.proportion = proportion; } public String getName() { return name; } + + public float getProportion() + { + return proportion; + } } \ No newline at end of file diff --git a/src/de/deadlocker8/budgetmaster/logic/report/ReportGenerator.java b/src/de/deadlocker8/budgetmaster/logic/report/ReportGenerator.java index 9ad46eb9572e7f72a2c5b635cf47819cc0e9a928..27cd67b4652f86cbf2a30a804560cf0022080ea8 100644 --- a/src/de/deadlocker8/budgetmaster/logic/report/ReportGenerator.java +++ b/src/de/deadlocker8/budgetmaster/logic/report/ReportGenerator.java @@ -7,6 +7,7 @@ import java.io.FileOutputStream; import java.util.ArrayList; import org.joda.time.DateTime; +import org.joda.time.format.DateTimeFormat; import com.itextpdf.text.BaseColor; import com.itextpdf.text.Chapter; @@ -23,6 +24,7 @@ import com.itextpdf.text.pdf.PdfPCell; import com.itextpdf.text.pdf.PdfPTable; import com.itextpdf.text.pdf.PdfWriter; +import de.deadlocker8.budgetmaster.logic.Budget; import de.deadlocker8.budgetmaster.logic.CategoryBudget; import de.deadlocker8.budgetmaster.logic.utils.Helpers; @@ -31,33 +33,35 @@ public class ReportGenerator private ArrayList<ReportItem> reportItems; private ArrayList<CategoryBudget> categoryBudgets; private ColumnOrder columnOrder; + private boolean includeBudget; private boolean splitTable; private boolean includeCategoryBudgets; private File savePath; private String currency; private DateTime date; + private Budget budget; - public ReportGenerator(ArrayList<ReportItem> reportItems, ArrayList<CategoryBudget> categoryBudgets, ColumnOrder columnOrder, boolean splitTable, boolean includeCategoryBudgets, File savePath, String currency, DateTime date) + public ReportGenerator(ArrayList<ReportItem> reportItems, ArrayList<CategoryBudget> categoryBudgets, ColumnOrder columnOrder, boolean includeBudget, boolean splitTable, boolean includeCategoryBudgets, File savePath, String currency, DateTime date, Budget budget) { this.reportItems = reportItems; this.categoryBudgets = categoryBudgets; this.columnOrder = columnOrder; + this.includeBudget = includeBudget; this.splitTable = splitTable; this.includeCategoryBudgets = includeCategoryBudgets; this.savePath = savePath; this.currency = currency; this.date = date; + this.budget = budget; } private Chapter generateHeader() { - Font chapterFont = new Font(FontFamily.HELVETICA, 16, Font.BOLDITALIC); - Font paragraphFont = new Font(FontFamily.HELVETICA, 12, Font.NORMAL); + Font chapterFont = new Font(FontFamily.HELVETICA, 16, Font.BOLDITALIC); Chunk chunk = new Chunk("Monatsbericht - " + date.toString("MMMM yyyy"), chapterFont); Chapter chapter = new Chapter(new Paragraph(chunk), 1); chapter.setNumberDepth(0); - chapter.add(Chunk.NEWLINE); - chapter.add(new Paragraph("Buchungsübersicht", paragraphFont)); + chapter.add(Chunk.NEWLINE); return chapter; } @@ -69,7 +73,13 @@ public class ReportGenerator if(numberOfColumns > 0) { - PdfPTable table = new PdfPTable(numberOfColumns); + float[] proportions = new float[numberOfColumns]; + for(int i = 0; i < columnOrder.getColumns().size(); i++) + { + proportions[i] = columnOrder.getColumns().get(i).getProportion(); + } + + PdfPTable table = new PdfPTable(proportions); table.setWidthPercentage(tableWidth); Font font = new Font(FontFamily.HELVETICA, 8, Font.NORMAL, GrayColor.BLACK); @@ -146,14 +156,32 @@ public class ReportGenerator writer.setPageEvent(new HeaderFooterPageEvent()); document.open(); document.setMargins(50, 45, 50, 70); + Font headerFont = new Font(FontFamily.HELVETICA, 14, Font.BOLD); + Font smallHeaderFont = new Font(FontFamily.HELVETICA, 12, Font.BOLD); Font paragraphFont = new Font(FontFamily.HELVETICA, 12, Font.NORMAL); document.add(generateHeader()); document.add(Chunk.NEWLINE); + + if(includeBudget) + { + Font fontGreen = new Font(FontFamily.HELVETICA, 12, Font.NORMAL, new BaseColor(36, 122, 45)); + Font fontRed = new Font(FontFamily.HELVETICA, 12, Font.NORMAL, BaseColor.RED); + Font fontBlack = new Font(FontFamily.HELVETICA, 12, Font.BOLD); + document.add(new Paragraph("Budget", headerFont)); + document.add(Chunk.NEWLINE); + document.add(new Paragraph("Einnahmen: " + Helpers.getCurrencyString(budget.getIncomeSum(), currency), fontGreen)); + document.add(new Paragraph("Ausgaben: " + Helpers.getCurrencyString(budget.getPaymentSum(), currency), fontRed)); + document.add(new Paragraph("Restbudget: " + Helpers.getCurrencyString(budget.getIncomeSum()-budget.getPaymentSum(), currency), fontBlack)); + document.add(Chunk.NEWLINE); + } + + document.add(new Paragraph("Buchungsübersicht", headerFont)); + document.add(Chunk.NEWLINE); if(splitTable) { - document.add(new Paragraph("Einnahmen", paragraphFont)); + document.add(new Paragraph("Einnahmen", smallHeaderFont)); document.add(Chunk.NEWLINE); PdfPTable table = generateTable(100, AmountType.INCOME); if(table != null) @@ -162,7 +190,7 @@ public class ReportGenerator } document.add(Chunk.NEWLINE); - document.add(new Paragraph("Ausgaben", paragraphFont)); + document.add(new Paragraph("Ausgaben", smallHeaderFont)); document.add(Chunk.NEWLINE); table = generateTable(100, AmountType.PAYMENT); if(table != null) @@ -182,7 +210,7 @@ public class ReportGenerator if(includeCategoryBudgets) { document.add(Chunk.NEWLINE); - document.add(new Paragraph("Verbrauch nach Kategorien", paragraphFont)); + document.add(new Paragraph("Verbrauch nach Kategorien", headerFont)); document.add(Chunk.NEWLINE); PdfPTable table = generateCategoryBudgets(); if(table != null) @@ -244,8 +272,8 @@ public class ReportGenerator name = "Keine Kategorie"; } return name; - case DATE: - return reportItem.getDate(); + case DATE: + return DateTime.parse(reportItem.getDate(), DateTimeFormat.forPattern("YYYY-MM-dd")).toString("dd.MM.YYYY"); case DESCRIPTION: return reportItem.getDescription(); case NAME: diff --git a/src/de/deadlocker8/budgetmaster/main/_de.properties b/src/de/deadlocker8/budgetmaster/main/_de.properties index d82abed3111911a5cf8458a12db8f1427b0437b9..fd5fb2a3405a5283d60152c08e6be9359c0b0961 100644 --- a/src/de/deadlocker8/budgetmaster/main/_de.properties +++ b/src/de/deadlocker8/budgetmaster/main/_de.properties @@ -1,7 +1,7 @@ app.name=BudgetMaster -version.code=4 -version.name=1.3.0 -version.date=10.08.17 +version.code=5 +version.name=1.3.1 +version.date=12.08.17 author=Robert Goldmann folder=Deadlocker/BudgetMaster diff --git a/src/de/deadlocker8/budgetmaster/ui/controller/ReportController.java b/src/de/deadlocker8/budgetmaster/ui/controller/ReportController.java index 4790ea4e2a084fb0a68e878ac533fca679e01494..9d48523978f3db1faf0859d6fa2054c0387a4510 100644 --- a/src/de/deadlocker8/budgetmaster/ui/controller/ReportController.java +++ b/src/de/deadlocker8/budgetmaster/ui/controller/ReportController.java @@ -9,6 +9,9 @@ import java.util.ArrayList; import java.util.Date; import java.util.Optional; +import org.joda.time.DateTime; + +import de.deadlocker8.budgetmaster.logic.Budget; import de.deadlocker8.budgetmaster.logic.FilterSettings; import de.deadlocker8.budgetmaster.logic.Payment; import de.deadlocker8.budgetmaster.logic.RepeatingPaymentEntry; @@ -60,6 +63,7 @@ public class ReportController implements Refreshable @FXML private AnchorPane anchorPaneMain; @FXML private Label labelPayments; @FXML private Label labelFilterActive; + @FXML private CheckBox checkBoxIncludeBudget; @FXML private CheckBox checkBoxSplitTable; @FXML private CheckBox checkBoxIncludeCategoryBudgets; @FXML private Button buttonFilter; @@ -85,6 +89,7 @@ public class ReportController implements Refreshable labelFilterActive.setStyle("-fx-text-fill: " + controller.getBundle().getString("color.text")); buttonFilter.setStyle("-fx-background-color: #2E79B9; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 16;"); buttonGenerate.setStyle("-fx-background-color: #2E79B9; -fx-text-fill: white; -fx-font-weight: bold; -fx-font-size: 16;"); + checkBoxIncludeBudget.setStyle("-fx-text-fill: " + controller.getBundle().getString("color.text") + "; -fx-font-size: 14;"); checkBoxSplitTable.setStyle("-fx-text-fill: " + controller.getBundle().getString("color.text") + "; -fx-font-size: 14;"); checkBoxIncludeCategoryBudgets.setStyle("-fx-text-fill: " + controller.getBundle().getString("color.text") + "; -fx-font-size: 14;"); @@ -522,19 +527,31 @@ public class ReportController implements Refreshable fileChooser.setInitialDirectory(reportPath.getParentFile()); fileChooser.setInitialFileName(reportPath.getName()); } + else + { + DateTime currentDate = controller.getCurrentDate(); + String currentMonth = currentDate.toString("MMMM"); + String currentYear = currentDate.toString("YYYY"); + fileChooser.setInitialFileName("BudgetMaster Monatsbericht - " + currentMonth + " " + currentYear + ".pdf"); + } fileChooser.getExtensionFilters().add(extFilter); File file = fileChooser.showSaveDialog(controller.getStage()); if(file != null) { reportPath = file; + + Budget budget = new Budget(controller.getPaymentHandler().getPayments()); + ReportGenerator reportGenerator = new ReportGenerator(new ArrayList<ReportItem>(tableView.getItems()), controller.getCategoryBudgets(), columnOrder, + checkBoxIncludeBudget.isSelected(), checkBoxSplitTable.isSelected(), checkBoxIncludeCategoryBudgets.isSelected(), file, controller.getSettings().getCurrency(), - controller.getCurrentDate()); + controller.getCurrentDate(), + budget); Stage modalStage = Helpers.showModal("Vorgang läuft", "Der Monatsbericht wird erstellt, bitte warten...", controller.getStage(), controller.getIcon()); diff --git a/src/de/deadlocker8/budgetmaster/ui/fxml/ReportTab.fxml b/src/de/deadlocker8/budgetmaster/ui/fxml/ReportTab.fxml index ab291d65658415d00f20767d52e55fdb8d82a51b..35239f67f597ccd7771823c28e4fed449228c04d 100644 --- a/src/de/deadlocker8/budgetmaster/ui/fxml/ReportTab.fxml +++ b/src/de/deadlocker8/budgetmaster/ui/fxml/ReportTab.fxml @@ -39,6 +39,7 @@ <children> <VBox spacing="10.0"> <children> + <CheckBox fx:id="checkBoxIncludeBudget" mnemonicParsing="false" text="Budgetkalkulation hinzufügen" /> <CheckBox fx:id="checkBoxSplitTable" mnemonicParsing="false" text="Einnahmen und Ausgaben als getrennte Tabellen" /> <CheckBox fx:id="checkBoxIncludeCategoryBudgets" mnemonicParsing="false" text="Verbrauch nach Kategorien hinzufügen" /> </children> diff --git a/src/de/deadlocker8/budgetmasterserver/main/_de.properties b/src/de/deadlocker8/budgetmasterserver/main/_de.properties index 713a76327463db483cc54898db38106a16685244..cc0a0ccf45be1d7000a5eb8be6afcf220a9ae49c 100644 --- a/src/de/deadlocker8/budgetmasterserver/main/_de.properties +++ b/src/de/deadlocker8/budgetmasterserver/main/_de.properties @@ -1,5 +1,5 @@ app.name=BudgetMasterServer -version.code=4 -version.name=1.3.0 -version.date=10.08.17 +version.code=5 +version.name=1.3.1 +version.date=12.08.17 author=Robert Goldmann \ No newline at end of file