diff --git a/src/de/deadlocker8/budgetmaster/logic/report/AmountType.java b/src/de/deadlocker8/budgetmaster/logic/report/AmountType.java new file mode 100644 index 0000000000000000000000000000000000000000..a114ffd7c1c5aaf362a0499818a285b4266075bc --- /dev/null +++ b/src/de/deadlocker8/budgetmaster/logic/report/AmountType.java @@ -0,0 +1,6 @@ +package de.deadlocker8.budgetmaster.logic.report; + +public enum AmountType +{ + INCOME, PAYMENT, BOTH +} diff --git a/src/de/deadlocker8/budgetmaster/logic/report/ReportGenerator.java b/src/de/deadlocker8/budgetmaster/logic/report/ReportGenerator.java index c8381e136ba9d442aa3b0003b95f81c5afa5e59d..31204a3c3505b7691805551d9a2da91839003059 100644 --- a/src/de/deadlocker8/budgetmaster/logic/report/ReportGenerator.java +++ b/src/de/deadlocker8/budgetmaster/logic/report/ReportGenerator.java @@ -46,30 +46,28 @@ public class ReportGenerator this.date = date; } - public void generate() throws FileNotFoundException, DocumentException + private Chapter generateHeader() { - Document document = new Document(); - PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(savePath)); - writer.setPageEvent(new HeaderFooterPageEvent()); - document.open(); - - //header Font chapterFont = new Font(FontFamily.HELVETICA, 16, Font.BOLDITALIC); - Font paragraphFont = new Font(FontFamily.HELVETICA, 12, Font.NORMAL); - 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("Buchungen", paragraphFont)); - document.add(chapter); - document.add(Chunk.NEWLINE); - - //table + Font paragraphFont = new Font(FontFamily.HELVETICA, 12, Font.NORMAL); + 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)); + return chapter; + } + + private PdfPTable generateTable(int tableWidth, AmountType amountType) + { int numberOfColumns = columnOrder.getColumns().size(); + int totalIncome = 0; + int totalPayment = 0; + if(numberOfColumns > 0) { PdfPTable table = new PdfPTable(numberOfColumns); - table.setWidthPercentage(100); + table.setWidthPercentage(tableWidth); Font font = new Font(FontFamily.HELVETICA, 8, Font.NORMAL, GrayColor.BLACK); for(ColumnType column : columnOrder.getColumns()) @@ -81,9 +79,25 @@ public class ReportGenerator table.addCell(cell); } - for(ReportItem currentItem : reportItems) { + if(currentItem.getAmount() > 0) + { + totalIncome += currentItem.getAmount(); + if(amountType == AmountType.PAYMENT) + { + continue; + } + } + else + { + totalPayment += currentItem.getAmount(); + if(amountType == AmountType.INCOME) + { + continue; + } + } + for(ColumnType column : columnOrder.getColumns()) { PdfPCell cell = new PdfPCell(new Phrase(getProperty(currentItem, column), font)); @@ -91,12 +105,79 @@ public class ReportGenerator cell.setHorizontalAlignment(Element.ALIGN_CENTER); table.addCell(cell); } + } + + PdfPCell cellTotal; + String total = ""; + switch(amountType) + { + case BOTH: + String totalIncomeString = String.valueOf(Helpers.NUMBER_FORMAT.format(totalIncome / 100.0).replace(".", ",")) + " " + currency; + String totalPaymentString = String.valueOf(Helpers.NUMBER_FORMAT.format(totalPayment / 100.0).replace(".", ",")) + " " + currency; + total = "Einnahmen: " + totalIncomeString + " / Ausgaben: " + totalPaymentString; + break; + case INCOME: + total = "Summe: " + String.valueOf(Helpers.NUMBER_FORMAT.format(totalIncome / 100.0).replace(".", ",")) + " " + currency; + break; + case PAYMENT: + total = "Summe: " + String.valueOf(Helpers.NUMBER_FORMAT.format(totalPayment / 100.0).replace(".", ",")) + " " + currency; + break; + default: + break; } - - document.add(table); + cellTotal = new PdfPCell(new Phrase(total, font)); + cellTotal.setBackgroundColor(new BaseColor(Color.WHITE)); + cellTotal.setColspan(numberOfColumns); + cellTotal.setHorizontalAlignment(Element.ALIGN_RIGHT); + table.addCell(cellTotal); + + return table; + } + return null; + } + + public void generate() throws FileNotFoundException, DocumentException + { + Document document = new Document(); + PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(savePath)); + writer.setPageEvent(new HeaderFooterPageEvent()); + document.open(); + document.setMargins(50, 45, 50, 70); + + document.add(generateHeader()); + document.add(Chunk.NEWLINE); + + if(splitTable) + { + Font paragraphFont = new Font(FontFamily.HELVETICA, 12, Font.NORMAL); + + document.add(new Paragraph("Einnahmen", paragraphFont)); + document.add(Chunk.NEWLINE); + PdfPTable table = generateTable(100, AmountType.INCOME); + if(table != null) + { + document.add(table); + } + + document.add(Chunk.NEWLINE); + document.add(new Paragraph("Ausgaben", paragraphFont)); + document.add(Chunk.NEWLINE); + table = generateTable(100, AmountType.PAYMENT); + if(table != null) + { + document.add(table); + } } - + else + { + PdfPTable table = generateTable(100, AmountType.BOTH); + if(table != null) + { + document.add(table); + } + } + document.close(); } @@ -107,9 +188,9 @@ public class ReportGenerator case AMOUNT: return String.valueOf(Helpers.NUMBER_FORMAT.format(reportItem.getAmount() / 100.0).replace(".", ",")) + " " + currency; case CATEGORY: - return reportItem.getCategory().getName(); + return reportItem.getCategory().getName(); case DATE: - return reportItem.getDate(); + return reportItem.getDate(); case DESCRIPTION: return reportItem.getDescription(); case NAME: @@ -119,7 +200,7 @@ public class ReportGenerator case RATING: return reportItem.getAmount() > 0 ? "+" : "-"; case REPEATING: - //TODO icon + // TODO icon return String.valueOf(reportItem.getRepeating()); default: return null; diff --git a/src/de/deadlocker8/budgetmaster/ui/ReportController.java b/src/de/deadlocker8/budgetmaster/ui/ReportController.java index be9f9c5ede387dfccf6b23608e942b865f43494f..371df69e91f383f4a0bb65bfe3eb1435d299793a 100644 --- a/src/de/deadlocker8/budgetmaster/ui/ReportController.java +++ b/src/de/deadlocker8/budgetmaster/ui/ReportController.java @@ -67,6 +67,7 @@ public class ReportController implements Refreshable private Controller controller; private ColumnFilter columnFilter; + private File reportPath; public void init(Controller controller) { @@ -421,10 +422,16 @@ public class ReportController implements Refreshable FileChooser fileChooser = new FileChooser(); fileChooser.setTitle("Bericht speichern"); FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter("PDF (*.pdf)", "*.pdf"); + if(reportPath != null) + { + fileChooser.setInitialDirectory(reportPath.getParentFile()); + fileChooser.setInitialFileName(reportPath.getName()); + } fileChooser.getExtensionFilters().add(extFilter); File file = fileChooser.showSaveDialog(controller.getStage()); if(file != null) { + reportPath = file; ReportGenerator reportGenerator = new ReportGenerator(new ArrayList<ReportItem>(tableView.getItems()), columnOrder, checkBoxSplitTable.isSelected(),