opliste improvements

This commit is contained in:
Ralph Soika 2024-11-24 14:54:46 +01:00
parent 2a12ecaf3c
commit aabb7ab04d
3 changed files with 443 additions and 402 deletions

View file

@ -22,7 +22,6 @@ import org.apache.poi.ss.usermodel.CellCopyPolicy;
import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.FillPatternType; import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.IndexedColors; import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.Row.MissingCellPolicy;
import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFSheet;
@ -133,7 +132,6 @@ public class OPListExportAdapterByWeek extends POIFindReplaceAdapter {
String textblock = excelDefCollection.getItemValueString("textblock"); String textblock = excelDefCollection.getItemValueString("textblock");
String template = excelDefCollection.getItemValueString("template"); String template = excelDefCollection.getItemValueString("template");
String targetName = excelDefCollection.getItemValueString("target-name"); String targetName = excelDefCollection.getItemValueString("target-name");
boolean filter = evalItemCollection.getItemValueBoolean("filter");
// adapt text.... // adapt text....
targetName = workflowService.adaptText(targetName, document); targetName = workflowService.adaptText(targetName, document);
@ -150,7 +148,7 @@ public class OPListExportAdapterByWeek extends POIFindReplaceAdapter {
// first add the columns for the currency list // first add the columns for the currency list
addCurrencyColumns(doc, sheet, currencyList, spaces); addCurrencyColumns(doc, sheet, currencyList, spaces);
// insertInvoiceRows(sheet, document, targetName, filter, currencyList); insertInvoiceRows(doc, sheet, currencyList, spaces);
// write back the updated excel file // write back the updated excel file
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
@ -162,7 +160,7 @@ public class OPListExportAdapterByWeek extends POIFindReplaceAdapter {
document.addFileData(fileDataNew); document.addFileData(fileDataNew);
logger.finest("......new document added"); logger.finest("......new document added");
} catch (IOException e) { } catch (IOException | QueryException e) {
throw new PluginException(OPListExportAdapter.class.getSimpleName(), throw new PluginException(OPListExportAdapter.class.getSimpleName(),
InvoiceService.ERROR_CONFIG, InvoiceService.ERROR_CONFIG,
"failed to update opliste: " + e.getMessage()); "failed to update opliste: " + e.getMessage());
@ -204,7 +202,7 @@ public class OPListExportAdapterByWeek extends POIFindReplaceAdapter {
List<ItemCollection> spaces) { List<ItemCollection> spaces) {
// zusaetzliche spalten einfuegen... // zusaetzliche spalten einfuegen...
int newColumns = (currencyList.size() * spaces.size()) - 1; int newColumns = (currencyList.size() * spaces.size()) - 0;
for (int i = 0; i < newColumns; i++) { for (int i = 0; i < newColumns; i++) {
logger.fine(".. add currency column..."); logger.fine(".. add currency column...");
POIUtil.insertColumn(sheet, 1, 2 + i); POIUtil.insertColumn(sheet, 1, 2 + i);
@ -226,6 +224,8 @@ public class OPListExportAdapterByWeek extends POIFindReplaceAdapter {
col++; col++;
} }
} }
// Add the total column
spaceRow.getCell(col).setCellValue("Total");
} }
/** /**
@ -242,35 +242,15 @@ public class OPListExportAdapterByWeek extends POIFindReplaceAdapter {
* @throws PluginException * @throws PluginException
* @throws QueryException * @throws QueryException
*/ */
private void insertInvoiceRows(ItemCollection document, String fileName, String currency1, private void insertInvoiceRows(XSSFWorkbook doc, XSSFSheet sheet, List<String> currencyList,
String currency2, List<ItemCollection> spaces) List<ItemCollection> spaces)
throws PluginException, QueryException { throws PluginException, QueryException {
Map<String, Double> totalsUeberfaelligCurrency1 = new HashMap<String, Double>();
Map<String, Double> totalsFaelligCurrency1 = new HashMap<String, Double>();
Map<String, Double> totalsUeberfaelligCurrency2 = new HashMap<String, Double>();
Map<String, Double> totalsFaelligCurrency2 = new HashMap<String, Double>();
List<String> spaceNames = new ArrayList<String>(); List<String> spaceNames = new ArrayList<String>();
Map<String, WeekInvoiceData> weekDataMap = new HashMap<String, WeekInvoiceData>(); Map<String, WeekInvoiceData> weekDataMap = new HashMap<String, WeekInvoiceData>();
FileData fileData = document.getFileData(fileName); Map<String, TotalInvoiceData> totalDataMapFaellig = new HashMap<String, TotalInvoiceData>();
Map<String, TotalInvoiceData> totalDataMapUeberFaellig = new HashMap<String, TotalInvoiceData>();
// load XSSFWorkbook
XSSFWorkbook doc = null;
try (InputStream imputStream = new ByteArrayInputStream(fileData.getContent())) {
doc = new XSSFWorkbook(imputStream);
// compute current week
Calendar calendar = new GregorianCalendar();
calendar.setTime(new Date());
int weekNumber = calendar.get(Calendar.WEEK_OF_YEAR);
int year = calendar.get(Calendar.YEAR);
String currentWeek = year + "/";
if (weekNumber < 10) {
currentWeek = currentWeek + "0" + weekNumber;
} else {
currentWeek = currentWeek + weekNumber;
}
CellStyle headerCellStyle = doc.createCellStyle(); CellStyle headerCellStyle = doc.createCellStyle();
// fill foreground color ... // fill foreground color ...
@ -278,18 +258,13 @@ public class OPListExportAdapterByWeek extends POIFindReplaceAdapter {
// and solid fill pattern produces solid grey cell fill // and solid fill pattern produces solid grey cell fill
headerCellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); headerCellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
// NOTE: we only take the first sheet !
XSSFSheet sheet = doc.getSheetAt(0);
// First we create a column for each Space.....
XSSFRow rowSpacesLabels = sheet.getRow(9);
XSSFRow referenceRowSpacesCurrencies = sheet.getRow(10);
XSSFRow referenceRowValues = sheet.getRow(11); XSSFRow referenceRowValues = sheet.getRow(11);
XSSFRow referenceRowCurrentWeek = sheet.getRow(12); XSSFRow referenceRowCurrentWeek = sheet.getRow(12);
XSSFRow referenceRowTotal = sheet.getRow(15); XSSFRow referenceRowTotal = sheet.getRow(15);
// Aktuelle KW berechnen // Aktuelle KW berechnen
Calendar calendar = new GregorianCalendar();
calendar.setTime(new Date()); calendar.setTime(new Date());
int currentWeekNumber = calendar.get(Calendar.WEEK_OF_YEAR); int currentWeekNumber = calendar.get(Calendar.WEEK_OF_YEAR);
int currentYear = calendar.get(Calendar.YEAR); int currentYear = calendar.get(Calendar.YEAR);
@ -299,89 +274,59 @@ public class OPListExportAdapterByWeek extends POIFindReplaceAdapter {
} else { } else {
currentWeekCategory = currentWeekCategory + currentWeekNumber; currentWeekCategory = currentWeekCategory + currentWeekNumber;
} }
logger.info("----------HACK");
currentWeekCategory = "2023/06";
/* /*
* --- Phase 1 ------------------------------------------------------- * --- Phase 1 -------------------------------------------------------
* Im folgenden fügen wir erst einmal in der Kopfzeile zusätzlich * Im folgenden gruppieren wir die Rechnungen nach Woche
* Spaltenüberschriften für jede Abteilung ein
*/ */
XSSFCell cellSpaceLabelReference = rowSpacesLabels.getCell(2);
XSSFCell cellSpaceCurrencyReference = referenceRowSpacesCurrencies.getCell(1); // XSSFCell cellKWTotalReference = referenceRowTotal.getCell(14);
// XSSFCell cellKWTotalReference = referenceRowCurrentWeek.getCell(1);
XSSFCell cellKWTotalReference = referenceRowTotal.getCell(14);
int column = 1; // beginn in der 2. Spalte! int column = 1; // beginn in der 2. Spalte!
for (ItemCollection space : spaces) { for (ItemCollection space : spaces) {
XSSFCell cell = null;
String spaceName = space.getItemValueString("space.name"); String spaceName = space.getItemValueString("space.name");
String spaceID = space.getUniqueID();
spaceNames.add(spaceName); spaceNames.add(spaceName);
// Space currency EUR
cell = referenceRowSpacesCurrencies.getCell(column);
cell.copyCellFrom(cellSpaceCurrencyReference, new CellCopyPolicy());
cell.setCellValue(currency1);
// Space currency USD
column++;
cell = referenceRowSpacesCurrencies.getCell(column);
cell.copyCellFrom(cellSpaceCurrencyReference, new CellCopyPolicy());
cell.setCellValue(currency2);
// Space Label
cell = rowSpacesLabels.getCell(column);
cell.setCellValue(spaceName);
// create two new cells...
column++;
cell = rowSpacesLabels.createCell(column);
cell.copyCellFrom(cellSpaceLabelReference, new CellCopyPolicy());
cell.setCellValue("");
cell = rowSpacesLabels.createCell(column);
cell.copyCellFrom(cellSpaceLabelReference, new CellCopyPolicy());
cell.setCellValue("");
logger.info("...grouping invoices by week..."); logger.info("...grouping invoices by week...");
// collect all invoices for this space grouped by week.... groupInvoicesByWeek(space.getUniqueID(), spaceName, weekDataMap);
groupInvoicesByWeek(spaceID, spaceName, weekDataMap, currency1); }
// init totals // init totals
for (String name : spaceNames) { for (String name : spaceNames) {
totalsUeberfaelligCurrency1.put(name, 0.0); totalDataMapFaellig.put(name, new TotalInvoiceData(name));
totalsFaelligCurrency1.put(name, 0.0); totalDataMapUeberFaellig.put(name, new TotalInvoiceData(name));
totalsUeberfaelligCurrency2.put(name, 0.0);
totalsFaelligCurrency2.put(name, 0.0);
} }
} totalDataMapFaellig.put("TOTAL", new TotalInvoiceData("TOTAL"));
totalsUeberfaelligCurrency1.put("TOTAL", 0.0); totalDataMapUeberFaellig.put("TOTAL", new TotalInvoiceData("TOTAL"));
totalsFaelligCurrency1.put("TOTAL", 0.0);
totalsUeberfaelligCurrency2.put("TOTAL", 0.0);
totalsFaelligCurrency2.put("TOTAL", 0.0);
/* /*
* --- Phase 2 ------------------------------------------------------- * --- Phase 2 -------------------------------------------------------
* Nun bilden wir nochmal 2 weitere Spalten am Ende um eine Summenbildung in * Nun bilden wir nochmal 2 weitere Spalten am Ende um eine Summenbildung in
* EUR/USD pro KW zu ermöglichen * EUR/USD pro KW zu ermöglichen
*/ */
XSSFCell cell = null; // XSSFCell cell = null;
// column++; // column++;
// Space currency EUR // // Space currency EUR
cell = referenceRowSpacesCurrencies.getCell(column, MissingCellPolicy.CREATE_NULL_AS_BLANK); // cell = referenceRowSpacesCurrencies.getCell(column,
cell.copyCellFrom(cellKWTotalReference, new CellCopyPolicy()); // MissingCellPolicy.CREATE_NULL_AS_BLANK);
cell.setCellValue(currency1); // cell.copyCellFrom(cellKWTotalReference, new CellCopyPolicy());
cell = rowSpacesLabels.getCell(column, MissingCellPolicy.CREATE_NULL_AS_BLANK); // cell.setCellValue(currency1);
cell.copyCellFrom(cellKWTotalReference, new CellCopyPolicy()); // cell = rowSpacesLabels.getCell(column,
cell.setCellValue(""); // MissingCellPolicy.CREATE_NULL_AS_BLANK);
// cell.copyCellFrom(cellKWTotalReference, new CellCopyPolicy());
// cell.setCellValue("");
// Space currency USD // Space currency USD
column++; // column++;
cell = referenceRowSpacesCurrencies.getCell(column, MissingCellPolicy.CREATE_NULL_AS_BLANK); // cell = referenceRowSpacesCurrencies.getCell(column,
cell.copyCellFrom(cellKWTotalReference, new CellCopyPolicy()); // MissingCellPolicy.CREATE_NULL_AS_BLANK);
cell.setCellValue(currency2); // cell.copyCellFrom(cellKWTotalReference, new CellCopyPolicy());
// cell.setCellValue(currency2);
// Space Label // // Space Label
cell = rowSpacesLabels.getCell(column, MissingCellPolicy.CREATE_NULL_AS_BLANK); // cell = rowSpacesLabels.getCell(column,
cell.copyCellFrom(cellKWTotalReference, new CellCopyPolicy()); // MissingCellPolicy.CREATE_NULL_AS_BLANK);
cell.setCellValue("Total"); // cell.copyCellFrom(cellKWTotalReference, new CellCopyPolicy());
// cell.setCellValue("Total");
/* /*
* --- Phase 3 ------------------------------------------------------- * --- Phase 3 -------------------------------------------------------
@ -418,7 +363,7 @@ public class OPListExportAdapterByWeek extends POIFindReplaceAdapter {
for (String week : sortedWeekList) { for (String week : sortedWeekList) {
// now create a new line.. // now create a new line..
rowPos++; rowPos++;
logger.fine("--> Zeile " + rowPos + " Week=" + week); logger.info("--> Zeile " + rowPos + " Week=" + week);
XSSFRow row = sheet.createRow(rowPos); XSSFRow row = sheet.createRow(rowPos);
if (week.equals(currentWeekCategory)) { if (week.equals(currentWeekCategory)) {
@ -439,159 +384,215 @@ public class OPListExportAdapterByWeek extends POIFindReplaceAdapter {
for (String name : spaceNames) { for (String name : spaceNames) {
String key = name + "/" + week; String key = name + "/" + week;
logger.fine("search WeekInvoiceData for " + key); logger.info("search WeekInvoiceData for " + key);
// list of invoices // list of invoices
WeekInvoiceData weekData = weekDataMap.get(key); WeekInvoiceData weekData = weekDataMap.get(key);
if (weekData != null) { if (weekData != null) {
logger.fine(" " + currency1 + "=" + weekData.totalCurrency1 + " " + currency2 + "=" // logger.fine(" " + currency1 + "=" + weekData.totalCurrency1 + " " + currency2
+ weekData.totalCurrency2); // + "="
row.getCell(column).setCellValue(weekData.totalCurrency1); // + weekData.totalCurrency2);
column++;
row.getCell(column).setCellValue(weekData.totalCurrency2); for (String currency : currencyList) {
logger.info("-- Col Number=" + column);
double betrag = weekData.getTotal(currency);
row.getCell(column).setCellValue(betrag);
if (ueberFaellig) { if (ueberFaellig) {
double eur = totalsUeberfaelligCurrency1.get(name); totalDataMapUeberFaellig.get(name).add(betrag, currency);
eur = InvoiceUtil.round(eur + weekData.totalCurrency1);
totalsUeberfaelligCurrency1.put(name, eur);
double usd = totalsUeberfaelligCurrency2.get(name);
usd = InvoiceUtil.round(usd + weekData.totalCurrency2);
totalsUeberfaelligCurrency2.put(name, usd);
// saldoEUR1 = InvoiceUtil.round(saldoEUR1 + weekData.totalEUR);
// saldoUSD1 = InvoiceUtil.round(saldoUSD1 + weekData.totalUSD);
} else { } else {
double eur = totalsFaelligCurrency1.get(name); totalDataMapFaellig.get(name).add(betrag, currency);
eur = InvoiceUtil.round(eur + weekData.totalCurrency1);
totalsFaelligCurrency1.put(name, eur);
double usd = totalsFaelligCurrency2.get(name);
usd = InvoiceUtil.round(usd + weekData.totalCurrency2);
totalsFaelligCurrency2.put(name, usd);
// saldoEUR2 = InvoiceUtil.round(saldoEUR2 + weekData.totalEUR);
// saldoUSD2 = InvoiceUtil.round(saldoUSD2 + weekData.totalUSD);
} }
kwTotalEUR = kwTotalEUR + weekData.totalCurrency1;
kwTotalUSD = kwTotalUSD + weekData.totalCurrency2;
column++; column++;
}
// row.getCell(column).setCellValue(weekData.totalCurrency1);
// column++;
// row.getCell(column).setCellValue(weekData.totalCurrency2);
// if (ueberFaellig) {
// double eur = totalsUeberfaelligCurrency1.get(name);
// eur = InvoiceUtil.round(eur + weekData.totalCurrency1);
// totalsUeberfaelligCurrency1.put(name, eur);
// double usd = totalsUeberfaelligCurrency2.get(name);
// usd = InvoiceUtil.round(usd + weekData.totalCurrency2);
// totalsUeberfaelligCurrency2.put(name, usd);
// // saldoEUR1 = InvoiceUtil.round(saldoEUR1 + weekData.totalEUR);
// // saldoUSD1 = InvoiceUtil.round(saldoUSD1 + weekData.totalUSD);
// } else {
// double eur = totalsFaelligCurrency1.get(name);
// eur = InvoiceUtil.round(eur + weekData.totalCurrency1);
// totalsFaelligCurrency1.put(name, eur);
// double usd = totalsFaelligCurrency2.get(name);
// usd = InvoiceUtil.round(usd + weekData.totalCurrency2);
// totalsFaelligCurrency2.put(name, usd);
// // saldoEUR2 = InvoiceUtil.round(saldoEUR2 + weekData.totalEUR);
// // saldoUSD2 = InvoiceUtil.round(saldoUSD2 + weekData.totalUSD);
// }
// kwTotalEUR = kwTotalEUR + weekData.totalCurrency1;
// kwTotalUSD = kwTotalUSD + weekData.totalCurrency2;
// column++;
} else { } else {
logger.fine("...... NOT FOUND"); logger.info("...... NOT FOUND");
// skip columns // skip columns
column = column + 2; for (String currency : currencyList) {
column++;
}
} }
} }
// KW Summe anzeigen // KW Summe anzeigen
if (week.equals(currentWeekCategory)) { // if (week.equals(currentWeekCategory)) {
XSSFCell kwTotalCell = row.getCell(column); // 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.copyCellFrom(cellKWTotalReference, new CellCopyPolicy());
kwTotalCell.setCellValue(kwTotalEUR); // kwTotalCell.setCellValue(kwTotalEUR);
column++; // column++;
// row.getCell(column).setCellValue(kwTotalUSD); // // row.getCell(column).setCellValue(kwTotalUSD);
kwTotalCell = row.getCell(column); // kwTotalCell = row.getCell(column);
// kwTotalCell.copyCellFrom(cellKWTotalReference, new CellCopyPolicy()); // kwTotalCell.copyCellFrom(cellKWTotalReference, new CellCopyPolicy());
kwTotalCell.setCellValue(kwTotalUSD); // 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);
}
// store totals // store totals
if (ueberFaellig) { // if (ueberFaellig) {
double eur = totalsUeberfaelligCurrency1.get("TOTAL"); // double eur = totalsUeberfaelligCurrency1.get("TOTAL");
eur = InvoiceUtil.round(eur + kwTotalEUR); // eur = InvoiceUtil.round(eur + kwTotalEUR);
totalsUeberfaelligCurrency1.put("TOTAL", eur); // totalsUeberfaelligCurrency1.put("TOTAL", eur);
double usd = totalsUeberfaelligCurrency2.get("TOTAL"); // double usd = totalsUeberfaelligCurrency2.get("TOTAL");
usd = InvoiceUtil.round(usd + kwTotalUSD); // usd = InvoiceUtil.round(usd + kwTotalUSD);
totalsUeberfaelligCurrency2.put("TOTAL", usd); // totalsUeberfaelligCurrency2.put("TOTAL", usd);
} else { // } else {
double eur = totalsFaelligCurrency1.get("TOTAL"); // double eur = totalsFaelligCurrency1.get("TOTAL");
eur = InvoiceUtil.round(eur + kwTotalEUR); // eur = InvoiceUtil.round(eur + kwTotalEUR);
totalsFaelligCurrency1.put("TOTAL", eur); // totalsFaelligCurrency1.put("TOTAL", eur);
double usd = totalsFaelligCurrency2.get("TOTAL"); // double usd = totalsFaelligCurrency2.get("TOTAL");
usd = InvoiceUtil.round(usd + kwTotalUSD); // usd = InvoiceUtil.round(usd + kwTotalUSD);
totalsFaelligCurrency2.put("TOTAL", usd); // totalsFaelligCurrency2.put("TOTAL", usd);
} // }
} }
// delete reference rows // delete reference rows
logger.finest("..shift 12 to " + rowPos); // logger.info("..shift 12 to " + rowPos);
sheet.shiftRows(12, rowPos, -1, true, true); // sheet.shiftRows(12, rowPos, -1, true, true);
sheet.shiftRows(rowPos + 2, rowPos + 6, -3, true, true); // sheet.shiftRows(rowPos + 2, rowPos + 6, -3, true, true);
/* /*
* --- Phase 6 ------------------------------------------------------- * --- Phase 6 -------------------------------------------------------
* now lets update the totals... * now lets update the totals...
* Überfällig * Überfällig
*/ */
int _rowNo = sortedWeekList.size() + 11; int _rowNo = sortedWeekList.size() + 14;
XSSFRow rowUeberFaellig = sheet.getRow(_rowNo); XSSFRow rowUeberFaellig = sheet.getRow(_rowNo);
XSSFRow rowFaellig = sheet.getRow(_rowNo + 1); XSSFRow rowFaellig = sheet.getRow(_rowNo + 1);
XSSFRow rowTotal = sheet.getRow(_rowNo + 2); XSSFRow rowTotal = sheet.getRow(_rowNo + 2);
column = 1; column = 1;
XSSFCell totalCell = null; XSSFCell totalCell = null;
for (String name : spaceNames) { for (String name : spaceNames) {
TotalInvoiceData totalDataUeberFaellig = totalDataMapUeberFaellig.get(name);
TotalInvoiceData totalDataFaellig = totalDataMapFaellig.get(name);
for (String currency : currencyList) {
// überfällig
totalCell = rowUeberFaellig.getCell(column); totalCell = rowUeberFaellig.getCell(column);
totalCell.setCellValue(totalsUeberfaelligCurrency1.get(name)); totalCell.setCellValue(totalDataUeberFaellig.getTotal(currency));
// noch nicht fällig
totalCell = rowFaellig.getCell(column); totalCell = rowFaellig.getCell(column);
totalCell.setCellValue(totalsFaelligCurrency1.get(name)); totalCell.setCellValue(totalDataFaellig.getTotal(currency));
// total...
totalCell = rowTotal.getCell(column); totalCell = rowTotal.getCell(column);
totalCell.setCellValue(totalsUeberfaelligCurrency1.get(name) + totalsFaelligCurrency1.get(name)); totalCell.setCellValue(InvoiceUtil
column++; .round(totalDataUeberFaellig.getTotal(currency) + totalDataFaellig.getTotal(currency)));
totalCell = rowUeberFaellig.getCell(column);
totalCell.setCellValue(totalsUeberfaelligCurrency2.get(name));
totalCell = rowFaellig.getCell(column);
totalCell.setCellValue(totalsFaelligCurrency2.get(name));
totalCell = rowTotal.getCell(column);
totalCell.setCellValue(totalsUeberfaelligCurrency2.get(name) + totalsFaelligCurrency2.get(name));
column++; column++;
} }
// totals
totalCell = rowUeberFaellig.getCell(column); }
totalCell.setCellValue(totalsUeberfaelligCurrency1.get("TOTAL")); // // totals
totalCell = rowFaellig.getCell(column); // totalCell = rowUeberFaellig.getCell(column);
totalCell.setCellValue(totalsFaelligCurrency1.get("TOTAL")); // totalCell.setCellValue(totalsUeberfaellig.get("TOTAL"));
totalCell = rowTotal.getCell(column); // totalCell = rowFaellig.getCell(column);
totalCell.setCellValue(totalsUeberfaelligCurrency1.get("TOTAL") + totalsFaelligCurrency1.get("TOTAL")); // totalCell.setCellValue(totalsFaelligCurrency1.get("TOTAL"));
column++; // totalCell = rowTotal.getCell(column);
totalCell = rowUeberFaellig.getCell(column); // totalCell.setCellValue(totalsUeberfaelligCurrency1.get("TOTAL") +
totalCell.setCellValue(totalsUeberfaelligCurrency2.get("TOTAL")); // totalsFaelligCurrency1.get("TOTAL"));
totalCell = rowFaellig.getCell(column); // column++;
totalCell.setCellValue(totalsFaelligCurrency2.get("TOTAL")); // totalCell = rowUeberFaellig.getCell(column);
totalCell = rowTotal.getCell(column); // totalCell.setCellValue(totalsUeberfaelligCurrency2.get("TOTAL"));
totalCell.setCellValue(totalsUeberfaelligCurrency2.get("TOTAL") + totalsFaelligCurrency2.get("TOTAL")); // totalCell = rowFaellig.getCell(column);
// totalCell.setCellValue(totalsFaelligCurrency2.get("TOTAL"));
// totalCell = rowTotal.getCell(column);
// totalCell.setCellValue(totalsUeberfaelligCurrency2.get("TOTAL") +
// totalsFaelligCurrency2.get("TOTAL"));
// delete placeholder row // delete placeholder row
sheet.shiftRows(_rowNo, _rowNo + 3, -1); sheet.shiftRows(_rowNo, _rowNo + 3, -1);
// write back the file logger.finest("......invoices added");
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
doc.write(byteArrayOutputStream);
byte[] newContent = byteArrayOutputStream.toByteArray(); }
FileData fileDataNew = new FileData(fileData.getName(), newContent, fileData.getContentType(), null);
// update the fileData
document.addFileData(fileDataNew);
logger.finest("......new document added");
} catch (IOException e) { /**
throw new PluginException(OPListExportAdapterByWeek.class.getSimpleName(), InvoiceService.ERROR_CONFIG, * Diese Methode gruppiert eine Rechnungsliste nach Kalenderwoche
"failed to update opliste: " + e.getMessage()); *
} finally { * @param spaceID - Space Ref to select a list of invoices associated with
if (doc != null) { * a
* space
* @param weekDataCache - a local cache storing all invoices by week
*
*
*/
private void groupInvoicesByWeek(String spaceID, String spaceName,
Map<String, WeekInvoiceData> weekDataCache) {
logger.info("...group invoices (DEBUG) for " + spaceName + "/" + spaceID);
try { try {
doc.close(); List<ItemCollection> invoices = documentService.find(
} catch (IOException e) { "$modelversion:rechnungsausgang-* AND type:workitem AND $uniqueidref:" + spaceID, 9999, 0,
logger.severe("Failed to close workbook: " + e.getMessage()); "invoice.number", false);
logger.fine(" found " + invoices.size() + " for space " + spaceName);
for (ItemCollection invoice : invoices) {
// compute Week
Date dueDate = invoice.getItemValueDate("invoice.duedate");
LocalDate localDate = dueDate.toInstant()
.atZone(ZoneId.systemDefault())
.toLocalDate();
int weekNumber = localDate.get(IsoFields.WEEK_OF_WEEK_BASED_YEAR);
int weekBasedYear = localDate.get(IsoFields.WEEK_BASED_YEAR);
String weekCategory = weekBasedYear + "/" + String.format("%02d", weekNumber);
if ("2024/01".equals(weekCategory)) {
logger.warning("--> Invoice found with 2024/01: " + invoice.getUniqueID());
}
// haben wir schon ein listchen?
String key = spaceName + "/" + weekCategory;
logger.fine(" ....building weekInvoiceData object for " + key);
WeekInvoiceData weekData = weekDataCache.get(key);
if (weekData == null) {
weekData = new WeekInvoiceData(spaceName, weekCategory);
}
// Jetzt Rechnung addieren
weekData.add(invoice);
weekDataCache.put(key, weekData);
}
} catch (
QueryException e) {
e.printStackTrace(); e.printStackTrace();
} }
}
}
} }
/** /**
@ -628,88 +629,76 @@ public class OPListExportAdapterByWeek extends POIFindReplaceAdapter {
return fileData; return fileData;
} }
/**
* Diese Methode gruppiert eine Rechnungsliste nach Kalenderwoche
*
* @param spaceID - Space Ref to select a list of invoices associated with a
* space
* @param cache - a local cache storing all invoices by week
*
*
*/
private void groupInvoicesByWeek(String spaceID, String spaceName,
Map<String, WeekInvoiceData> cache, String currency1) {
logger.info("...group invoices (DEBUG) for " + spaceName + "/" + spaceID);
try {
List<ItemCollection> invoices = documentService.find(
"$modelversion:rechnungsausgang-* AND type:workitem AND $uniqueidref:" + spaceID, 9999, 0,
"invoice.number", false);
logger.fine(" found " + invoices.size() + " for space " + spaceName);
for (ItemCollection invoice : invoices) {
// compute Week
Date dueDate = invoice.getItemValueDate("invoice.duedate");
LocalDate localDate = dueDate.toInstant()
.atZone(ZoneId.systemDefault())
.toLocalDate();
int weekNumber = localDate.get(IsoFields.WEEK_OF_WEEK_BASED_YEAR);
int weekBasedYear = localDate.get(IsoFields.WEEK_BASED_YEAR);
String weekCategory = weekBasedYear + "/" + String.format("%02d", weekNumber);
if ("2024/01".equals(weekCategory)) {
logger.warning("--> Invoice found with 2024/01: " + invoice.getUniqueID());
}
// haben wir schon ein listchen?
String key = spaceName + "/" + weekCategory;
logger.fine(" ....building weekInvoiceData object for " + key);
WeekInvoiceData weekData = cache.get(key);
if (weekData == null) {
weekData = new WeekInvoiceData(spaceName, weekCategory);
}
// Jetzt Rechnung addieren
weekData.add(invoice, currency1);
cache.put(key, weekData);
}
} catch (
QueryException e) {
e.printStackTrace();
}
}
} }
/** /**
* Data Element for invoice totals per week and space * Data Element for invoice totals per week and space.
* The object holds multiple currencies.
*/ */
class WeekInvoiceData { class WeekInvoiceData {
String week; String week;
String spaceName; String spaceName;
double totalCurrency1; Map<String, Double> totals = new HashMap<>();
double totalCurrency2;
public WeekInvoiceData(String spaceName, String week) { public WeekInvoiceData(String spaceName, String week) {
this.spaceName = spaceName; this.spaceName = spaceName;
this.week = week; this.week = week;
} }
public void add(ItemCollection invoice, String currency1) { public void add(ItemCollection invoice) {
String spaceName = invoice.getItemValueString("space.name");
String currency = invoice.getItemValueString("invoice.currency"); String currency = invoice.getItemValueString("invoice.currency");
// Double total = invoice.getItemValueDouble("invoice.total");
Double total = invoice.getItemValueDouble("invoice.saldo"); Double total = invoice.getItemValueDouble("invoice.saldo");
if (currency1.equals(currency)) { Double totalCurrency = totals.get(currency);
totalCurrency1 = totalCurrency1 + total; if (totalCurrency == null) {
} else { totalCurrency = 0.0;
totalCurrency2 = totalCurrency2 + total; }
totalCurrency = totalCurrency + total;
totals.put(currency, InvoiceUtil.round(totalCurrency));
} }
public double getTotal(String currency) {
Double result = totals.get(currency);
if (result != null) {
return result;
} else {
return 0.0;
}
}
}
/**
* Data Element for invoice totals per space.
* The object holds multiple currencies.
*/
class TotalInvoiceData {
String spaceName;
Map<String, Double> totals = new HashMap<>();
public TotalInvoiceData(String spaceName) {
this.spaceName = spaceName;
}
public void add(Double total, String currency) {
Double totalCurrency = totals.get(currency);
if (totalCurrency == null) {
totalCurrency = 0.0;
}
totalCurrency = totalCurrency + total;
totals.put(currency, InvoiceUtil.round(totalCurrency));
}
public double getTotal(String currency) {
Double result = totals.get(currency);
if (result != null) {
return result;
} else {
return 0.0;
}
} }
} }

