erweiterete Krediotrenverwaltung mit mehreren IBAN/BIC

This commit is contained in:
Ralph Soika 2022-06-07 14:11:06 +02:00
parent eee7a96913
commit 90beebd5c0
7 changed files with 355 additions and 151 deletions

View file

@ -5,7 +5,7 @@
<parent> <parent>
<artifactId>office-alexander-logistics</artifactId> <artifactId>office-alexander-logistics</artifactId>
<groupId>com.alexander-logistics</groupId> <groupId>com.alexander-logistics</groupId>
<version>1.2.6</version> <version>1.2.7</version>
</parent> </parent>
<artifactId>office-alexander-logistics-app</artifactId> <artifactId>office-alexander-logistics-app</artifactId>
<packaging>war</packaging> <packaging>war</packaging>

View file

@ -1,6 +1,9 @@
package com.alexanderlogistics; package com.alexanderlogistics;
import java.io.IOException;
import java.io.Serializable; import java.io.Serializable;
import java.io.StringWriter;
import java.io.Writer;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.logging.Logger; import java.util.logging.Logger;
@ -9,6 +12,9 @@ import javax.enterprise.context.ConversationScoped;
import javax.faces.context.FacesContext; import javax.faces.context.FacesContext;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Named; 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.ItemCollection;
import org.imixs.workflow.engine.DocumentService; 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 * The method search provides a suggest list searching a phrase within the
* cargosoft creditor list (type=cargosoftkreditor). * cargosoft creditor list (type=cargosoftkreditor).
* *
* <p>
* Besonderheit
* <p>
* 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 * @author rsoika
* *
*/ */
@ -36,7 +50,7 @@ public class CargosoftController implements Serializable {
@Inject @Inject
protected DocumentService documentService; protected DocumentService documentService;
private List<String> searchResult = null; private List<KreditorSearchEntry> searchResult = null;
private ItemCollection kreditor = null; // used for zahlungsziel (kreidtor.xhtml) private ItemCollection kreditor = null; // used for zahlungsziel (kreidtor.xhtml)
@ -61,10 +75,11 @@ public class CargosoftController implements Serializable {
* } * }
* </pre> * </pre>
* *
* @param searchmode - if 'multi', display multiple IBANs in seperate lines
*/ */
public void searchCreditor() { public void searchCreditor(String searchmode) {
boolean bMulitMode = "multi".equalsIgnoreCase(searchmode);
searchResult = new ArrayList<String>(); searchResult = new ArrayList<KreditorSearchEntry>();
// get the param from faces context.... // get the param from faces context....
FacesContext fc = FacesContext.getCurrentInstance(); FacesContext fc = FacesContext.getCurrentInstance();
String phrase = fc.getExternalContext().getRequestParameterMap().get("phrase"); String phrase = fc.getExternalContext().getRequestParameterMap().get("phrase");
@ -85,20 +100,44 @@ public class CargosoftController implements Serializable {
+ "*) OR (" + phrase.toLowerCase() + "*) )"; + "*) OR (" + phrase.toLowerCase() + "*) )";
try { try {
List<ItemCollection> result = documentService.find(query, 20, 0); List<ItemCollection> result = documentService.find(query, 20, 0, "$modified", true);
logger.info("found " + result.size() + " creditors..."); logger.info("found " + result.size() + " creditors...");
if (result != null) { if (result != null) {
for (ItemCollection cdtr : result) { for (ItemCollection cdtr : result) {
// Aenderugn 22. Jun wir geben das K/D direkt witer // Aenderugn 22. Jun wir geben das K/D direkt witer
String cdtrNo = cdtr.getItemValueString("_VENDOR_NUM"); String cdtrNo = cdtr.getItemValueString("_VENDOR_NUM");
String data=cdtrNo + " - " + cdtr.getItemValueString("_VENDOR_Name"); String display = 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"); // Im MulitMode zeigen wir pro IBAN (1-4) eine eigene Zeile an. Dieser
data=data + "|"+cdtr.getItemValueString("cdtr.iban"); // Modus wird für die Rechnungserfassung benötigt.
data=data + "|"+cdtr.getItemValueString("cdtr.bic"); // 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)));
}
searchResult.add(data);
} }
} }
} catch (QueryException e) { } catch (QueryException e) {
@ -107,7 +146,72 @@ public class CargosoftController implements Serializable {
} }
public List<String> getSearchResult() { /**
* 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) {
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();
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;
}
/**
* 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) {
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")); //
JsonObject jsonObject = objectBuilder.build();
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<KreditorSearchEntry> getSearchResult() {
return searchResult; return searchResult;
} }
@ -115,7 +219,7 @@ public class CargosoftController implements Serializable {
* This method reset the search and input state. * This method reset the search and input state.
*/ */
public void reset() { public void reset() {
searchResult = new ArrayList<String>(); searchResult = new ArrayList<KreditorSearchEntry>();
logger.fine("reset"); logger.fine("reset");
} }
@ -131,15 +235,13 @@ public class CargosoftController implements Serializable {
} }
/** /**
* Diese Method überträgt die geänderten Daten in das Kreidtoren Objekt (cdtr.creditperiod,cdtr.iban,cdtr.bic) * Diese Method überträgt die geänderten Daten in das Kreidtoren Objekt
* (cdtr.creditperiod,cdtr.iban,cdtr.bic)
*/ */
public void updateZahlungsziel() { public void updateZahlungsziel() {
String cdtrNumber = kreditor.getItemValueString("cdtr.number"); String cdtrNumber = kreditor.getItemValueString("cdtr.number");
String period = kreditor.getItemValueString("cdtr.creditperiod"); logger.fine("Zahlungsziel = " + cdtrNumber);
String iban = kreditor.getItemValueString("cdtr.iban");
String bic = kreditor.getItemValueString("cdtr.bic");
logger.fine("Zahlungsziel = " + cdtrNumber + " / " + period);
// search workitem // search workitem
String query = "(type:" + TYPE_CARGOSOFTKREDITOR + ") AND (name:" + cdtrNumber + ")"; String query = "(type:" + TYPE_CARGOSOFTKREDITOR + ") AND (name:" + cdtrNumber + ")";
@ -150,16 +252,23 @@ public class CargosoftController implements Serializable {
if (result.size() == 1) { if (result.size() == 1) {
ItemCollection cargoCreditor = result.get(0); ItemCollection cargoCreditor = result.get(0);
try { try {
cargoCreditor.setItemValue("cdtr.creditperiod", Integer.parseInt(period)); cargoCreditor.setItemValue("cdtr.creditperiod",
Integer.parseInt(kreditor.getItemValueString("cdtr.creditperiod")));
} catch (NumberFormatException nfe) { } catch (NumberFormatException nfe) {
// no op // no op
} }
cargoCreditor.setItemValue("cdtr.iban", iban); cargoCreditor.setItemValue("cdtr.iban", kreditor.getItemValueString("cdtr.iban"));
cargoCreditor.setItemValue("cdtr.bic", bic); 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); documentService.save(cargoCreditor);
} }
} catch (QueryException e) { } catch (QueryException e) {
logger.severe("Unable to find cargosoft kreditor "+e.getMessage()); logger.severe("Unable to find cargosoft kreditor " + e.getMessage());
} }
} }

View file

@ -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;
}
}

