From 8285b6ee7075f947809e78a12c59fe5def482250 Mon Sep 17 00:00:00 2001 From: Ralph Soika Date: Thu, 6 Jun 2024 22:02:56 +0200 Subject: [PATCH] summenbildung --- .../OPListExportAdapterByWeek.java | 115 ++++++++++++++---- templates/op-liste_kw_template.xlsx | Bin 45035 -> 42137 bytes 2 files changed, 94 insertions(+), 21 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 a48fad0..0c89680 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 @@ -155,10 +155,16 @@ public class OPListExportAdapterByWeek extends POIFindReplaceAdapter { private void insertInvoiceRows(ItemCollection document, String fileName) throws PluginException, QueryException { - double saldoUSD1 = 0; - double saldoEUR1 = 0; - double saldoUSD2 = 0; - double saldoEUR2 = 0; + // double saldoUSD1 = 0; + // double saldoEUR1 = 0; + // double saldoUSD2 = 0; + // double saldoEUR2 = 0; + + Map totalsUeberfaelligEUR = new HashMap(); + Map totalsFaelligEUR = new HashMap(); + Map totalsUeberfaelligUSD = new HashMap(); + Map totalsFaelligUSD = new HashMap(); + // double saldoUSD3 = 0; // double saldoEUR3 = 0; List spaceNames = new ArrayList(); @@ -260,8 +266,19 @@ public class OPListExportAdapterByWeek extends POIFindReplaceAdapter { logger.info("...grouping invoices by week..."); // collect all invoices for this space grouped by week.... groupInvoicesByWeek(spaceID, spaceName, weekDataMap); - } + // init totals + for (String name : spaceNames) { + totalsUeberfaelligEUR.put(name, 0.0); + totalsFaelligEUR.put(name, 0.0); + totalsUeberfaelligUSD.put(name, 0.0); + totalsFaelligUSD.put(name, 0.0); + } + } + totalsUeberfaelligEUR.put("TOTAL", 0.0); + totalsFaelligEUR.put("TOTAL", 0.0); + totalsUeberfaelligUSD.put("TOTAL", 0.0); + totalsFaelligUSD.put("TOTAL", 0.0); /* * --- Phase 2 ------------------------------------------------------- * Nun bilden wir nochmal 2 weitere Spalten am Ende um eine Summenbildung in @@ -341,6 +358,7 @@ public class OPListExportAdapterByWeek extends POIFindReplaceAdapter { column = 1; double kwTotalEUR = 0; double kwTotalUSD = 0; + for (String name : spaceNames) { String key = name + "/" + week; logger.info("search WeekInvoiceData for " + key); @@ -352,11 +370,23 @@ public class OPListExportAdapterByWeek extends POIFindReplaceAdapter { column++; row.getCell(column).setCellValue(weekData.totalUSD); if (ueberFaellig) { - saldoEUR1 = InvoiceUtil.round(saldoEUR1 + weekData.totalEUR); - saldoUSD1 = InvoiceUtil.round(saldoUSD1 + weekData.totalUSD); + double eur = totalsUeberfaelligEUR.get(name); + eur = InvoiceUtil.round(eur + weekData.totalEUR); + totalsUeberfaelligEUR.put(name, eur); + double usd = totalsUeberfaelligUSD.get(name); + usd = InvoiceUtil.round(usd + weekData.totalUSD); + totalsUeberfaelligUSD.put(name, usd); + // 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); + double eur = totalsFaelligEUR.get(name); + eur = InvoiceUtil.round(eur + weekData.totalEUR); + totalsFaelligEUR.put(name, eur); + double usd = totalsFaelligUSD.get(name); + usd = InvoiceUtil.round(usd + weekData.totalUSD); + totalsFaelligUSD.put(name, usd); + // saldoEUR2 = InvoiceUtil.round(saldoEUR2 + weekData.totalEUR); + // saldoUSD2 = InvoiceUtil.round(saldoUSD2 + weekData.totalUSD); } kwTotalEUR = kwTotalEUR + weekData.totalEUR; kwTotalUSD = kwTotalUSD + weekData.totalUSD; @@ -392,6 +422,23 @@ public class OPListExportAdapterByWeek extends POIFindReplaceAdapter { } + // store totals + if (ueberFaellig) { + double eur = totalsUeberfaelligEUR.get("TOTAL"); + eur = InvoiceUtil.round(eur + kwTotalEUR); + totalsUeberfaelligEUR.put("TOTAL", eur); + double usd = totalsUeberfaelligUSD.get("TOTAL"); + usd = InvoiceUtil.round(usd + kwTotalUSD); + totalsUeberfaelligUSD.put("TOTAL", usd); + } else { + double eur = totalsFaelligEUR.get("TOTAL"); + eur = InvoiceUtil.round(eur + kwTotalEUR); + totalsFaelligEUR.put("TOTAL", eur); + double usd = totalsFaelligUSD.get("TOTAL"); + usd = InvoiceUtil.round(usd + kwTotalUSD); + totalsFaelligUSD.put("TOTAL", usd); + } + } // delete reference rows logger.info("..shift 12 to " + rowPos); @@ -403,19 +450,45 @@ public class OPListExportAdapterByWeek extends POIFindReplaceAdapter { * now lets update the totals... * Überfällig */ - XSSFCell cTotalEUR1 = getCellByRef(doc, sheet, "TOTALEUR1"); - XSSFCell cTotalUSD1 = getCellByRef(doc, sheet, "TOTALUSD1"); - cTotalEUR1.setCellValue(saldoEUR1); - cTotalUSD1.setCellValue(saldoUSD1); - XSSFCell cTotalEUR2 = getCellByRef(doc, sheet, "TOTALEUR2"); - XSSFCell cTotalUSD2 = getCellByRef(doc, sheet, "TOTALUSD2"); - cTotalEUR2.setCellValue(saldoEUR2); - cTotalUSD2.setCellValue(saldoUSD2); + int _rowNo = sortedWeekList.size() + 11; + XSSFRow rowUeberFaellig = sheet.getRow(_rowNo); + XSSFRow rowFaellig = sheet.getRow(_rowNo + 1); + XSSFRow rowTotal = sheet.getRow(_rowNo + 2); + column = 1; + XSSFCell totalCell = null; + for (String name : spaceNames) { + totalCell = rowUeberFaellig.getCell(column); + totalCell.setCellValue(totalsUeberfaelligEUR.get(name)); + totalCell = rowFaellig.getCell(column); + totalCell.setCellValue(totalsFaelligEUR.get(name)); + totalCell = rowTotal.getCell(column); + totalCell.setCellValue(totalsUeberfaelligEUR.get(name) + totalsFaelligEUR.get(name)); + column++; + totalCell = rowUeberFaellig.getCell(column); + totalCell.setCellValue(totalsUeberfaelligUSD.get(name)); + totalCell = rowFaellig.getCell(column); + totalCell.setCellValue(totalsFaelligUSD.get(name)); + totalCell = rowTotal.getCell(column); + totalCell.setCellValue(totalsUeberfaelligUSD.get(name) + totalsFaelligUSD.get(name)); + column++; + } + // totals + totalCell = rowUeberFaellig.getCell(column); + totalCell.setCellValue(totalsUeberfaelligEUR.get("TOTAL")); + totalCell = rowFaellig.getCell(column); + totalCell.setCellValue(totalsFaelligEUR.get("TOTAL")); + totalCell = rowTotal.getCell(column); + totalCell.setCellValue(totalsUeberfaelligEUR.get("TOTAL") + totalsFaelligEUR.get("TOTAL")); + column++; + totalCell = rowUeberFaellig.getCell(column); + totalCell.setCellValue(totalsUeberfaelligUSD.get("TOTAL")); + totalCell = rowFaellig.getCell(column); + totalCell.setCellValue(totalsFaelligUSD.get("TOTAL")); + totalCell = rowTotal.getCell(column); + totalCell.setCellValue(totalsUeberfaelligUSD.get("TOTAL") + totalsFaelligUSD.get("TOTAL")); - XSSFCell cTotalEUR3 = getCellByRef(doc, sheet, "TOTALEUR3"); - XSSFCell cTotalUSD3 = getCellByRef(doc, sheet, "TOTALUSD3"); - cTotalEUR3.setCellValue(InvoiceUtil.round(saldoEUR1 + saldoEUR2)); - cTotalUSD3.setCellValue(InvoiceUtil.round(saldoUSD1 + saldoUSD2)); + // delete placeholder row + sheet.shiftRows(_rowNo, _rowNo + 3, -1); // write back the file ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); diff --git a/templates/op-liste_kw_template.xlsx b/templates/op-liste_kw_template.xlsx index d8c8d56657723ec596c1dcdad113bd02039c0305..71427d1590b52bf7fe22e588bbfd2a1381def2b7 100644 GIT binary patch delta 4781 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 delta 7695 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