From 90beebd5c0a35d16100b866e5bbbd66bd707cdd6 Mon Sep 17 00:00:00 2001 From: Ralph Soika Date: Tue, 7 Jun 2022 14:11:06 +0200 Subject: [PATCH] erweiterete Krediotrenverwaltung mit mehreren IBAN/BIC --- office-alexander-logistics-app/pom.xml | 2 +- .../CargosoftController.java | 337 ++++++++++++------ .../KreditorSearchEntry.java | 48 +++ .../main/webapp/pages/admin/kreditor.xhtml | 46 +++ .../alexander/cargsoft-creditor-search.xhtml | 70 ++-- .../forms/alexander/form_basic.xhtml | 1 + pom.xml | 2 +- 7 files changed, 355 insertions(+), 151 deletions(-) create mode 100644 office-alexander-logistics-app/src/main/java/com/alexanderlogistics/KreditorSearchEntry.java diff --git a/office-alexander-logistics-app/pom.xml b/office-alexander-logistics-app/pom.xml index 0bec467..8dffba4 100644 --- a/office-alexander-logistics-app/pom.xml +++ b/office-alexander-logistics-app/pom.xml @@ -5,7 +5,7 @@ office-alexander-logistics com.alexander-logistics - 1.2.6 + 1.2.7 office-alexander-logistics-app war diff --git a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/CargosoftController.java b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/CargosoftController.java index 718904a..e79f5ea 100644 --- a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/CargosoftController.java +++ b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/CargosoftController.java @@ -1,6 +1,9 @@ package com.alexanderlogistics; +import java.io.IOException; import java.io.Serializable; +import java.io.StringWriter; +import java.io.Writer; import java.util.ArrayList; import java.util.List; import java.util.logging.Logger; @@ -9,6 +12,9 @@ import javax.enterprise.context.ConversationScoped; import javax.faces.context.FacesContext; import javax.inject.Inject; import javax.inject.Named; +import javax.json.Json; +import javax.json.JsonObject; +import javax.json.JsonObjectBuilder; import org.imixs.workflow.ItemCollection; import org.imixs.workflow.engine.DocumentService; @@ -21,6 +27,14 @@ import org.imixs.workflow.exceptions.QueryException; * The method search provides a suggest list searching a phrase within the * cargosoft creditor list (type=cargosoftkreditor). * + *

+ * Besonderheit + *

+ * Wir transportieren in der Resutl Liste eine versteckte JSON Struktur mit + * allen IBAN Informationen Das ist im Grunde etwas irre aber durch die + * JSF-Ajax-JavaScript Hölle kommern wir derzeit aus der Nummer nicht mehr + * anders raus. + * * @author rsoika * */ @@ -28,140 +42,235 @@ import org.imixs.workflow.exceptions.QueryException; @ConversationScoped public class CargosoftController implements Serializable { - private static final long serialVersionUID = 1L; - private static Logger logger = Logger.getLogger(CargosoftController.class.getName()); + private static final long serialVersionUID = 1L; + private static Logger logger = Logger.getLogger(CargosoftController.class.getName()); - public static final String TYPE_CARGOSOFTKREDITOR = "cargosoftkreditor"; + public static final String TYPE_CARGOSOFTKREDITOR = "cargosoftkreditor"; - @Inject - protected DocumentService documentService; + @Inject + protected DocumentService documentService; - private List searchResult = null; + private List searchResult = null; - private ItemCollection kreditor = null; // used for zahlungsziel (kreidtor.xhtml) + private ItemCollection kreditor = null; // used for zahlungsziel (kreidtor.xhtml) - /** - * This method searches a text phrase within the list of cargosoft kreditor - * objects (type=cargosoftkreditor). - *

- * JSF Integration: - * - * {@code - * - * } - * - *

- * JavaScript Example: - * - *

-     * {@code
-     *  imixsOfficeWorkflow.cargosoftSearch({ item: '_invoicenumber' })
-     *  }
-     * 
- * - */ - public void searchCreditor() { + /** + * This method searches a text phrase within the list of cargosoft kreditor + * objects (type=cargosoftkreditor). + *

+ * JSF Integration: + * + * {@code + * + * } + * + *

+ * JavaScript Example: + * + *

+	 * {@code
+	 *  imixsOfficeWorkflow.cargosoftSearch({ item: '_invoicenumber' })
+	 *  }
+	 * 
+ * + * @param searchmode - if 'multi', display multiple IBANs in seperate lines + */ + public void searchCreditor(String searchmode) { + boolean bMulitMode = "multi".equalsIgnoreCase(searchmode); + searchResult = new ArrayList(); + // get the param from faces context.... + FacesContext fc = FacesContext.getCurrentInstance(); + String phrase = fc.getExternalContext().getRequestParameterMap().get("phrase"); + if (phrase == null) { + return; + } - searchResult = new ArrayList(); - // get the param from faces context.... - FacesContext fc = FacesContext.getCurrentInstance(); - String phrase = fc.getExternalContext().getRequestParameterMap().get("phrase"); - if (phrase == null) { - return; - } + logger.fine("search prase '" + phrase + "'"); - logger.fine("search prase '" + phrase + "'"); + // String input =workflowController.getWorkitem().getItemValueString(itemName); + if (phrase == null || phrase.length() < 2) { + return; + } - // String input =workflowController.getWorkitem().getItemValueString(itemName); - if (phrase == null || phrase.length() < 2) { - return; - } + // die cargosoft Kreditornummer beginnt seltsamerweise mit einem K + // und die Debitoren mit einem D..... + String query = "(type:" + TYPE_CARGOSOFTKREDITOR + ") AND ( (name:K" + phrase + "*) OR (name:D" + phrase + + "*) OR (" + phrase.toLowerCase() + "*) )"; - // die cargosoft Kreditornummer beginnt seltsamerweise mit einem K - // und die Debitoren mit einem D..... - String query = "(type:" + TYPE_CARGOSOFTKREDITOR + ") AND ( (name:K" + phrase + "*) OR (name:D" + phrase - + "*) OR (" + phrase.toLowerCase() + "*) )"; + try { + List result = documentService.find(query, 20, 0, "$modified", true); + logger.info("found " + result.size() + " creditors..."); + if (result != null) { + for (ItemCollection cdtr : result) { - try { - List result = documentService.find(query, 20, 0); - logger.info("found " + result.size() + " creditors..."); - if (result != null) { - for (ItemCollection cdtr : result) { + // Aenderugn 22. Jun wir geben das K/D direkt witer + String cdtrNo = cdtr.getItemValueString("_VENDOR_NUM"); + String display = cdtrNo + " - " + cdtr.getItemValueString("_VENDOR_Name"); - // Aenderugn 22. Jun wir geben das K/D direkt witer - String cdtrNo = cdtr.getItemValueString("_VENDOR_NUM"); - String data=cdtrNo + " - " + cdtr.getItemValueString("_VENDOR_Name"); - // Aenderung 11. Mai - wir geben nun creditperiod iban und bic mit | Zeichen getrennt weieter - data=data + " |"+cdtr.getItemValueString("cdtr.creditperiod"); - data=data + "|"+cdtr.getItemValueString("cdtr.iban"); - data=data + "|"+cdtr.getItemValueString("cdtr.bic"); - - searchResult.add(data); - } - } - } catch (QueryException e) { - e.printStackTrace(); - } + // Im MulitMode zeigen wir pro IBAN (1-4) eine eigene Zeile an. Dieser + // Modus wird für die Rechnungserfassung benötigt. + // im SingleMode wird hingegen nur ein Datensatz in der Trefferliste angezeigt. + // (Ein Kreditoren Eintrag kann bis zu 4 IBANs / BICs haben + if (bMulitMode) { + // in der JSON Struktur werden alle IBANS übertragen + display = display + " |" + cdtr.getItemValueString("cdtr.creditperiod"); + display = display + "|" + cdtr.getItemValueString("cdtr.iban"); + display = display + "|" + cdtr.getItemValueString("cdtr.bic"); + searchResult.add(new KreditorSearchEntry(cdtrNo, display, buildJsonData(cdtr, + cdtr.getItemValueString("cdtr.iban"), cdtr.getItemValueString("cdtr.bic")))); + // haben wir noch weitere IBAN/BIC kombis? + for (int j = 1; j < 4; j++) { + if (!cdtr.getItemValueString("cdtr.iban" + j).isEmpty()) { + // Dublette mit alternativer IBAN erzeugen + display = cdtrNo + " - " + cdtr.getItemValueString("_VENDOR_Name"); + display = display + " |" + cdtr.getItemValueString("cdtr.creditperiod"); + display = display + "|" + cdtr.getItemValueString("cdtr.iban" + j); + display = display + "|" + cdtr.getItemValueString("cdtr.bic" + j); + searchResult.add(new KreditorSearchEntry(cdtrNo, display, + buildJsonData(cdtr, cdtr.getItemValueString("cdtr.iban" + j), + cdtr.getItemValueString("cdtr.bic" + j)))); + } + } + } else { + // Modus für Kreditoren Verwaltung + searchResult.add(new KreditorSearchEntry(cdtrNo, display, buildJsonData(cdtr))); + } - } + } + } + } catch (QueryException e) { + e.printStackTrace(); + } - public List getSearchResult() { - return searchResult; - } + } - /** - * This method reset the search and input state. - */ - public void reset() { - searchResult = new ArrayList(); - logger.fine("reset"); - } + /** + * Hilfsmethode die eine JSON Struktur mit einer IBAN/BIC kombinatuion erzeugt. + * Diese JSON Struktur wird von der Rechnungserfassungs Maske benötigt + * + * @return + */ + private String buildJsonData(ItemCollection cdtr, String iban, String bic) { - public ItemCollection getKreditor() { - if (kreditor == null) { - kreditor = new ItemCollection(); - } - return kreditor; - } + JsonObjectBuilder objectBuilder = Json.createObjectBuilder(). // + add("no", cdtr.getItemValueString("_VENDOR_NUM")). // + add("name", cdtr.getItemValueString("_VENDOR_Name")). // + add("creditperiod", cdtr.getItemValueString("cdtr.creditperiod")). // + add("iban", iban). // + add("bic", bic); + JsonObject jsonObject = objectBuilder.build(); - public void setKreditor(ItemCollection kreditor) { - this.kreditor = kreditor; - } + String jsonString = "{}"; + try (Writer writer = new StringWriter()) { + Json.createWriter(writer).write(jsonObject); + jsonString = writer.toString(); + } catch (IOException e) { + logger.warning("Unable to build json structure"); + } + return jsonString; + } - /** - * Diese Method überträgt die geänderten Daten in das Kreidtoren Objekt (cdtr.creditperiod,cdtr.iban,cdtr.bic) - */ - public void updateZahlungsziel() { + /** + * Hilfsmethode die eine JSON Struktur mit allen IBN/BIC kombinationen erzeugt. + * Diese JSON Strukur wird dann von der Kreitoren.xhtml Maske wieder ausgelesen. + * + * @return + */ + private String buildJsonData(ItemCollection cdtr) { - String cdtrNumber = kreditor.getItemValueString("cdtr.number"); - String period = kreditor.getItemValueString("cdtr.creditperiod"); - String iban = kreditor.getItemValueString("cdtr.iban"); - String bic = kreditor.getItemValueString("cdtr.bic"); - logger.fine("Zahlungsziel = " + cdtrNumber + " / " + period); + JsonObjectBuilder objectBuilder = Json.createObjectBuilder(). // + add("no", cdtr.getItemValueString("_VENDOR_NUM")). // + add("name", cdtr.getItemValueString("_VENDOR_Name")). // + add("creditperiod", cdtr.getItemValueString("cdtr.creditperiod")). // + add("iban", cdtr.getItemValueString("cdtr.iban")). // + add("bic", cdtr.getItemValueString("cdtr.bic")). // + // add ibans für kreditoren verwaltung + add("iban3", cdtr.getItemValueString("cdtr.iban3")). // + add("iban4", cdtr.getItemValueString("cdtr.iban4")). // + add("bic2", cdtr.getItemValueString("cdtr.bic2")). // + add("bic3", cdtr.getItemValueString("cdtr.bic3")). // + add("bic4", cdtr.getItemValueString("cdtr.bic4")); // - // search workitem - String query = "(type:" + TYPE_CARGOSOFTKREDITOR + ") AND (name:" + cdtrNumber + ")"; + JsonObject jsonObject = objectBuilder.build(); - List result; - try { - result = documentService.find(query, 1, 0); - if (result.size() == 1) { - ItemCollection cargoCreditor = result.get(0); - try { - cargoCreditor.setItemValue("cdtr.creditperiod", Integer.parseInt(period)); - } catch (NumberFormatException nfe) { - // no op - } - cargoCreditor.setItemValue("cdtr.iban", iban); - cargoCreditor.setItemValue("cdtr.bic", bic); - documentService.save(cargoCreditor); - } - } catch (QueryException e) { - logger.severe("Unable to find cargosoft kreditor "+e.getMessage()); - } + String jsonString = "{}"; + try (Writer writer = new StringWriter()) { + Json.createWriter(writer).write(jsonObject); + jsonString = writer.toString(); + } catch (IOException e) { + logger.warning("Unable to build json structure"); + } + return jsonString; + } - } + /** + * Die Resultliste wird als eine Liste einen Arrays zurückgegeben. Der Erste + * Eintrag + * + * @return + */ + public List getSearchResult() { + return searchResult; + } + + /** + * This method reset the search and input state. + */ + public void reset() { + searchResult = new ArrayList(); + logger.fine("reset"); + } + + public ItemCollection getKreditor() { + if (kreditor == null) { + kreditor = new ItemCollection(); + } + return kreditor; + } + + public void setKreditor(ItemCollection kreditor) { + this.kreditor = kreditor; + } + + /** + * Diese Method überträgt die geänderten Daten in das Kreidtoren Objekt + * (cdtr.creditperiod,cdtr.iban,cdtr.bic) + */ + public void updateZahlungsziel() { + + String cdtrNumber = kreditor.getItemValueString("cdtr.number"); + logger.fine("Zahlungsziel = " + cdtrNumber); + + // search workitem + String query = "(type:" + TYPE_CARGOSOFTKREDITOR + ") AND (name:" + cdtrNumber + ")"; + + List result; + try { + result = documentService.find(query, 1, 0); + if (result.size() == 1) { + ItemCollection cargoCreditor = result.get(0); + try { + cargoCreditor.setItemValue("cdtr.creditperiod", + Integer.parseInt(kreditor.getItemValueString("cdtr.creditperiod"))); + } catch (NumberFormatException nfe) { + // no op + } + cargoCreditor.setItemValue("cdtr.iban", kreditor.getItemValueString("cdtr.iban")); + cargoCreditor.setItemValue("cdtr.bic", kreditor.getItemValueString("cdtr.bic")); + cargoCreditor.setItemValue("cdtr.iban2", kreditor.getItemValueString("cdtr.iban2")); + cargoCreditor.setItemValue("cdtr.bic2", kreditor.getItemValueString("cdtr.bic2")); + cargoCreditor.setItemValue("cdtr.iban3", kreditor.getItemValueString("cdtr.iban3")); + cargoCreditor.setItemValue("cdtr.bic3", kreditor.getItemValueString("cdtr.bic3")); + cargoCreditor.setItemValue("cdtr.iban4", kreditor.getItemValueString("cdtr.iban4")); + cargoCreditor.setItemValue("cdtr.bic4", kreditor.getItemValueString("cdtr.bic4")); + documentService.save(cargoCreditor); + } + } catch (QueryException e) { + logger.severe("Unable to find cargosoft kreditor " + e.getMessage()); + } + + } } diff --git a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/KreditorSearchEntry.java b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/KreditorSearchEntry.java new file mode 100644 index 0000000..4d558ac --- /dev/null +++ b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/KreditorSearchEntry.java @@ -0,0 +1,48 @@ +package com.alexanderlogistics; + +/** + * Diese Kleine Hilfsklasse dient als DTO für die Übertragugn eines + * Sucheregenisses nach kreditoren an das Frontend. Die Klasse besteht aus einem + * Key, einer DisplayZeile für die Darstellung und einen JSON String der + * beliebige Daten enthalten kann. + * + * @author rsoika + * + */ +public class KreditorSearchEntry { + + private String key; + private String display; + private String data; + + public KreditorSearchEntry(String key, String display, String data) { + super(); + this.key = key; + this.display = display; + this.data = data; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getDisplay() { + return display; + } + + public void setDisplay(String display) { + this.display = display; + } + + public String getData() { + return data; + } + + public void setData(String data) { + this.data = data; + } +} diff --git a/office-alexander-logistics-app/src/main/webapp/pages/admin/kreditor.xhtml b/office-alexander-logistics-app/src/main/webapp/pages/admin/kreditor.xhtml index 62aa1e7..fcde9df 100644 --- a/office-alexander-logistics-app/src/main/webapp/pages/admin/kreditor.xhtml +++ b/office-alexander-logistics-app/src/main/webapp/pages/admin/kreditor.xhtml @@ -20,6 +20,7 @@ +
@@ -79,6 +80,51 @@ + + +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
diff --git a/office-alexander-logistics-app/src/main/webapp/pages/workitems/forms/alexander/cargsoft-creditor-search.xhtml b/office-alexander-logistics-app/src/main/webapp/pages/workitems/forms/alexander/cargsoft-creditor-search.xhtml index 68956cb..57135fe 100644 --- a/office-alexander-logistics-app/src/main/webapp/pages/workitems/forms/alexander/cargsoft-creditor-search.xhtml +++ b/office-alexander-logistics-app/src/main/webapp/pages/workitems/forms/alexander/cargsoft-creditor-search.xhtml @@ -21,7 +21,7 @@ https://dzone.com/articles/execute-a-jsf-ajax-request-by-just-a-function-call https://www.w3schools.com/howto/howto_js_autocomplete.asp --> - @@ -35,65 +35,63 @@ var creditorField= $("input[data-item='cdtr.number']"); $(creditorField).each(function() { $(this).addClass("imixs-ml"); - //$(creditorField).attr('data-resultlist', 'autocomplete-resultlist-cargosoft'); autocompleteInitInput(this,cargosoftSearch,'autocomplete-resultlist-cargosoft',selectCdtrCallback); }); - // add cargsoft label if available var cdtrName="#{workflowController.workitem.item['cdtr.name.cargosoft']}"; - //alert(cdtrName); var inputElement=$("input[data-item='cdtr.number']"); - inputElement.after( "" + cdtrName + "

" ); - - // on change auf rechnugnsdatum ändert das fälligkeitsdatum - + //inputElement.after( "" + cdtrName + "

" ); }); - // schneide die kreditornnummer aus dem selectierten Text aus (wir brauchen nur die) - function selectCdtrCallback(selection) { - // extract the number between start and ' - ' - var cdtrNo=selection.substring(0,selection.indexOf(' - ')); - var cdtrName=selection.substring(selection.indexOf(' - ')+3,selection.indexOf('|') ); - + // Hier bekommen wir die JSON Struktur mit allen daten. + // diese Daten werden auf die einzelnen Felder verteilt. + function selectCdtrCallback(selection) { + + const cdtrData = JSON.parse(selection); + + // fill data into the fields.... var inputElement=$("input[data-item='cdtr.number']"); - inputElement.val(cdtrNo); + inputElement.val(cdtrData.no); // remove old cdtr.name $('#cdtr-name-id').remove(); // append span with cdtr.name.... - inputElement.after( "" + cdtrName + "

" ); + inputElement.after( "" + cdtrData.name + "

" ); - // Data format - // K00000 - Kreditorenname |3|00000IBAN|000BIC - // zahlungsziel - var paramsData=selection.substring(selection.indexOf('|')+1); - var params=paramsData.split('|'); - var cdtrPaymentPeriod=params[0]; - var cdtrIBAN=params[1]; - var cdtrBIC=params[2]; - var inputElementZahlungsziel=$("input[data-item='cdtr.creditperiod']"); var inputElementZahlungszielCdtr=$("input[id$='cdtr_creditperiod']"); var inputElementInvoiceDate=$("input[id$='date_invoice']"); var inputElementIban=$("input[data-item='cdtr.iban']"); var inputElementBic=$("input[data-item='cdtr.bic']"); - if (inputElementZahlungszielCdtr && cdtrPaymentPeriod!='') { - inputElementZahlungszielCdtr.val(cdtrPaymentPeriod); + if (inputElementZahlungszielCdtr && cdtrData.creditperiod!='') { + inputElementZahlungszielCdtr.val(cdtrData.creditperiod); } // nur wenn ein Rechnugnsdatum eingegeben wurde - if (inputElementInvoiceDate && inputElementInvoiceDate.val()!='' && inputElementZahlungsziel && cdtrPaymentPeriod!='') { - inputElementZahlungsziel.val(cdtrPaymentPeriod); + if (inputElementInvoiceDate && inputElementInvoiceDate.val()!='' && inputElementZahlungsziel && cdtrData.creditperiod!='') { + inputElementZahlungsziel.val(cdtrData.creditperiod); inputElementZahlungsziel.change(); //$('.alexander-logistic-date').focus().select(); $("input[data-item='invoice.number']").focus().select(); } // update iban/bic - if (inputElementIban && cdtrIBAN!='') { - inputElementIban.val(cdtrIBAN); + if (inputElementIban && cdtrData.iban!='') { + inputElementIban.val(cdtrData.iban); } - if (inputElementBic && cdtrBIC!='') { - inputElementBic.val(cdtrBIC); + if (inputElementBic && cdtrData.bic!='') { + inputElementBic.val(cdtrData.bic); } + + // update all possible data fields von kredorenverwaltung + if ($("input[data-item='cdtr.iban']")) { + $("input[data-item='cdtr.iban2']").val(cdtrData.iban2); + $("input[data-item='cdtr.bic2']").val(cdtrData.bic2); + $("input[data-item='cdtr.iban3']").val(cdtrData.iban3); + $("input[data-item='cdtr.bic3']").val(cdtrData.bic3); + $("input[data-item='cdtr.iban4']").val(cdtrData.iban4); + $("input[data-item='cdtr.bic4']").val(cdtrData.bic4); + } + + } /*]]>*/ @@ -101,12 +99,14 @@ + + -
+ diff --git a/office-alexander-logistics-app/src/main/webapp/pages/workitems/forms/alexander/form_basic.xhtml b/office-alexander-logistics-app/src/main/webapp/pages/workitems/forms/alexander/form_basic.xhtml index 4f4db61..10d9f6a 100644 --- a/office-alexander-logistics-app/src/main/webapp/pages/workitems/forms/alexander/form_basic.xhtml +++ b/office-alexander-logistics-app/src/main/webapp/pages/workitems/forms/alexander/form_basic.xhtml @@ -11,6 +11,7 @@ + diff --git a/pom.xml b/pom.xml index 25989f8..9b9fdae 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 com.alexander-logistics office-alexander-logistics - 1.2.6 + 1.2.7 pom Imixs Office Workflow - Custom Build