Binary file not shown.

View file

@ -101,6 +101,7 @@ th { font-weight: bold;}
<bpmn2:flowNodeRef>gateway_37SSsw</bpmn2:flowNodeRef> <bpmn2:flowNodeRef>gateway_37SSsw</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>textAnnotation_iPsg3g</bpmn2:flowNodeRef> <bpmn2:flowNodeRef>textAnnotation_iPsg3g</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_opebWA</bpmn2:flowNodeRef> <bpmn2:flowNodeRef>event_opebWA</bpmn2:flowNodeRef>
<bpmn2:flowNodeRef>event_JraaXA</bpmn2:flowNodeRef>
</bpmn2:lane> </bpmn2:lane>
</bpmn2:laneSet> </bpmn2:laneSet>
<bpmn2:startEvent id="StartEvent_1" name="Start"> <bpmn2:startEvent id="StartEvent_1" name="Start">
@ -298,6 +299,7 @@ Nach Prüfung schließen Sie bitte den Vorgang über die Schaltfläche "Erledigt
<bpmn2:incoming>Association_1</bpmn2:incoming> <bpmn2:incoming>Association_1</bpmn2:incoming>
<bpmn2:incoming>sequenceFlow_N0jfWA</bpmn2:incoming> <bpmn2:incoming>sequenceFlow_N0jfWA</bpmn2:incoming>
<bpmn2:incoming>sequenceFlow_QUQCFw</bpmn2:incoming> <bpmn2:incoming>sequenceFlow_QUQCFw</bpmn2:incoming>
<bpmn2:incoming>sequenceFlow_nrskqg</bpmn2:incoming>
</bpmn2:task> </bpmn2:task>
<bpmn2:sequenceFlow id="SequenceFlow_19" sourceRef="Task_4" targetRef="EndEvent_3"> <bpmn2:sequenceFlow id="SequenceFlow_19" sourceRef="Task_4" targetRef="EndEvent_3">
<bpmn2:documentation id="documentation_AvvoyQ"/> <bpmn2:documentation id="documentation_AvvoyQ"/>
@ -581,6 +583,44 @@ Nach Prüfung schließen Sie bitte den Vorgang über die Schaltfläche "Erledigt
<bpmn2:sequenceFlow id="sequenceFlow_QUQCFw" sourceRef="event_opebWA" targetRef="Task_4"> <bpmn2:sequenceFlow id="sequenceFlow_QUQCFw" sourceRef="event_opebWA" targetRef="Task_4">
<bpmn2:documentation id="documentation_SzbLsw"/> <bpmn2:documentation id="documentation_SzbLsw"/>
</bpmn2:sequenceFlow> </bpmn2:sequenceFlow>
<bpmn2:intermediateCatchEvent id="event_JraaXA" imixs:activityid="30" name="OP Liste Außenstände">
<bpmn2:extensionElements>
<imixs:item name="txtmailsubject" type="xs:string">
<imixs:value/>
</imixs:item>
<imixs:item name="keymailreceiverfields" type="xs:string"/>
<imixs:item name="rtfmailbody" type="CDATA">
<imixs:value/>
</imixs:item>
<imixs:item name="rtfresultlog" type="xs:string">
<imixs:value><![CDATA[Liste Außenstände erstellt]]></imixs:value>
</imixs:item>
<imixs:item name="keypublicresult" type="xs:string">
<imixs:value><![CDATA[1]]></imixs:value>
</imixs:item>
<imixs:item name="txtactivityresult" type="xs:string">
<imixs:value><![CDATA[<item name="process">Mahnwesen</item>
<opliste name="excel-export">
<textblock>OP-Liste KW Template</textblock>
<template>op-liste_kw_template.xlsx</template>
<target-name>op-liste_<itemvalue>space.name</itemvalue>_<itemvalue format="yyyy-MM-dd">$lasteventdate</itemvalue>.xlsx</target-name>
</opliste>
<poi-update name="findreplace">
<find>A8</find>
<replace><itemvalue format="dd.MM.yyyy">$lasteventdate</itemvalue></replace>
<type>date</type>
</poi-update>
]]></imixs:value>
</imixs:item>
</bpmn2:extensionElements>
<bpmn2:signalEventDefinition id="signalEventDefinition_nQ5AuQ" signalRef="signal_2"/>
<bpmn2:documentation id="documentation_bmiCEg"/>
<bpmn2:outgoing>sequenceFlow_nrskqg</bpmn2:outgoing>
</bpmn2:intermediateCatchEvent>
<bpmn2:sequenceFlow id="sequenceFlow_nrskqg" sourceRef="event_JraaXA" targetRef="Task_4">
<bpmn2:documentation id="documentation_511ixA"/>
</bpmn2:sequenceFlow>
</bpmn2:process> </bpmn2:process>
<bpmndi:BPMNDiagram id="BPMNDiagram_1" name="Default Process Diagram"> <bpmndi:BPMNDiagram id="BPMNDiagram_1" name="Default Process Diagram">
<bpmndi:BPMNPlane bpmnElement="Collaboration_1" id="BPMNPlane_1"> <bpmndi:BPMNPlane bpmnElement="Collaboration_1" id="BPMNPlane_1">
@ -771,6 +811,18 @@ Nach Prüfung schließen Sie bitte den Vorgang über die Schaltfläche "Erledigt
<di:waypoint x="1015.0" y="527.0"/> <di:waypoint x="1015.0" y="527.0"/>
<di:waypoint x="1015.0" y="460.0"/> <di:waypoint x="1015.0" y="460.0"/>
</bpmndi:BPMNEdge> </bpmndi:BPMNEdge>
<bpmndi:BPMNShape bpmnElement="event_JraaXA" id="BPMNShape_CmZ0yQ">
<dc:Bounds height="36.0" width="36.0" x="1154.0" y="542.0"/>
<bpmndi:BPMNLabel id="BPMNLabel_mLiQ4w">
<dc:Bounds height="20.0" width="100.0" x="1122.0" y="581.0"/>
</bpmndi:BPMNLabel>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="sequenceFlow_nrskqg" id="BPMNEdge_3Q16KA" sourceElement="BPMNShape_CmZ0yQ" targetElement="BPMNShape_Task_4">
<di:waypoint x="1154.0" y="560.0"/>
<di:waypoint x="1112.0" y="560.0"/>
<di:waypoint x="1112.0" y="435.0"/>
<di:waypoint x="1070.0" y="435.0"/>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane> </bpmndi:BPMNPlane>
<bpmndi:BPMNLabelStyle id="BPMNLabelStyle_1"> <bpmndi:BPMNLabelStyle id="BPMNLabelStyle_1">
<dc:Font name="arial" size="9.0"/> <dc:Font name="arial" size="9.0"/>