From 40e971e5847f3c39a3bbec82f175093be77edc99 Mon Sep 17 00:00:00 2001 From: Ralph Soika Date: Wed, 10 Jul 2024 16:24:52 +0200 Subject: [PATCH] update --- RELEASENOTES.md | 15 +++++++ .../OPListExportAdapter.java | 38 +++++++++++++----- .../parts/alexander/currency_in.xhtml | 15 +++++++ .../parts/alexander/currency_out.xhtml | 14 +++++++ templates/.~lock.op-liste_template.xlsx# | 1 + templates/op-liste_template.xlsx | Bin 42154 -> 42260 bytes 6 files changed, 74 insertions(+), 9 deletions(-) create mode 100644 office-alexander-logistics-app/src/main/webapp/pages/workitems/parts/alexander/currency_in.xhtml create mode 100644 office-alexander-logistics-app/src/main/webapp/pages/workitems/parts/alexander/currency_out.xhtml create mode 100644 templates/.~lock.op-liste_template.xlsx# diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 37923ad..e469bb5 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -3,6 +3,21 @@ ### 1.2.21 (Development) - Beim XML Invoice Import wird nun auch die Sprache für das Mahnwesen ermittelt (fehlte) + - Währungsunabhängigkeit + + +**Migration** + + 1. Paramter Pflegen + a) Währungen pflegen + - DE = EUR;CHF;SEK;RUB;NOK;GBP;USD;CAD + - PL = PLN;EUR;CHF;SEK;RUB;NOK;GBP;USD;CAD + - DWC = AED; EUR;CHF;SEK;RUB;NOK;GBP;USD;CAD + b) Mandant ID + + 2. OP Listen Template im Textbausteein aktualisieren + + 3. Alle Workflow Modelle erneuern ### 1.2.20 diff --git a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/OPListExportAdapter.java b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/OPListExportAdapter.java index 8ba2c41..628bda5 100644 --- a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/OPListExportAdapter.java +++ b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/OPListExportAdapter.java @@ -12,6 +12,7 @@ import java.util.List; import java.util.Map; import java.util.logging.Logger; +import javax.ejb.EJB; import javax.inject.Inject; import org.apache.poi.ss.usermodel.CellCopyPolicy; @@ -28,6 +29,7 @@ import org.imixs.workflow.engine.WorkflowService; import org.imixs.workflow.exceptions.AdapterException; import org.imixs.workflow.exceptions.PluginException; import org.imixs.workflow.exceptions.QueryException; +import org.imixs.workflow.office.config.ConfigService; import org.imixs.workflow.poi.POIFindReplaceAdapter; /** @@ -73,6 +75,9 @@ public class OPListExportAdapter extends POIFindReplaceAdapter { @Inject SnapshotService snapshotService; + @EJB + ConfigService configService; + /** * This method finds or create the Zahlungsavis and adds a reference * ($workitemref) to the current invoice. @@ -84,6 +89,12 @@ public class OPListExportAdapter extends POIFindReplaceAdapter { public ItemCollection execute(ItemCollection document, ItemCollection event) throws AdapterException, PluginException { + // ermittle die Hauptwährungen + ItemCollection configItemCollection = configService.loadConfiguration("AGL_CONFIGURATION"); + List currencyList = configItemCollection.getItemValue("currency.out"); + String currency1 = currencyList.get(0); + String currency2 = currencyList.get(1); + // read the zahlungsavis options ItemCollection evalItemCollection = workflowService.evalWorkflowResult(event, "opliste", document, false); if (evalItemCollection == null) { @@ -115,7 +126,7 @@ public class OPListExportAdapter extends POIFindReplaceAdapter { // now we add separate lines for each invoice.... logger.info("... insert invoices - filter=" + filter); - insertInvoiceRows(document, targetName, filter); + insertInvoiceRows(document, targetName, filter, currency1, currency2); } catch (PluginException | IOException | QueryException e) { throw new PluginException(OPListExportAdapter.class.getSimpleName(), ERROR_CONFIG, "failed to update op-liste: " + e.getMessage()); @@ -136,7 +147,8 @@ public class OPListExportAdapter extends POIFindReplaceAdapter { * @throws PluginException * @throws QueryException */ - private void insertInvoiceRows(ItemCollection document, String fileName, boolean filter) + private void insertInvoiceRows(ItemCollection document, String fileName, boolean filter, String currency1, + String currency2) throws PluginException, QueryException { double saldoUSD = 0; @@ -155,6 +167,10 @@ public class OPListExportAdapter extends POIFindReplaceAdapter { doc = new XSSFWorkbook(imputStream); // NOTE: we only take the first sheet ! XSSFSheet sheet = doc.getSheetAt(0); + // Währungsüberschriften setzten + sheet.getRow(10).getCell(6).setCellValue(currency1); + sheet.getRow(10).getCell(8).setCellValue(currency2); + CellReference categoryRefCell = new CellReference("A12"); XSSFRow referenceRowCategory = sheet.getRow(categoryRefCell.getRow()); CellReference invoiceRefCell = new CellReference("A13"); @@ -190,9 +206,8 @@ public class OPListExportAdapter extends POIFindReplaceAdapter { double catSumEUR = 0; double catSumUSD = 0; for (ItemCollection invoice : invoices) { - if ("EUR".equals(invoice.getItemValueString("invoice.currency"))) { + if (currency1.equals(invoice.getItemValueString("invoice.currency"))) { catSumEUR = catSumEUR + invoice.getItemValueDouble("invoice.saldo"); - } else { catSumUSD = catSumUSD + invoice.getItemValueDouble("invoice.saldo"); } @@ -220,7 +235,7 @@ public class OPListExportAdapter extends POIFindReplaceAdapter { row.getCell(5).setCellValue(invoice.getItemValueDate("invoice.duedate")); double total = invoice.getItemValueDouble("invoice.saldo"); String currency = invoice.getItemValueString("invoice.currency"); - if ("EUR".equals(currency)) { + if (currency1.equals(currency)) { // EUR row.getCell(6).setCellValue(total); row.getCell(7).setCellValue(currency); @@ -244,10 +259,15 @@ public class OPListExportAdapter extends POIFindReplaceAdapter { sheet.shiftRows(referenceRowPos, lastRow + totalRowCount, -1, true, true); // finally update the total formula... - XSSFCell cTotalEUR = getCellByRef(doc, sheet, "TOTALEUR"); - XSSFCell cTotalUSD = getCellByRef(doc, sheet, "TOTALUSD"); - cTotalEUR.setCellValue(saldoEUR); - cTotalUSD.setCellValue(saldoUSD); + XSSFCell cTotal1 = getCellByRef(doc, sheet, "TOTAL1"); + XSSFCell cTotal2 = getCellByRef(doc, sheet, "TOTAL2"); + cTotal1.setCellValue(saldoEUR); + cTotal2.setCellValue(saldoUSD); + // Set währung + XSSFCell cTotalCurrency1 = getCellByRef(doc, sheet, "TOTAL_CURRENCY1"); + XSSFCell cTotalCurrency2 = getCellByRef(doc, sheet, "TOTAL_CURRENCY2"); + cTotalCurrency1.setCellValue(currency1); + cTotalCurrency2.setCellValue(currency2); // write back the file ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); diff --git a/office-alexander-logistics-app/src/main/webapp/pages/workitems/parts/alexander/currency_in.xhtml b/office-alexander-logistics-app/src/main/webapp/pages/workitems/parts/alexander/currency_in.xhtml new file mode 100644 index 0000000..c30624d --- /dev/null +++ b/office-alexander-logistics-app/src/main/webapp/pages/workitems/parts/alexander/currency_in.xhtml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/office-alexander-logistics-app/src/main/webapp/pages/workitems/parts/alexander/currency_out.xhtml b/office-alexander-logistics-app/src/main/webapp/pages/workitems/parts/alexander/currency_out.xhtml new file mode 100644 index 0000000..939e703 --- /dev/null +++ b/office-alexander-logistics-app/src/main/webapp/pages/workitems/parts/alexander/currency_out.xhtml @@ -0,0 +1,14 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/templates/.~lock.op-liste_template.xlsx# b/templates/.~lock.op-liste_template.xlsx# new file mode 100644 index 0000000..40b26ea --- /dev/null +++ b/templates/.~lock.op-liste_template.xlsx# @@ -0,0 +1 @@ +,rsoika,ralpus-framework,10.07.2024 16:16,file:///home/rsoika/.config/libreoffice/4; \ No newline at end of file diff --git a/templates/op-liste_template.xlsx b/templates/op-liste_template.xlsx index a60024fcb60272997cdd286781e6e4a0c54f222c..f17aa949a253ca50c0a349b245d82e15007c78a8 100644 GIT binary patch delta 6402 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