diff --git a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/AGLAnalyticControllerDebitor.java b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/AGLAnalyticControllerDebitor.java index cdcfa25..4a87d1b 100644 --- a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/AGLAnalyticControllerDebitor.java +++ b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/AGLAnalyticControllerDebitor.java @@ -1,6 +1,7 @@ package com.alexanderlogistics; import java.io.Serializable; +import java.util.ArrayList; import java.util.List; import java.util.logging.Logger; @@ -12,7 +13,7 @@ import org.imixs.workflow.faces.data.WorkflowController; import org.imixs.workflow.office.forms.AnalyticController; import org.imixs.workflow.office.forms.AnalyticEvent; -import jakarta.enterprise.context.RequestScoped; +import jakarta.enterprise.context.ConversationScoped; import jakarta.enterprise.event.Observes; import jakarta.inject.Inject; import jakarta.inject.Named; @@ -25,7 +26,8 @@ import jakarta.inject.Named; * */ @Named -@RequestScoped +// @RequestScoped +@ConversationScoped public class AGLAnalyticControllerDebitor implements Serializable { private static final long serialVersionUID = 1L; @@ -40,14 +42,27 @@ public class AGLAnalyticControllerDebitor implements Serializable { @Inject TeamService teamService; - // @Inject - // protected DebitorStatistikController debitorStatistikController; - - List steuerbescheide = null; + List invoices = null; public void onEvent(@Observes AnalyticEvent event) { - logger.info("...debitor analysis...."); + if (!"workitem".equals(event.getWorkitem().getType())) { + // no op + return; + } + String dbtrNumber = event.getWorkitem().getItemValueString("dbtr.number"); + String dbtrNumberLast = event.getWorkitem().getItemValueString("dbtr.number.last"); + + // Recompute only if last dbtr.number has changed or no values yet computed + + // load all invoices? + if (invoices == null || (!dbtrNumber.isEmpty() && !dbtrNumber.equals(dbtrNumberLast))) { + logger.info("Analyse new debitor data for : " + dbtrNumber); + loadRechnungen(); + event.getWorkitem().setItemValue("dbtr.number.last", dbtrNumber); + + } + ItemCollection process = teamService.getProcessByName("Mahnwesen"); String link = "/pages/workitems/worklist.xhtml?processref=" + process.getUniqueID() + "&workflowgroup=Steuerbescheid"; @@ -75,6 +90,23 @@ public class AGLAnalyticControllerDebitor implements Serializable { event.getWorkitem().setItemValue("invoices.total.due", event.getValue()); event.setLink(link); } + } + + private void loadRechnungen() { + if (getDbtNr().isEmpty()) { + invoices = new ArrayList(); + } else { + String query = "(type:workitem) AND dbtr.number:" + getDbtNr() + + " AND $modelversion:rechnungsausgang-*"; + try { + logger.info("...debitor analysis for " + getDbtNr() + "...."); + + invoices = documentService.find(query, 999, 0, "$created", false); + } catch (QueryException e) { + logger.warning("Failed to query invoices: " + query + " - Error: " + e.getMessage()); + invoices = new ArrayList(); + } + } } @@ -85,15 +117,8 @@ public class AGLAnalyticControllerDebitor implements Serializable { */ public int getRechnungen() { int result = 0; - if (getDbtNr().isEmpty()) { - return 0; - } - try { - result = documentService - .count("(type:workitem OR type:workitemarchive) AND dbtr.number:" + getDbtNr() - + " AND $workflowgroup:\"Rechnungsausgang\""); - } catch (QueryException e) { - logger.severe("Failed to get statistic: " + e.getMessage()); + if (invoices != null) { + result = invoices.size(); } return result; } @@ -104,16 +129,21 @@ public class AGLAnalyticControllerDebitor implements Serializable { * @return */ public int getRechnungenOffen() { + // int result = 0; + // if (getDbtNr().isEmpty()) { + // return 0; + // } + // try { + // result = documentService + // .count("(type:workitem) AND dbtr.number:" + getDbtNr() + // + " AND $workflowgroup:\"Rechnungsausgang\" AND ($taskid:[5000 TO 5099])"); + // } catch (QueryException e) { + // logger.severe("Failed to get statistic: " + e.getMessage()); + // } + // return result; int result = 0; - if (getDbtNr().isEmpty()) { - return 0; - } - try { - result = documentService - .count("(type:workitem) AND dbtr.number:" + getDbtNr() - + " AND $workflowgroup:\"Rechnungsausgang\" AND ($taskid:[5000 TO 5099])"); - } catch (QueryException e) { - logger.severe("Failed to get statistic: " + e.getMessage()); + if (invoices != null) { + result = invoices.size(); } return result; } @@ -124,16 +154,21 @@ public class AGLAnalyticControllerDebitor implements Serializable { * @return */ public int getRechnungenFaellig() { + // int result = 0; + // if (getDbtNr().isEmpty()) { + // return 0; + // } + // try { + // result = documentService + // .count("(type:workitem) AND dbtr.number:" + getDbtNr() + // + " AND $workflowgroup:\"Rechnungsausgang\" AND ($taskid:[5100 TO 5199])"); + // } catch (QueryException e) { + // logger.severe("Failed to get statistic: " + e.getMessage()); + // } + // return result; int result = 0; - if (getDbtNr().isEmpty()) { - return 0; - } - try { - result = documentService - .count("(type:workitem) AND dbtr.number:" + getDbtNr() - + " AND $workflowgroup:\"Rechnungsausgang\" AND ($taskid:[5100 TO 5199])"); - } catch (QueryException e) { - logger.severe("Failed to get statistic: " + e.getMessage()); + if (invoices != null) { + result = invoices.size(); } return result; } diff --git a/office-alexander-logistics-app/src/main/java/org/imixs/workflow/office/forms/AnalyticController.java b/office-alexander-logistics-app/src/main/java/org/imixs/workflow/office/forms/AnalyticController.java index e80e135..ba049cc 100644 --- a/office-alexander-logistics-app/src/main/java/org/imixs/workflow/office/forms/AnalyticController.java +++ b/office-alexander-logistics-app/src/main/java/org/imixs/workflow/office/forms/AnalyticController.java @@ -106,35 +106,36 @@ public class AnalyticController implements Serializable { */ protected ItemCollection computeValue(String key) { if (workflowController.getWorkitem() != null) { - // try to fetch value from cache - if (!workflowController.getWorkitem().hasItem("analytic." + key)) { - logger.fine("fire analytic event for key '" + key + "'"); - // Fire the Analytics Event for this key - AnalyticEvent event = new AnalyticEvent(key, workflowController.getWorkitem()); - if (analyticEvents != null) { - analyticEvents.fire(event); + + logger.fine("fire analytic event for key '" + key + "'"); + // Fire the Analytics Event for this key + AnalyticEvent event = new AnalyticEvent(key, workflowController.getWorkitem()); + if (analyticEvents != null) { + analyticEvents.fire(event); + if (event.getValue() != null) { ItemCollection details = new ItemCollection(); details.setItemValue("value", event.getValue()); details.setItemValue("label", event.getLabel()); details.setItemValue("description", event.getDescription()); details.setItemValue("link", event.getLink()); implodeDetails(key, details); - return details; - } - - if (event.getValue() == null) { - // set dummy value - ItemCollection details = new ItemCollection(); - details.setItemValue("value", ""); - details.setItemValue("label", ""); - details.setItemValue("description", "No data available"); - implodeDetails(key, details); - return details; } } + + // try loading from cache + ItemCollection details = explodeDetails(key); + if (details == null) { + // set dummy value + details = new ItemCollection(); + details.setItemValue("value", ""); + details.setItemValue("label", ""); + details.setItemValue("description", "No data available"); + implodeDetails(key, details); + } + } - // analytic value is already cached! + // analytic value is now already cached! return explodeDetails(key); } @@ -144,7 +145,7 @@ public class AnalyticController implements Serializable { * @param workitem */ @SuppressWarnings({ "rawtypes" }) - public void implodeDetails(String key, ItemCollection details) { + private void implodeDetails(String key, ItemCollection details) { // convert the child ItemCollection elements into a List of Map List detailsList = new ArrayList(); detailsList.add(details.getAllItems()); @@ -155,7 +156,7 @@ public class AnalyticController implements Serializable { * converts the Map List of a workitem into a List of ItemCollectons */ @SuppressWarnings({ "rawtypes", "unchecked" }) - public ItemCollection explodeDetails(String key) { + private ItemCollection explodeDetails(String key) { // convert current list of childItems into ItemCollection elements List mapOrderItems = workflowController.getWorkitem().getItemValue(key); if (mapOrderItems != null && mapOrderItems.size() > 0) { diff --git a/workflow/analyse-steuerbescheid-de-1.0.2.bpmn b/workflow/analyse-steuerbescheid-de-1.0.2.bpmn new file mode 100644 index 0000000..e0bca87 --- /dev/null +++ b/workflow/analyse-steuerbescheid-de-1.0.2.bpmn @@ -0,0 +1,443 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + + + +<itemvalue>$workflowstatus</itemvalue> + +]]> + + + +]]> + + + + + + + + + + + + + + StartEvent_1 + Task_1 + EndEvent_3 + Task_2 + IntermediateCatchEvent_8 + + DataObject_1 + event_HrHS9A + + + + SequenceFlow_4 + + + + + + $lasteventdate]]> + + + true + + + + + + + + + + + + + + + + + + $workflowgroup - $workflowstatus]]> + SequenceFlow_10 + sequenceFlow_OL83kQ + sequenceFlow_P5vJKg + + + + + + SequenceFlow_10 + + + + + + $lasteventdate]]> + + + + + + + + + + + + true + + + + + + + + + + + + + + $workflowgroup - $workflowstatus]]> + SequenceFlow_4 + sequenceFlow_17AQjg + sequenceFlow_nZPhew + + + + + + + + + + + + + + + + + + + + + + + +]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + false + + + + sequenceFlow_17AQjg + sequenceFlow_OL83kQ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + false + + + Mahnwesen + + Steuerbescheide Template + + steuerbescheide_$lasteventdate.xlsx + + + + K6 + $lasteventdate + date + + +TOTAL1;TOTAL2;TOTAL3;TOTAL4 +]]> + + + + + sequenceFlow_nZPhew + sequenceFlow_P5vJKg + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +