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 @@
+