View file

@ -20,6 +20,7 @@
<ui:include <ui:include
src="/pages/workitems/forms/alexander/cargsoft-creditor-search.xhtml"> src="/pages/workitems/forms/alexander/cargsoft-creditor-search.xhtml">
<ui:param name="workitem" value="#{cargosoftController.kreditor}" /> <ui:param name="workitem" value="#{cargosoftController.kreditor}" />
<ui:param name="searchmode" value="single" />
</ui:include> </ui:include>
<div class="imixs-form"> <div class="imixs-form">
<div class="imixs-header"> <div class="imixs-header">
@ -79,6 +80,51 @@
</dd> </dd>
</dl> </dl>
<!-- IBAN 1-5 -->
<dl>
<dd>
<h:inputText
value="#{cargosoftController.kreditor.item['cdtr.iban2']}" pt:data-item="cdtr.iban2"/>
</dd>
</dl>
<dl>
<dd>
<h:inputText
value="#{cargosoftController.kreditor.item['cdtr.bic2']}" pt:data-item="cdtr.bic2"/>
</dd>
</dl>
<dl>
<dd>
<h:inputText
value="#{cargosoftController.kreditor.item['cdtr.iban3']}" pt:data-item="cdtr.iban3"/>
</dd>
</dl>
<dl>
<dd>
<h:inputText
value="#{cargosoftController.kreditor.item['cdtr.bic3']}" pt:data-item="cdtr.bic3"/>
</dd>
</dl>
<dl>
<dd>
<h:inputText
value="#{cargosoftController.kreditor.item['cdtr.iban4']}" pt:data-item="cdtr.iban4"/>
</dd>
</dl>
<dl>
<dd>
<h:inputText
value="#{cargosoftController.kreditor.item['cdtr.bic4']}" pt:data-item="cdtr.bic4"/>
</dd>
</dl>
</div> </div>

