From 61a7fa839965d6870204c522e4f059786226f060 Mon Sep 17 00:00:00 2001 From: Ralph Soika Date: Sun, 1 Dec 2024 09:46:54 +0100 Subject: [PATCH] op-listen udpate --- .../MetricDebitorRestService.java | 95 +++++++----------- .../MetricDebitorService.java | 98 ++++++++++++------- .../OPListExportScheduler.java | 2 +- workflow/analyse-opliste-de-1.0.3.bpmn | 71 +++++++------- workflow/analyse-opliste-en-1.0.3.bpmn | 15 ++- 5 files changed, 151 insertions(+), 130 deletions(-) diff --git a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/MetricDebitorRestService.java b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/MetricDebitorRestService.java index 0aea3e1..55638c3 100644 --- a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/MetricDebitorRestService.java +++ b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/MetricDebitorRestService.java @@ -84,7 +84,7 @@ public class MetricDebitorRestService { @Path("/init") @Produces({ MediaType.TEXT_PLAIN }) public Response initMetrics() { - Map dbtrDataCache = new HashMap(); + Map metricCache = new HashMap(); long l = System.currentTimeMillis(); logger.info("├── init metrics..."); try { @@ -97,68 +97,73 @@ public class MetricDebitorRestService { String spaceName = space.getItemValueString("space.name"); spaceNames.add(spaceName); logger.info("│   ├── grouping invoices by debitor..."); - groupInvoicesByWeek(space.getUniqueID(), spaceName, dbtrDataCache); + groupInvoicesByWeek(space.getUniqueID(), spaceName, metricCache); } logger.info("│   ├── grouping invoices finished in " + (System.currentTimeMillis() - l) + "ms"); - rebuildMetrics(dbtrDataCache); + rebuildMetrics(metricCache); logger.info("├── init metrics completed in " + (System.currentTimeMillis() - l) + "ms"); return Response.ok().entity("init metrics completed in " + (System.currentTimeMillis() - l) + "ms").build(); } catch (Exception e) { + e.printStackTrace(); return Response.serverError() .entity("Failed to initialize metrics: " + e.getMessage()) .build(); } } - private void rebuildMetrics(Map dbtrDataCache) throws PluginException { + private void rebuildMetrics(Map metricCache) throws PluginException { logger.info("│   ├── rebuild metrics..."); - for (String dbtrNumber : dbtrDataCache.keySet()) { - DbtrData dbtrData = dbtrDataCache.get(dbtrNumber); - String dbtrName = dbtrData.dbtrName; + for (String dbtrNumber : metricCache.keySet()) { + ItemCollection metricData = metricCache.get(dbtrNumber); + // String dbtrName = metricData.getItemValueString("dbtr.name"); + + // ItemCollection metric = metricService.loadMetric(dbtrNumber, dbtrName); + // metric.setItemValue(MetricDebitorService.ITEM_TOTALS, metricData.totals); + documentService.save(metricData); + metricService.initMetric(metricData); - ItemCollection metric = metricService.loadMetric(dbtrNumber, dbtrName); - metric.setItemValue(MetricDebitorService.ITEM_SALDO, dbtrData.getTotal("EUR")); - documentService.save(metric); - metricService.initMetric(metric); } } /** * Diese Methode gruppiert eine Rechnungsliste nach debitoren * - * @param spaceID - Space Ref to select a list of invoices associated with - * a - * space - * @param dbtrDataCache - a local cache storing all invoices by week + * @param spaceID - Space Ref to select a list of invoices associated with + * a + * space + * @param metricCache - a local cache storing all invoices by week * * */ private void groupInvoicesByWeek(String spaceID, String spaceName, - Map dbtrDataCache) { + Map metricCache) { logger.info("│   │   ├── group invoices for " + spaceName + "/" + spaceID); try { List invoices = documentService.find( - "$modelversion:rechnungsausgang-* AND type:workitem AND $uniqueidref:" + spaceID, 9999, 0, + "$modelversion:rechnungsausgang-* AND type:workitem AND $uniqueidref:" + + spaceID, + 9999, 0, "invoice.number", false); - logger.fine(" found " + invoices.size() + " for space " + spaceName); + logger.fine(" found " + invoices.size() + " for space " + spaceName); for (ItemCollection invoice : invoices) { String debitorName = invoice.getItemValueString("dbtr.name"); String debitorNumber = invoice.getItemValueString("dbtr.number"); - DbtrData invoiceData = dbtrDataCache.get(debitorNumber); - if (invoiceData == null) { - invoiceData = new DbtrData(debitorNumber, debitorName); + ItemCollection metricData = metricCache.get(debitorNumber); + if (metricData == null) { + metricData = metricService.createMetaData(debitorNumber, debitorName); } // Jetzt Rechnung addieren - invoiceData.add(invoice); - dbtrDataCache.put(debitorNumber, invoiceData); + addInvoice(metricData, invoice); + // invoiceData.add(invoice); + metricCache.put(debitorNumber, metricData); } } catch (QueryException e) { @@ -168,41 +173,17 @@ public class MetricDebitorRestService { } /** - * Data Element for invoice totals by debitor. - * The object holds multiple currencies. + * Addiert den saldo einer Invoice zu einem metricData object + * + * @param metricData + * @param invoice */ - class DbtrData { - - String dbtrName; - String dbtrNumber; - - Map totals = new HashMap<>(); - - public DbtrData(String dbtrNumber, String dbtrName) { - this.dbtrName = dbtrName; - this.dbtrNumber = dbtrNumber; - } - - public void add(ItemCollection invoice) { - String currency = invoice.getItemValueString("invoice.currency"); - Double total = invoice.getItemValueDouble("invoice.saldo"); - 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; - } - } + public void addInvoice(ItemCollection metricData, ItemCollection invoice) { + String currency = invoice.getItemValueString("invoice.currency"); + double saldo = invoice.getItemValueDouble("invoice.saldo"); + double saldoOld = metricData.getItemValueDouble(MetricDebitorService.ITEM_SALDO + "." + currency); + double saldoNew = InvoiceUtil.round(saldoOld + saldo); + metricData.setItemValue(MetricDebitorService.ITEM_SALDO + "." + currency, saldoNew); } - } diff --git a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/MetricDebitorService.java b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/MetricDebitorService.java index f8de301..8b5bc6b 100644 --- a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/MetricDebitorService.java +++ b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/MetricDebitorService.java @@ -47,9 +47,8 @@ import jakarta.inject.Inject; public class MetricDebitorService { private static Logger logger = Logger.getLogger(MetricDebitorService.class.getName()); - private final ConcurrentHashMap currentSaldos = new ConcurrentHashMap<>(); + private final ConcurrentHashMap metricCache = new ConcurrentHashMap<>(); - public static final String METRIC_INVOICES = "invoices"; public static final String TYPE_METRIC_DEBITOR = "metric.debitor"; public static final String ITEM_SALDO = "invoice.saldo"; @@ -76,36 +75,38 @@ public class MetricDebitorService { // verify if saldo has changed..... double invoiceSaldo = invoice.getItemValueDouble(ITEM_SALDO); + String dbtrNumber = invoice.getItemValueString("dbtr.number"); + String dbtrName = invoice.getItemValueString("dbtr.name"); + String currency = invoice.getItemValueString("invoice.currency"); + // load last metric... double lastInvoiceSaldo = readDirtySaldo(invoice.getUniqueID()); if (invoiceSaldo == lastInvoiceSaldo) { // no change - no metric update! return; } - // update metric and cache last value + // update metric and the metric cache if (processingEvent.getEventType() == ProcessingEvent.AFTER_PROCESS) { - String dbtrNumber = invoice.getItemValueString("dbtr.number"); - String dbtrName = invoice.getItemValueString("dbtr.name"); - ItemCollection metric = loadMetric(dbtrNumber, dbtrName); - - // Saldo-Berechnung wie bisher - debitorSaldo = metric.getItemValueDouble(ITEM_SALDO); + ItemCollection metricData = metricCache.get(dbtrNumber); + if (metricData == null) { + metricData = loadMetric(dbtrNumber, dbtrName); + } + // Saldo-Berechnung + debitorSaldo = metricData.getItemValueDouble(ITEM_SALDO + "." + currency); // totals.get(currency); debitorSaldo = debitorSaldo - lastInvoiceSaldo; // update debitor saldo debitorSaldo = InvoiceUtil.round(debitorSaldo + invoiceSaldo); + metricData.setItemValue(ITEM_SALDO + "." + currency, debitorSaldo); + metricCache.put(dbtrNumber, metricData); // Speichern in der Datenbank - metric.setItemValue(ITEM_SALDO, debitorSaldo); - logger.info("--- update Debitor Saldo " + dbtrNumber + " -> " + debitorSaldo); - documentService.save(metric); + logger.info("Update metric for debitor: " + dbtrNumber + " -> " + debitorSaldo); + documentService.save(metricData); - // Aktuellen Saldo im Memory speichern - currentSaldos.put(dbtrNumber, debitorSaldo); // Gauge registrieren - registerGauge(dbtrNumber, metric.getItemValueString("dbtr.name")); - logger.info("--- new gauge value for " + dbtrNumber + " -> " + debitorSaldo); + registerGauge(metricData, currency); } } @@ -119,8 +120,11 @@ public class MetricDebitorService { public double readDirtySaldo(String uniqueid) { double result = 0; ItemCollection dirtyInvoice = documentService.load(uniqueid); + if (dirtyInvoice == null) { + return 0.0; + } result = dirtyInvoice.getItemValueDouble(ITEM_SALDO); - logger.info("---Dirty last Saldo was : " + result); + // logger.info("---Dirty last Saldo was : " + result); return result; } @@ -147,12 +151,9 @@ public class MetricDebitorService { } if (debitorMetric == null) { // create a new instance - logger.info("creating new debitor metric"); - debitorMetric = new ItemCollection(); - debitorMetric.setType(TYPE_METRIC_DEBITOR); - debitorMetric.setItemValue("name", dbtrNumber); - debitorMetric.setItemValue("dbtr.number", dbtrNumber); - debitorMetric.setItemValue("dbtr.name", dbtrName); + // logger.info("creating new debitor metric"); + debitorMetric = createMetaData(dbtrNumber, dbtrName); + } } catch (QueryException e) { throw new PluginException(PluginException.class.getName(), "QUERY ERROR", e.getMessage(), e); @@ -161,6 +162,27 @@ public class MetricDebitorService { return debitorMetric; } + /** + * Creates an empty Debitor Meta Data Object (ItemCollection) + *

+ * The ItemCollection stores the name and number and also all saldos for all + * currencies + * + * @param dbtrNumber + * @param dbtrName + * @return + */ + public ItemCollection createMetaData(String dbtrNumber, String dbtrName) { + ItemCollection metricData = new ItemCollection(); + + metricData = new ItemCollection(); + metricData.setType(TYPE_METRIC_DEBITOR); + metricData.setItemValue("name", dbtrNumber); + metricData.setItemValue("dbtr.number", dbtrNumber); + metricData.setItemValue("dbtr.name", dbtrName); + return metricData; + } + /** * Hilfsmethode um Metriken initial aufzubauen. Wird vom Metric Rest Service * verwendet. @@ -168,13 +190,18 @@ public class MetricDebitorService { */ protected void initMetric(ItemCollection metric) { String dbtrNumber = metric.getItemValueString("dbtr.number"); - double saldo = metric.getItemValueDouble(ITEM_SALDO); - // Aktuellen Saldo in Map speichern - currentSaldos.put(dbtrNumber, saldo); - // Gauge registrieren - registerGauge(dbtrNumber, metric.getItemValueString("dbtr.name")); - logger.info("Initialized metric for debitor " + dbtrNumber + " -> " + saldo); + metricCache.put(dbtrNumber, metric); + // Gauge für jede Währung registrieren + for (String itemName : metric.getItemNames()) { + if (itemName.startsWith(ITEM_SALDO + ".")) { + // currency value found + int pos = (ITEM_SALDO + ".").length(); + String currency = itemName.substring(pos + 1); + logger.info("Init metric for debitor " + dbtrNumber + " -> " + currency); + registerGauge(metric, currency); + } + } } /** @@ -183,20 +210,25 @@ public class MetricDebitorService { * @param dbtrNumber - the debitor number * @param dbtrName - the debitor name */ - private void registerGauge(String dbtrNumber, String dbtrName) { + private void registerGauge(ItemCollection metricData, String currency) { + String dbtrNumber = metricData.getItemValueString("dbtr.number"); + String dbtrName = metricData.getItemValueString("dbtr.name"); List tags = new ArrayList<>(); tags.add(new Tag("type", "dbtr")); tags.add(new Tag("number", dbtrNumber)); tags.add(new Tag("name", dbtrName)); + tags.add(new Tag("currency", currency)); + logger.info("Register metric for debitor: " + dbtrNumber + " -> " + currency); Metadata metadata = Metadata.builder() .withName("dbtr.invoice.saldo") - .withDescription("Debitor Balance") - .withUnit("EUR") + .withDescription("Debitor Balance by Currency") .build(); metricRegistry.gauge(metadata, - () -> currentSaldos.getOrDefault(dbtrNumber, 0.0), + () -> metricCache.getOrDefault(dbtrNumber, createMetaData(dbtrNumber, dbtrName)) + .getItemValueDouble(ITEM_SALDO + "." + currency), tags.toArray(new Tag[0])); } + } \ No newline at end of file diff --git a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/OPListExportScheduler.java b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/OPListExportScheduler.java index 1e3658b..154e8c1 100644 --- a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/OPListExportScheduler.java +++ b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/OPListExportScheduler.java @@ -161,7 +161,7 @@ public class OPListExportScheduler implements Scheduler { workflowService.processWorkItem( // workitem.task(1000). // event(100). // - model("opliste-de-1.0")); + model("(^analyse-opliste-.*)")); } diff --git a/workflow/analyse-opliste-de-1.0.3.bpmn b/workflow/analyse-opliste-de-1.0.3.bpmn index 589ba18..d109e71 100644 --- a/workflow/analyse-opliste-de-1.0.3.bpmn +++ b/workflow/analyse-opliste-de-1.0.3.bpmn @@ -189,9 +189,7 @@ th { font-weight: bold;}

Bitte prüfen Sie die angefügte OP-Liste. Diese enthält sämtlich noch offenen Rechnungen zum Zeitpunkt des Exports für diesen Fachbereich.

-

-Nach Prüfung schließen Sie bitte den Vorgang über die Schaltfläche "Erledigt" ab. -

+ application.urlpages/workitems/workitem.jsf?id=$uniqueid Html-Footer]]> @@ -231,7 +229,9 @@ Nach Prüfung schließen Sie bitte den Vorgang über die Schaltfläche "Erledigt false - + + + @@ -251,14 +251,19 @@ Nach Prüfung schließen Sie bitte den Vorgang über die Schaltfläche "Erledigt B7 space.name text - - + F6 $lasteventdate date ]]> + + + + + + SequenceFlow_5 @@ -359,30 +364,6 @@ Nach Prüfung schließen Sie bitte den Vorgang über die Schaltfläche "Erledigt - - - OP-Liste Template - - op-liste_dbtr.number_$lasteventdate.xlsx - - - - C6 - sequencenumber - text - - - B7 - space.name - text - - - - F6 - $lasteventdate - date - ]]> - + + + OP-Liste Template + + op-liste_dbtr.number_$lasteventdate.xlsx + + + A8 + $lasteventdate + date +]]> + SequenceFlow_6 @@ -443,13 +436,23 @@ if (workitem.get(refField) == null || ''==workitem.get(refField)[0]) { op_liste_nach_kw_$lasteventdate.xlsx + - A8 + C6 + sequencenumber + text + + + B7 + space.name + text + + + + F6 $lasteventdate date - - -]]> + ]]> diff --git a/workflow/analyse-opliste-en-1.0.3.bpmn b/workflow/analyse-opliste-en-1.0.3.bpmn index 3fd3e53..04f7631 100644 --- a/workflow/analyse-opliste-en-1.0.3.bpmn +++ b/workflow/analyse-opliste-en-1.0.3.bpmn @@ -187,10 +187,7 @@ th { font-weight: bold;} Html-Header

Hallo,

-Bitte prüfen Sie die angefügte OP-Liste. Diese enthält sämtlich noch offenen Rechnungen zum Zeitpunkt des Exports für diesen Fachbereich. -

-

-Nach Prüfung schließen Sie bitte den Vorgang über die Schaltfläche "Erledigt" ab. +Please check the attached list of outstanding payments. This list contains all outstanding invoices at the time of export for this department.

application.urlpages/workitems/workitem.jsf?id=$uniqueid @@ -231,7 +228,9 @@ Nach Prüfung schließen Sie bitte den Vorgang über die Schaltfläche "Erledigt false - + + + @@ -259,6 +258,12 @@ Nach Prüfung schließen Sie bitte den Vorgang über die Schaltfläche "Erledigt date ]]>
+ + + + + + SequenceFlow_5