From c124d06d7442a2241fc499446d3777b19347a971 Mon Sep 17 00:00:00 2001 From: Ralph Soika Date: Wed, 31 Aug 2022 15:30:23 +0200 Subject: [PATCH] update --- .../alexanderlogistics/OPListController.java | 320 ++++++++++++------ .../alexander/cargsoft-debitor-search.xhtml | 6 +- .../forms/alexander/section_opliste.xhtml | 159 +++++---- .../forms/alexander/section_payments.xhtml | 82 +++-- workflow/zahlungseingang-de-1.0.0.bpmn | 8 +- 5 files changed, 363 insertions(+), 212 deletions(-) diff --git a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/OPListController.java b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/OPListController.java index 6816cd6..8ddc1aa 100644 --- a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/OPListController.java +++ b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/OPListController.java @@ -3,23 +3,37 @@ package com.alexanderlogistics; import java.io.Serializable; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.logging.Logger; import javax.enterprise.context.ConversationScoped; +import javax.enterprise.event.Observes; import javax.faces.context.FacesContext; import javax.inject.Inject; import javax.inject.Named; import org.imixs.workflow.ItemCollection; +import org.imixs.workflow.WorkflowKernel; import org.imixs.workflow.engine.DocumentService; +import org.imixs.workflow.engine.WorkflowService; import org.imixs.workflow.exceptions.QueryException; import org.imixs.workflow.faces.data.WorkflowController; +import org.imixs.workflow.faces.data.WorkflowEvent; +import org.imixs.workflow.office.forms.ChildItemController; +import org.imixs.workflow.office.forms.WorkitemLinkController; + /** * Der OPListeController dient dazu eine liste aller offenen Ausgangsrechnungen * zu bilden *

- * Zusätzlich bietet er die funktionen zum auszifferne..(??) + * Zusätzlich bietet er die funktionen zum auszifferne. Dies bedeutet, der + * controller ermittelt zunächst alle offenen Rechnungen zu einem Debitor. Diese + * Rechnungen werden in eine ChildItems Collection überführt. Der User kann nun + * im Interface einzelne Rechnungen selektieren. Wird das Workitem gespeichert, + * errechnet der Controller die selectieren Invoices und verknpüft diese final + * mit dem Zahlungseingang. + * * * @author rsoika * @@ -30,151 +44,239 @@ public class OPListController implements Serializable { private static final long serialVersionUID = 1L; + public static final int TASK_ERSTELLUNG = 1000; + public static final String ITEM_PAYMENT_DETAILS="payment.details"; + private static Logger logger = Logger.getLogger(OPListController.class.getName()); - - private String lastDbtrNumber=null; - - private List invoiceCache=null; + + private String lastDbtrNumber = null; + + private List invoiceList = null; @Inject protected WorkflowController workflowController; + + @Inject + protected WorkflowService workflowService; + @Inject + protected WorkitemLinkController workitemLinkController; @Inject protected DocumentService documentService; - /** - * Diese Methode liefert die Rechnungen zur gegebenen dbtrNumber. - * Die Methode nutzt einen lokalen cache um die Zugriffe zu beschleunigen. + * Diese Methode liefert die Rechnungen zur gegebenen dbtrNumber. Die Methode + * nutzt einen lokalen cache um die Zugriffe zu beschleunigen. + *

+ * Befindet sich der Zahlungseingang in Erstellung (Task=1000) werden alle + * offenen Rechnungen geholt + *

+ * Befindet sich der Zahlungseingang nicht mehr in erstellung werden nur die + * Rechnugnen aus $workitemRef geholt! * * @param _dbtrNumber * @return */ + @SuppressWarnings("unchecked") public List getInvoices(String _dbtrNumber) { - - // return empty cache if data is not - if ( _dbtrNumber==null || _dbtrNumber.isEmpty()) { - invoiceCache= new ArrayList(); - return invoiceCache; - } - - // if last dbtr number is equal then return the current cache.... - if (invoiceCache!=null && lastDbtrNumber!=null && lastDbtrNumber.equals(_dbtrNumber)) { - return invoiceCache; - } - - // refresh cache.... - lastDbtrNumber=_dbtrNumber; - invoiceCache= new ArrayList(); - logger.info("....caching Invoices for " + _dbtrNumber); - - // Aus der dbtrNummer muss das führendde D entfernt werden - // wir speichern dieses zwar im Zahlungseingangs Workflow, aber eine - // Ausganksrechnung kennt das nicht - // Das ganze ist ein übles Relikt aus Cargosoft und kann nicht vermieden werden - if (_dbtrNumber.startsWith("D")) { - _dbtrNumber = _dbtrNumber.substring(1); - } - String query = "(type:workitem OR type:workitemarchive) AND ($modelversion:rechnungsausgang-*) AND (dbtr.number:" - + _dbtrNumber + ")"; + // Compute all open invoices if TASK_ERSTELLUNG.... + if (workflowController.getWorkitem().getTaskID() == TASK_ERSTELLUNG) { - try { - invoiceCache = documentService.find(query, 999, 0, "$created", false); - } catch (QueryException e) { - logger.severe("Failed to get op liste:" + e.getMessage()); + // return empty list if dbtr is not set + if (_dbtrNumber == null || _dbtrNumber.isEmpty()) { + invoiceList = new ArrayList(); + return invoiceList; + } + + // if last dbtr number is equal then return the current list.... + if (invoiceList != null && lastDbtrNumber != null && lastDbtrNumber.equals(_dbtrNumber)) { + return invoiceList; + } + + // load new invoice list.... + + lastDbtrNumber = _dbtrNumber; + invoiceList = new ArrayList(); + logger.info("....loading open Invoices for " + _dbtrNumber); + + // Aus der dbtrNummer muss das führendde D entfernt werden + // wir speichern dieses zwar im Zahlungseingangs Workflow, aber eine + // Ausganksrechnung kennt das nicht + // Das ganze ist ein übles Relikt aus Cargosoft und kann nicht vermieden werden + if (_dbtrNumber.startsWith("D")) { + _dbtrNumber = _dbtrNumber.substring(1); + } + String query = "(type:workitem OR type:workitemarchive) AND ($modelversion:rechnungsausgang-*) AND (dbtr.number:" + + _dbtrNumber + ")"; + + try { + invoiceList = documentService.find(query, 999, 0, "$created", false); + } catch (QueryException e) { + logger.severe("Failed to get op liste:" + e.getMessage()); + } + + } else { + // We are no longer in TASK_ERSTELLUNG, so + // fetch only selected invoices + invoiceList = new ArrayList(); + List selection = workflowController.getWorkitem().getItemValue("$workitemref"); + for (String id : selection) { + invoiceList.add(documentService.load(id)); + } } - return invoiceCache; + // finally we set the 'selection' item depending on the $workitemList + // and the payment amount form the 'payment.details' + List selection = workflowController.getWorkitem().getItemValue("$workitemref"); + List paymentList=explodePaymentDetails(workflowController.getWorkitem()); + for (ItemCollection invoice : invoiceList) { + if (selection.contains(invoice.getUniqueID())) { + invoice.setItemValue("selected", true); + // set amount + for (ItemCollection payment: paymentList) { + if (invoice.getUniqueID().equals(payment.getUniqueID())) { + invoice.setItemValue("payment.amount",payment.getItemValue("payment.amount")); + break; + } + } + } + } + + return invoiceList; + } + + +// /** +// * Liefert die Payments die mit diesem workitem verbunden sind... +// * @return +// */ +// public List getPayments() { +// List result=new ArrayList(); +// +// +// result=workitemLinkController.getExternalReferences("($WorkflowGroup:Zahlungseingang"); +//// if (workflowController.getWorkitem()!=null) { +//// List liste = workflowService.getWorkListByRef(workflowController.getWorkitem().getUniqueID()); +//// +//// for (ItemCollection refWorkitem: liste) { +//// if (refWorkitem.getItemValueString(WorkflowKernel.WORKFLOWGROUP).startsWith("Zahlungseingang")) { +//// result.add(refWorkitem); +//// } +//// } +//// } +//// +// return result; +// } + + /** + * Convert the List of ItemCollections back into a List of Map elements + * + * @param workitem + */ + @SuppressWarnings({ "rawtypes" }) + protected List explodePaymentDetails(ItemCollection workitem) { + // convert current list of childItems into ItemCollection elements + ArrayList childItems = new ArrayList(); + + List mapOrderItems = workitem.getItemValue(ITEM_PAYMENT_DETAILS); + int pos = 1; + for (Object mapOderItem : mapOrderItems) { + + if (mapOderItem instanceof Map) { + ItemCollection itemCol = new ItemCollection((Map) mapOderItem); + itemCol.replaceItemValue("numPos", pos); + + childItems.add(itemCol); + pos++; + } + } + return childItems; + } + /** + * On Before Process we store the selected invoices in $worktiemRef + * + * @param workflowEvent + */ + public void onWorkflowEvent(@Observes WorkflowEvent workflowEvent) { + if (workflowEvent == null || workflowEvent.getWorkitem() == null) { + return; + + } + // store a collection of child items + if (workflowEvent.getEventType() == WorkflowEvent.WORKITEM_BEFORE_PROCESS) { + updateChildList(workflowEvent.getWorkitem()); + + } + } + + public ItemCollection loadInvoice(String id) { + return documentService.load(id); } /** - * THis Method is called by cargosft-debitor-serach.xhtml after the user has selected - * a new debitor. - * The meothod updates the dbtr.number of the current workitem. - * The form will rerender the opList seciton + * Diese Methode aktualisiert das item ChildWOrkitems mit allen selektierten + * Invoices udn berechnet den payment total */ - public void loadOPList() { - + @SuppressWarnings("rawtypes") + public void updateChildList(ItemCollection workitem) { + double paymentTotal = 0; + List mapInvoiceItems = new ArrayList(); + // convert the child ItemCollection elements into a List of Map + logger.info("Convert child items into Map..."); + // iterate over all order items.. + List selectionList = new ArrayList(); + for (ItemCollection invoice : invoiceList) { + if (invoice.getItemValueBoolean("selected")) { + logger.info("calculate - " + invoice.getUniqueID()); + selectionList.add(invoice.getUniqueID()); + paymentTotal = paymentTotal + invoice.getItemValueDouble("payment.amount"); + ItemCollection invoiceStub = new ItemCollection(); + invoiceStub.setItemValue(WorkflowKernel.UNIQUEID, invoice.getUniqueID()); + invoiceStub.setItemValue("payment.amount", invoice.getItemValue("payment.amount")); + mapInvoiceItems.add(invoiceStub.getAllItems()); + + } + } + + // rond with 2 digits + workitem.replaceItemValue("payment.total", Math.round(paymentTotal * 100.0) / 100.0); + // update childitems + workitem.replaceItemValue(ITEM_PAYMENT_DETAILS, mapInvoiceItems); + // Update $workitemref + workitem.setItemValue("$workitemref", selectionList); + } + + /** + * This JSF backing method is called by cargosft-debitor-serach.xhtml after the + * user has selected a new debitor. + *

+ * The new dbtrNumber is slected form the curren ajax request param 'dbtrNumber' + *

+ * The method just updates the dbtr.number of the current workitem. The form + * will than rerender the opList section. + */ + public void updateDbtrNumber() { FacesContext fc = FacesContext.getCurrentInstance(); String dbtrNumber = fc.getExternalContext().getRequestParameterMap().get("dbtrNumber"); - logger.info(".........dbtrNumber = "+dbtrNumber); - + logger.fine(".........dbtrNumber = " + dbtrNumber); workflowController.getWorkitem().setItemValue("dbtr.number", dbtrNumber); - } - /** - * This method computes the sum for a given item in a list of workitems. The - * result is rounded to 2 digits. - *

- * Gutschriften werden abgezogen - * - * @param refids - list of workitem uniqueIds - * @param item - name of the item to summarize - * @return sum rounded to 2 digits - */ - public double calculateSum() { - double result = 0; - - List refids=workflowController.getWorkitem().getItemValueList("$workitemref",String.class); - - for (String id : refids) { - if (id.isEmpty()) { - continue; - } - ItemCollection doc = getInvoiceFromCache(id); - if (doc!=null) { - result = result + doc.getItemValueDouble("invoice.total"); - } - } - // rond with 2 digits - return Math.round(result * 100.0) / 100.0; - - } - - /** - * Hilfsmethode holt eine Rechnung aus dem Cache. - * @param id - * @return - */ - private ItemCollection getInvoiceFromCache(String id) { - if (invoiceCache==null) { - return null; - } - for (ItemCollection invoice: invoiceCache) { - if (invoice.getUniqueID().equals(id)) { - return invoice; - } - } - return null; - } - /** * Berechnet den gesammten OP Saldo + * * @return */ - public double calculateSaldo(List invoices ) { + public double calculateInvoiceTotal() { double result = 0; - for (ItemCollection invoice : invoices) { + for (ItemCollection invoice : invoiceList) { result = result + invoice.getItemValueDouble("invoice.total"); } // rond with 2 digits return Math.round(result * 100.0) / 100.0; } - - - /** - * This method removes an uniqueid form the item $workitemref - */ - @SuppressWarnings("unchecked") - public void removeInvoice(String id) { - - List refList = workflowController.getWorkitem().getItemValue("$workitemref"); - - refList.remove(id); - workflowController.getWorkitem().setItemValue("$workitemref", refList); - } + } diff --git a/office-alexander-logistics-app/src/main/webapp/pages/workitems/forms/alexander/cargsoft-debitor-search.xhtml b/office-alexander-logistics-app/src/main/webapp/pages/workitems/forms/alexander/cargsoft-debitor-search.xhtml index ccc67e6..ed35c28 100644 --- a/office-alexander-logistics-app/src/main/webapp/pages/workitems/forms/alexander/cargsoft-debitor-search.xhtml +++ b/office-alexander-logistics-app/src/main/webapp/pages/workitems/forms/alexander/cargsoft-debitor-search.xhtml @@ -23,7 +23,7 @@ --> -