View file

@ -21,7 +21,7 @@
https://dzone.com/articles/execute-a-jsf-ajax-request-by-just-a-function-call https://dzone.com/articles/execute-a-jsf-ajax-request-by-just-a-function-call
https://www.w3schools.com/howto/howto_js_autocomplete.asp https://www.w3schools.com/howto/howto_js_autocomplete.asp
--> -->
<h:commandScript name="cargosoftSearch" action="#{cargosoftController.searchCreditor()}" <h:commandScript name="cargosoftSearch" action="#{cargosoftController.searchCreditor(searchmode)}"
render="autocomplete-resultlist-cargosoft" onevent="autocompleteShowResult" /> render="autocomplete-resultlist-cargosoft" onevent="autocompleteShowResult" />
@ -35,65 +35,63 @@
var creditorField= $("input[data-item='cdtr.number']"); var creditorField= $("input[data-item='cdtr.number']");
$(creditorField).each(function() { $(creditorField).each(function() {
$(this).addClass("imixs-ml"); $(this).addClass("imixs-ml");
//$(creditorField).attr('data-resultlist', 'autocomplete-resultlist-cargosoft');
autocompleteInitInput(this,cargosoftSearch,'autocomplete-resultlist-cargosoft',selectCdtrCallback); autocompleteInitInput(this,cargosoftSearch,'autocomplete-resultlist-cargosoft',selectCdtrCallback);
}); });
// add cargsoft label if available // add cargsoft label if available
var cdtrName="#{workflowController.workitem.item['cdtr.name.cargosoft']}"; var cdtrName="#{workflowController.workitem.item['cdtr.name.cargosoft']}";
//alert(cdtrName);
var inputElement=$("input[data-item='cdtr.number']"); var inputElement=$("input[data-item='cdtr.number']");
inputElement.after( "<span id='cdtr-name-id' class='small'>" + cdtrName + "</p>" ); //inputElement.after( "<span id='cdtr-name-id' class='small'>" + cdtrName + "</p>" );
// on change auf rechnugnsdatum ändert das fälligkeitsdatum
}); });
// schneide die kreditornnummer aus dem selectierten Text aus (wir brauchen nur die) // Hier bekommen wir die JSON Struktur mit allen daten.
// diese Daten werden auf die einzelnen Felder verteilt.
function selectCdtrCallback(selection) { 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('|') );
const cdtrData = JSON.parse(selection);
// fill data into the fields....
var inputElement=$("input[data-item='cdtr.number']"); var inputElement=$("input[data-item='cdtr.number']");
inputElement.val(cdtrNo); inputElement.val(cdtrData.no);
// remove old cdtr.name // remove old cdtr.name
$('#cdtr-name-id').remove(); $('#cdtr-name-id').remove();
// append span with cdtr.name.... // append span with cdtr.name....
inputElement.after( "<span id='cdtr-name-id' class='small'>" + cdtrName + "</p>" ); inputElement.after( "<span id='cdtr-name-id' class='small'>" + cdtrData.name + "</p>" );
// 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 inputElementZahlungsziel=$("input[data-item='cdtr.creditperiod']");
var inputElementZahlungszielCdtr=$("input[id$='cdtr_creditperiod']"); var inputElementZahlungszielCdtr=$("input[id$='cdtr_creditperiod']");
var inputElementInvoiceDate=$("input[id$='date_invoice']"); var inputElementInvoiceDate=$("input[id$='date_invoice']");
var inputElementIban=$("input[data-item='cdtr.iban']"); var inputElementIban=$("input[data-item='cdtr.iban']");
var inputElementBic=$("input[data-item='cdtr.bic']"); var inputElementBic=$("input[data-item='cdtr.bic']");
if (inputElementZahlungszielCdtr && cdtrPaymentPeriod!='') { if (inputElementZahlungszielCdtr && cdtrData.creditperiod!='') {
inputElementZahlungszielCdtr.val(cdtrPaymentPeriod); inputElementZahlungszielCdtr.val(cdtrData.creditperiod);
} }
// nur wenn ein Rechnugnsdatum eingegeben wurde // nur wenn ein Rechnugnsdatum eingegeben wurde
if (inputElementInvoiceDate && inputElementInvoiceDate.val()!='' && inputElementZahlungsziel && cdtrPaymentPeriod!='') { if (inputElementInvoiceDate && inputElementInvoiceDate.val()!='' && inputElementZahlungsziel && cdtrData.creditperiod!='') {
inputElementZahlungsziel.val(cdtrPaymentPeriod); inputElementZahlungsziel.val(cdtrData.creditperiod);
inputElementZahlungsziel.change(); inputElementZahlungsziel.change();
//$('.alexander-logistic-date').focus().select(); //$('.alexander-logistic-date').focus().select();
$("input[data-item='invoice.number']").focus().select(); $("input[data-item='invoice.number']").focus().select();
} }
// update iban/bic // update iban/bic
if (inputElementIban && cdtrIBAN!='') { if (inputElementIban && cdtrData.iban!='') {
inputElementIban.val(cdtrIBAN); inputElementIban.val(cdtrData.iban);
} }
if (inputElementBic && cdtrBIC!='') { if (inputElementBic && cdtrData.bic!='') {
inputElementBic.val(cdtrBIC); 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 @@
<!-- Hier speichern das von Kreditor vorgeschlagene zahlungsziel --> <!-- Hier speichern das von Kreditor vorgeschlagene zahlungsziel -->
<h:inputHidden id="cdtr_creditperiod" value="#{workflowController.workitem.item['cdtr.creditperiod']}" /> <h:inputHidden id="cdtr_creditperiod" value="#{workflowController.workitem.item['cdtr.creditperiod']}" />
<!-- cargosoft creditor suggest list --> <!-- cargosoft creditor suggest list -->
<h:panelGroup id="autocomplete-resultlist-cargosoft" layout="block" class="autocomplete-resultlist"> <h:panelGroup id="autocomplete-resultlist-cargosoft" layout="block" class="autocomplete-resultlist">
<ui:repeat var="suggest" value="#{cargosoftController.searchResult}"> <ui:repeat var="suggest" value="#{cargosoftController.searchResult}">
<div class="autocomplete-resultlist-element" onclick="autocompleteSelectElement('#{suggest}')"> <div class="autocomplete-resultlist-element" onclick="autocompleteSelectElement('#{suggest.data}')">
<a href="#"> <a href="#">
<h:outputText value="#{suggest}" escape="false"/> <h:outputText value="#{suggest.display}" escape="false"/>
</a> </a>
</div> </div>
</ui:repeat> </ui:repeat>

View file

@ -11,6 +11,7 @@
<!-- Cargosoft Creditor Search integration --> <!-- Cargosoft Creditor Search integration -->
<ui:include src="/pages/workitems/forms/alexander/cargsoft-creditor-search.xhtml"> <ui:include src="/pages/workitems/forms/alexander/cargsoft-creditor-search.xhtml">
<ui:param name="workitem" value="#{workflowController.workitem}" /> <ui:param name="workitem" value="#{workflowController.workitem}" />
<ui:param name="searchmode" value="multi" /> <!-- display multiple ibans in separate lines -->
</ui:include> </ui:include>

View file

@ -4,7 +4,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>com.alexander-logistics</groupId> <groupId>com.alexander-logistics</groupId>
<artifactId>office-alexander-logistics</artifactId> <artifactId>office-alexander-logistics</artifactId>
<version>1.2.6</version> <version>1.2.7</version>
<packaging>pom</packaging> <packaging>pom</packaging>
<name>Imixs Office Workflow - Custom Build</name> <name>Imixs Office Workflow - Custom Build</name>