From 9a6c7e0741252c4cc7c5a6c7f8a982e4e7e83c53 Mon Sep 17 00:00:00 2001 From: Ralph Soika Date: Thu, 6 Jun 2024 11:39:36 +0200 Subject: [PATCH] neues OP Listen Template --- .../OPListExportAdapterByWeek.java | 100 ++++++++++++++---- templates/op-liste_kw_template.xlsx | Bin 42198 -> 45035 bytes 2 files changed, 81 insertions(+), 19 deletions(-) diff --git a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/OPListExportAdapterByWeek.java b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/OPListExportAdapterByWeek.java index 062dc82..a48fad0 100644 --- a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/OPListExportAdapterByWeek.java +++ b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/OPListExportAdapterByWeek.java @@ -159,8 +159,8 @@ public class OPListExportAdapterByWeek extends POIFindReplaceAdapter { double saldoEUR1 = 0; double saldoUSD2 = 0; double saldoEUR2 = 0; - double saldoUSD3 = 0; - double saldoEUR3 = 0; + // double saldoUSD3 = 0; + // double saldoEUR3 = 0; List spaceNames = new ArrayList(); // compute all departments @@ -203,6 +203,8 @@ public class OPListExportAdapterByWeek extends POIFindReplaceAdapter { XSSFRow referenceRowValues = sheet.getRow(11); XSSFRow referenceRowCurrentWeek = sheet.getRow(12); + XSSFRow referenceRowTotal = sheet.getRow(15); + // Aktuelle KW berechnen calendar.setTime(new Date()); int currentWeekNumber = calendar.get(Calendar.WEEK_OF_YEAR); @@ -214,9 +216,16 @@ public class OPListExportAdapterByWeek extends POIFindReplaceAdapter { currentWeekCategory = currentWeekCategory + currentWeekNumber; } + /* + * --- Phase 1 ------------------------------------------------------- + * Im folgenden fügen wir erst einmal in der Kopfzeile zusätzlich + * Spaltenüberschriften für jede Abteilung ein + */ XSSFCell cellSpaceLabelReference = rowSpacesLabels.getCell(2); XSSFCell cellSpaceCurrencyReference = referenceRowSpacesCurrencies.getCell(1); - int column = 1; + // XSSFCell cellKWTotalReference = referenceRowCurrentWeek.getCell(1); + XSSFCell cellKWTotalReference = referenceRowTotal.getCell(14); + int column = 1; // beginn in der 2. Spalte! for (ItemCollection space : spaces) { XSSFCell cell = null; String spaceName = space.getItemValueString("space.name"); @@ -251,12 +260,40 @@ public class OPListExportAdapterByWeek extends POIFindReplaceAdapter { logger.info("...grouping invoices by week..."); // collect all invoices for this space grouped by week.... groupInvoicesByWeek(spaceID, spaceName, weekDataMap); - } - // now build a new row for each week and print out the collected invoice data - // first iterate over all objects and collect all known weeks and sort them into - // a ordered list.... + /* + * --- Phase 2 ------------------------------------------------------- + * Nun bilden wir nochmal 2 weitere Spalten am Ende um eine Summenbildung in + * EUR/USD pro KW zu ermöglichen + */ + XSSFCell cell = null; + // column++; + // Space currency EUR + cell = referenceRowSpacesCurrencies.getCell(column); + cell.copyCellFrom(cellKWTotalReference, new CellCopyPolicy()); + cell.setCellValue("EUR"); + cell = rowSpacesLabels.getCell(column); + cell.copyCellFrom(cellKWTotalReference, new CellCopyPolicy()); + cell.setCellValue(""); + + // Space currency USD + column++; + cell = referenceRowSpacesCurrencies.getCell(column); + cell.copyCellFrom(cellKWTotalReference, new CellCopyPolicy()); + cell.setCellValue("USD"); + + // Space Label + cell = rowSpacesLabels.getCell(column); + cell.copyCellFrom(cellKWTotalReference, new CellCopyPolicy()); + cell.setCellValue("Gesamt"); + + /* + * --- Phase 3 ------------------------------------------------------- + * now build a new row for each week and print out the collected invoice data + * first iterate over all objects and collect all known weeks and sort them into + * a ordered list.... + */ List sortedWeekList = new ArrayList(); Iterator> iterator = weekDataMap.entrySet().iterator(); while (iterator.hasNext()) { @@ -268,18 +305,19 @@ public class OPListExportAdapterByWeek extends POIFindReplaceAdapter { } Collections.sort(sortedWeekList); - int rowPos = 11; - /* + * --- Phase 4 ------------------------------------------------------- * Nun müssen wir so viele Zeilen nach unten schieben wie wir gleich einfügen. * Dazu müssen wir kurz einen Probelauf machen um die geplante Anzahl zu * errechnen.... */ + int rowPos = 11; int insertCount = sortedWeekList.size(); sheet.shiftRows(rowPos + 1, 2999, insertCount, true, true); /* - * Jetzt Zeile für Zeile einfügen.... + * --- Phase 5 ------------------------------------------------------- + * Jetzt Zahlen Zeile für Zeile einfügen.... */ boolean ueberFaellig = true; for (String week : sortedWeekList) { @@ -301,6 +339,8 @@ public class OPListExportAdapterByWeek extends POIFindReplaceAdapter { // iterate over all spaceNames and test if we have any data to put it into the // row cells.... column = 1; + double kwTotalEUR = 0; + double kwTotalUSD = 0; for (String name : spaceNames) { String key = name + "/" + week; logger.info("search WeekInvoiceData for " + key); @@ -309,29 +349,48 @@ public class OPListExportAdapterByWeek extends POIFindReplaceAdapter { if (weekData != null) { logger.info(" EUR=" + weekData.totalEUR + " USD=" + weekData.totalUSD); row.getCell(column).setCellValue(weekData.totalEUR); - column++; row.getCell(column).setCellValue(weekData.totalUSD); - saldoUSD3 = InvoiceUtil.round(saldoUSD3 + weekData.totalUSD); - if (ueberFaellig) { saldoEUR1 = InvoiceUtil.round(saldoEUR1 + weekData.totalEUR); saldoUSD1 = InvoiceUtil.round(saldoUSD1 + weekData.totalUSD); - } else { saldoEUR2 = InvoiceUtil.round(saldoEUR2 + weekData.totalEUR); saldoUSD2 = InvoiceUtil.round(saldoUSD2 + weekData.totalUSD); - } - + kwTotalEUR = kwTotalEUR + weekData.totalEUR; + kwTotalUSD = kwTotalUSD + weekData.totalUSD; column++; - } else { logger.info("...... NOT FOUND"); // skip columns column = column + 2; } } + // KW Summe anzeigen + if (week.equals(currentWeekCategory)) { + XSSFCell kwTotalCell = row.getCell(column); + // kwTotalCell.copyCellFrom(cellKWTotalReference, new CellCopyPolicy()); + kwTotalCell.setCellValue(kwTotalEUR); + + column++; + // row.getCell(column).setCellValue(kwTotalUSD); + kwTotalCell = row.getCell(column); + // kwTotalCell.copyCellFrom(cellKWTotalReference, new CellCopyPolicy()); + kwTotalCell.setCellValue(kwTotalUSD); + + } else { + XSSFCell kwTotalCell = row.getCell(column); + kwTotalCell.copyCellFrom(cellKWTotalReference, new CellCopyPolicy()); + kwTotalCell.setCellValue(kwTotalEUR); + + column++; + // row.getCell(column).setCellValue(kwTotalUSD); + kwTotalCell = row.getCell(column); + kwTotalCell.copyCellFrom(cellKWTotalReference, new CellCopyPolicy()); + kwTotalCell.setCellValue(kwTotalUSD); + + } } // delete reference rows @@ -339,8 +398,11 @@ public class OPListExportAdapterByWeek extends POIFindReplaceAdapter { sheet.shiftRows(12, rowPos, -1, true, true); sheet.shiftRows(rowPos + 2, rowPos + 6, -3, true, true); - // now lets update the totals... - // Überfällig + /* + * --- Phase 6 ------------------------------------------------------- + * now lets update the totals... + * Überfällig + */ XSSFCell cTotalEUR1 = getCellByRef(doc, sheet, "TOTALEUR1"); XSSFCell cTotalUSD1 = getCellByRef(doc, sheet, "TOTALUSD1"); cTotalEUR1.setCellValue(saldoEUR1); diff --git a/templates/op-liste_kw_template.xlsx b/templates/op-liste_kw_template.xlsx index c20890209c95b645eed28d4ad0cdebd9cf886ccc..d8c8d56657723ec596c1dcdad113bd02039c0305 100644 GIT binary patch delta 7746 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 delta 4914 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