neuer AGLAIInvoiceAdapter für auflösung von space.ref
This commit is contained in:
parent
44df91da9d
commit
f942231066
7 changed files with 5285 additions and 5 deletions
|
|
@ -1,5 +1,16 @@
|
|||
# Versionen
|
||||
|
||||
## 1.4.0 (Development)
|
||||
|
||||
- neuer AGLAIInvoiceAdapter
|
||||
der Adapter `AGLAIInvoiceAdapter` muss künftig in das Import Event der Rechnungseingangs Modelle. Dieser Adapter Findet den Space und den Mandanten.
|
||||
|
||||
Neue Modelle:
|
||||
|
||||
- AMS
|
||||
- rechnungseingang-ams-1.1.0.bpmn
|
||||
|
||||
|
||||
## 1.3.6 (Development)
|
||||
|
||||
**KSeF Produktiname II.**
|
||||
|
|
|
|||
167
src/main/java/com/alexanderlogistics/AGLAIInvoiceAdapter.java
Normal file
167
src/main/java/com/alexanderlogistics/AGLAIInvoiceAdapter.java
Normal file
|
|
@ -0,0 +1,167 @@
|
|||
package com.alexanderlogistics;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
import org.imixs.workflow.ItemCollection;
|
||||
import org.imixs.workflow.SignalAdapter;
|
||||
import org.imixs.workflow.engine.DocumentService;
|
||||
import org.imixs.workflow.exceptions.AdapterException;
|
||||
import org.imixs.workflow.exceptions.PluginException;
|
||||
import org.imixs.workflow.exceptions.QueryException;
|
||||
|
||||
import com.alexanderlogistics.mahnlauf.MahnlaufService;
|
||||
|
||||
import jakarta.inject.Inject;
|
||||
|
||||
/**
|
||||
* Der AGLAIInvoiceAdapter weist eien Rechnung dem richtigen Space zu und sucht
|
||||
* nach dem passenden Business Partner
|
||||
*
|
||||
*
|
||||
*
|
||||
* @version 1.0
|
||||
* @author rsoika
|
||||
*/
|
||||
public class AGLAIInvoiceAdapter implements SignalAdapter {
|
||||
|
||||
private static Logger logger = Logger.getLogger(AGLAIInvoiceAdapter.class.getName());
|
||||
|
||||
public static final String ERROR_MISSING_DATA = "MISSING_DATA";
|
||||
public static final String ERROR_CONFIG = "CONFIG_ERROR";
|
||||
|
||||
@Inject
|
||||
MahnlaufService mahnlaufService;
|
||||
|
||||
@Inject
|
||||
DocumentService documentService;
|
||||
|
||||
/**
|
||||
* This method finds or create the Zahlungsavis and adds a reference
|
||||
* ($workitemref) to the current invoice.
|
||||
*
|
||||
* @throws PluginException
|
||||
*/
|
||||
@Override
|
||||
public ItemCollection execute(ItemCollection workitem, ItemCollection event)
|
||||
throws AdapterException, PluginException {
|
||||
|
||||
// Inbound Invoice?
|
||||
if (workitem.getModelVersion().startsWith("rechnungseingang")) {
|
||||
|
||||
// Initialize invoice.positions and Space
|
||||
initInvoicePositions(workitem);
|
||||
initInvoiceSpace(workitem);
|
||||
initInvoiceBusinessPartner(workitem);
|
||||
}
|
||||
|
||||
return workitem;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Diese Methode prüft ob es bei einer Eingangsrechnung zwar das feld
|
||||
* 'invoice.positions' gibt, aber noch keine Positionsliste
|
||||
* Die Methode erzeugt eine Default Zeile.
|
||||
*
|
||||
* @param workitem
|
||||
*/
|
||||
private void initInvoicePositions(ItemCollection workitem) {
|
||||
|
||||
List<ItemCollection> childList = InvoiceUtil.explodeChildList(workitem);
|
||||
if (childList.size() == 0 && !workitem.getItemValueString("invoice.positions").isEmpty()) {
|
||||
String positionNumber = workitem.getItemValueString("invoice.positions");
|
||||
|
||||
logger.info("├── init invoice.positions: " + positionNumber);
|
||||
|
||||
ItemCollection child = new ItemCollection();
|
||||
child.setItemValue("numPos", 1);
|
||||
child.setItemValue("name", positionNumber);
|
||||
childList.add(child);
|
||||
InvoiceUtil.implodeChildList(workitem, childList);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Die Methode findet den passenden Space anhand
|
||||
* der REgex in space sofern das workitem noch keinem Space zugewiesen ist
|
||||
*
|
||||
* @param workitem
|
||||
*/
|
||||
private void initInvoiceSpace(ItemCollection workitem) {
|
||||
|
||||
if (workitem.getItemValueString("space.ref").isEmpty()
|
||||
&& !workitem.getItemValueString("invoice.positions").isEmpty()) {
|
||||
String positionNumber = workitem.getItemValueString("invoice.positions");
|
||||
logger.info("├── init space for position : " + positionNumber);
|
||||
// Jetzt noch das Space mapping
|
||||
Map<String, List<String>> spacePosMappings = mahnlaufService.loadSpacePosMappings();
|
||||
mahnlaufService.mapInvoiceTextToSpace(workitem, spacePosMappings, positionNumber);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Find creditor cdtr.name
|
||||
* based on the field
|
||||
* 'document.company' or cdtr.name
|
||||
*
|
||||
* Zunächst versuchen wir falls ein cdtr.name von der KI gefunden wurde dieesn
|
||||
* über das Businesspartner Interface aufzulösne.
|
||||
* Falls das nicht gelingt, suchen wir nach einer alten Rechnung mit der selben
|
||||
* document.company
|
||||
*
|
||||
*/
|
||||
private void initInvoiceBusinessPartner(ItemCollection workitem) {
|
||||
if (workitem.getItemValueString("partner.id").isEmpty()
|
||||
&& !workitem.getItemValueString("document.company").isEmpty()) {
|
||||
|
||||
String companyName = workitem.getItemValueString("document.company");
|
||||
String cdtrName = workitem.getItemValueString("cdtr.name");
|
||||
logger.info("├── init cdtr.name for document.company: " + companyName);
|
||||
|
||||
// erster versuch über Busienss partner.
|
||||
String query = "(type:workitem OR type:workitemarchive) AND ($modelversion:businesspartner*) AND (partner.name:\""
|
||||
+ cdtrName + "\")";
|
||||
|
||||
try {
|
||||
List<ItemCollection> result = documentService.find(query, 1, 0, "$created", true);
|
||||
if (result.size() == 1) {
|
||||
logger.info("│ ├── found business partner by cdtr.name");
|
||||
ItemCollection businessPartner = result.get(0);
|
||||
workitem.setItemValue("cdtr.number", businessPartner.getItemValueString("cdtr.number"));
|
||||
workitem.setItemValue("cdtr.name", businessPartner.getItemValueString("cdtr.name"));
|
||||
workitem.setItemValue("partner.id", businessPartner.getItemValueString("partner.id"));
|
||||
workitem.setItemValue("partner.name", invoice.getItemValueString("cdtr.name"));
|
||||
return;
|
||||
}
|
||||
} catch (QueryException e) {
|
||||
// not found!
|
||||
logger.warning("Failed to lookup company name '" + companyName + "' : " + e.getMessage());
|
||||
}
|
||||
|
||||
// Eine Suche über den exakten Namen ist sinnlos gewesen, daher versuchen wir
|
||||
// nun über den letzten Treffer
|
||||
query = "(type:workitem OR type:workitemarchive) AND ($modelversion:rechnungseingang*) AND (document.company:\""
|
||||
+ companyName + "\") AND NOT (partner.id=\"\") AND ($taskid:[5010 TO 5900])";
|
||||
|
||||
try {
|
||||
List<ItemCollection> result = documentService.find(query, 1, 0, "$created", true);
|
||||
if (result.size() == 1) {
|
||||
logger.info("│ ├── found business partner by last invoice");
|
||||
ItemCollection invoice = result.get(0);
|
||||
workitem.setItemValue("cdtr.number", invoice.getItemValueString("cdtr.number"));
|
||||
workitem.setItemValue("cdtr.name", invoice.getItemValueString("cdtr.name"));
|
||||
workitem.setItemValue("partner.id", invoice.getItemValueString("partner.id"));
|
||||
workitem.setItemValue("partner.name", invoice.getItemValueString("cdtr.name"));
|
||||
}
|
||||
} catch (QueryException e) {
|
||||
// not found!
|
||||
logger.warning("Failed to lookup company name '" + companyName + "' : " + e.getMessage());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -129,10 +129,11 @@ public class MahnlaufService {
|
|||
* @param workitem
|
||||
* @param spacePosMappings
|
||||
*/
|
||||
public void mapInvoiceTextToSpace(ItemCollection workitem, Map<String, List<String>> spacePosMappings) {
|
||||
public void mapInvoiceTextToSpace(ItemCollection workitem, Map<String, List<String>> spacePosMappings,
|
||||
String positionNumber) {
|
||||
// Jezt noch das Space mapping
|
||||
// dazu kucken wir in alle spaces den config wert 'pos.mapping'
|
||||
String text = workitem.getItemValueString("invoice.text");
|
||||
String text = positionNumber; // workitem.getItemValueString("invoice.text");
|
||||
if (!text.isEmpty()) {
|
||||
boolean found = false;
|
||||
for (Map.Entry<String, List<String>> entry : spacePosMappings.entrySet()) {
|
||||
|
|
|
|||
|
|
@ -428,7 +428,8 @@ public class CargosoftXMLEAkteImportService {
|
|||
readXMLRows(doc, workitem);
|
||||
// Jetzt noch das Space mapping
|
||||
workitem.setItemValue("invoice.text", workitem.getItemValueString("invoice.positions"));
|
||||
mahnlaufService.mapInvoiceTextToSpace(workitem, spacePosMappings);
|
||||
mahnlaufService.mapInvoiceTextToSpace(workitem, spacePosMappings,
|
||||
workitem.getItemValueString("invoice.positions"));
|
||||
|
||||
// Finally we attache the pdf file and the XML content to the workitem.
|
||||
attacheFiles(doc, workitem);
|
||||
|
|
|
|||
|
|
@ -482,7 +482,8 @@ public class CargosoftXMLInvoiceImportService {
|
|||
resolveATCNumbers(doc, workitem);
|
||||
|
||||
// Jetzt noch das Space mapping
|
||||
mahnlaufService.mapInvoiceTextToSpace(workitem, spacePosMappings);
|
||||
mahnlaufService.mapInvoiceTextToSpace(workitem, spacePosMappings,
|
||||
workitem.getItemValueString("invoice.text"));
|
||||
|
||||
// Rückstellungen ignorieren
|
||||
if (isRueckStellung(workitem)) {
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@ import jakarta.inject.Named;
|
|||
/**
|
||||
* Der ZohoController ist für das Admin Interface um Access Tokens zu erzeugen.
|
||||
*
|
||||
* @see admin/zoho.xhml
|
||||
* @see zoho.xhml
|
||||
*
|
||||
* @author rsoika
|
||||
*
|
||||
|
|
|
|||
5099
workflow/ams/rechnungseingang-ams-1.1.0.bpmn
Normal file
5099
workflow/ams/rechnungseingang-ams-1.1.0.bpmn
Normal file
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue