This commit is contained in:
Ralph Soika 2025-07-24 16:55:27 +02:00
parent 259373053f
commit 6545f76f43
5 changed files with 145 additions and 129 deletions

View file

@ -56,14 +56,12 @@ services:
###############################################
# Tika OCR Service
###############################################
# tika:
# #image: apache/tika:latest
# #image: apache/tika:1.24.1-full
# image: apache/tika:2.4.1-full
# environment:
# TZ: "Europe/Berlin"
# ports:
# - "9998:9998"
tika:
image: apache/tika:3.2.0.0-full
environment:
TZ: "Europe/Berlin"
ports:
- "9998:9998"
##################
# Exporter Service

View file

@ -101,37 +101,19 @@ public class InvoicePlugin extends AbstractPlugin {
boolean isPublicEvent = !("0".equals(event.getItemValueString("keypublicresult")));
// Payment.type muss immer eingetragne werden!
if (isPublicEvent && workitem.getTaskID() >= TASK_ERFASSUNG && workitem.getEventID() < 900) {
if (workitem.getItemValueString("payment.type").trim().isEmpty()) {
// throw a plugin exception!
String message = resourceBundleHandler.findMessage("ERROR_MISSING_PAYMENT");
throw new PluginException(InvoicePlugin.class.getName(), ERROR_MISSING_DATA, message);
}
// doppelte Rechnungsnummer prüfen
if (workitem.getTaskID() == TASK_ERFASSUNG) {
if (isPublicEvent) {
validateInvoiceNumber(workitem);
checkIBANNumber(workitem);
}
if (workitem.getTaskID() == TASK_ERFASSUNG || ((workitem.getTaskID() == TASK_SACHPRUEFUNG
|| workitem.getTaskID() == TASK_SACHPRUEFUNG_DELEGATION)
&& workitem.getEventID() == EVENT_FREIGEBEN)) {
// Buchungsperiode auf plausi prüfen
if (isCargoRechnung(workitem) && "workitem".equals(workitem.getType())) {
validateBuchungsperiode(workitem.getItemValueString(InvoiceUtil.ITEM_INVOICE_PERIOD));
}
checkIBANNumber(workitem);
// Cargosoft Kreditorennnummer prüfen
if (isCargoRechnung(workitem)) {
validateCargosoftCdtrNumber(workitem);
}
}
}
// die prüfung der positionsnummern und Category erfolgt nur im Status
// Sachprüfung (5200) und nur beim Freigeben (20)!
if (isCargoRechnung(workitem)
&& ((workitem.getTaskID() == TASK_SACHPRUEFUNG || workitem.getTaskID() == TASK_SACHPRUEFUNG_DELEGATION)
if (((workitem.getTaskID() == TASK_SACHPRUEFUNG
|| workitem.getTaskID() == TASK_SACHPRUEFUNG_DELEGATION)
&& workitem.getEventID() == EVENT_FREIGEBEN)) {
List<ItemCollection> childs = InvoiceUtil.explodeChildList(workitem);
for (ItemCollection posItem : childs) {
@ -187,7 +169,7 @@ public class InvoicePlugin extends AbstractPlugin {
// Im folgenden überprüfen wir ob eine Buchungszeile vorkommt in der keine oder
// die Hauptbuchunsperiode ausgewählt wurde. Ist das nicht der Fal gibt es eine
// Fehlermeldung für den Anwendere
if (isCargoRechnung(workitem) && childs.size() > 0) {
if (childs.size() > 0) {
String hauptBuchungsperiode = workitem.getItemValueString("invoice.period");
boolean buchungsperiodenValid = false;
for (ItemCollection posItem : childs) {
@ -205,6 +187,8 @@ public class InvoicePlugin extends AbstractPlugin {
}
}
}
}
return workitem;
}
@ -309,7 +293,7 @@ public class InvoicePlugin extends AbstractPlugin {
// wenn _invoicenumber_duplicate bereits gesetzt ist - dann geht es ohne prüfung
// weiter
if (!invoiceNumberDuplicate.isEmpty()) {
logger.warning("...validateion skipped by user with duplicate invoice number: " + invoiceNumber);
logger.warning("...validation skipped by user with duplicate invoice number: " + invoiceNumber);
} else {
// set _invoicenumber_duplicate - dadurch wird die warnmeldung ausgegeben und
@ -335,7 +319,7 @@ public class InvoicePlugin extends AbstractPlugin {
* Datensatz übertragen. Dadurch muss man nicht extra die Kreditoren Verwaltung
* aufrufen. Es ist ein art selbst-lernendes System.
* <p>
* Die Mehtode ruft eine Plugin Exception aus um den User zu fragen ob er das
* Die Methode ruft eine Plugin Exception aus um den User zu fragen ob er das
* möchte.
*
* @throws PluginException

View file

@ -2,24 +2,39 @@
xmlns:f="http://xmlns.jcp.org/jsf/core" xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
xmlns:h="http://xmlns.jcp.org/jsf/html">
<ui:remove>
<!-- Selection by space
USAGE: options=default-selection;
pre select the current users default section (first section the user is member of)
options=byprocess;
only sections assigned to the current process are displayed.
-->
</ui:remove>
<f:subview id="spacerefinput-view">
<ui:param name="default_selection" value="#{options.indexOf('default-selection') ge 0}"></ui:param>
<ui:param name="space_ref"
value="#{default_selection ? spaceRefFormController.setDefaultSpace(workflowController.workitem,options):''}" />
<!-- (DO NOT REMOVE) default selection = #{space_ref} -->
<ui:fragment rendered="#{!readonly}">
<h:selectOneMenu required="#{required?validationController.required:false}"
value="#{workflowController.workitem.item['space.ref']}">
<f:selectItem itemLabel=""></f:selectItem>
<c:forEach
items="#{byprocess?teamController.getSpacesByProcessId(workflowController.workitem.item['process.ref']):teamController.spaces}"
<h:selectOneMenu style="" required="#{required?validationController.required:false}"
noSelectionOption="true" value="#{workflowController.workitem.item['space.ref']}">
<f:selectItem itemLabel=" - " itemValue="-"></f:selectItem>
<c:forEach items="#{spaceRefFormController.getSpaces(workflowController.workitem, options)}"
var="space">
<f:selectItem itemLabel="#{space.item['space.name']}" itemValue="#{space.item['$UniqueID']}">
<f:selectItem itemLabel="#{space.item['name']}" itemValue="#{space.item['$UniqueID']}">
</f:selectItem>
</c:forEach>
<f:ajax render="#{formComponents.clientId}" execute="#{formComponents.clientId}"
onevent="initFaelligkeit" />
</h:selectOneMenu>
</ui:fragment>
<ui:fragment rendered="#{readonly}">
<h:outputText value="#{workitem.item['space.name']}">
</h:outputText>
<h:outputText rendered="#{! empty workitem.item['space.parent.name']}"
value="#{workflowController.workitem.item['space.parent.name']} ⇒ "></h:outputText>
<h:outputText value="#{workflowController.workitem.item['space.name']}"></h:outputText>
</ui:fragment>
</f:subview>
</ui:composition>

View file

@ -0,0 +1,25 @@
<ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
xmlns:f="http://xmlns.jcp.org/jsf/core" xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
xmlns:h="http://xmlns.jcp.org/jsf/html">
<ui:fragment rendered="#{!readonly}">
<h:selectOneMenu required="#{required?validationController.required:false}"
value="#{workflowController.workitem.item['space.ref']}">
<f:selectItem itemLabel=""></f:selectItem>
<c:forEach
items="#{byprocess?teamController.getSpacesByProcessId(workflowController.workitem.item['process.ref']):teamController.spaces}"
var="space">
<f:selectItem itemLabel="#{space.item['space.name']}" itemValue="#{space.item['$UniqueID']}">
</f:selectItem>
</c:forEach>
<f:ajax render="#{formComponents.clientId}" execute="#{formComponents.clientId}"
onevent="initFaelligkeit" />
</h:selectOneMenu>
</ui:fragment>
<ui:fragment rendered="#{readonly}">
<h:outputText value="#{workitem.item['space.name']}">
</h:outputText>
</ui:fragment>
</ui:composition>

View file

@ -3242,13 +3242,6 @@ result.isValid=true;
<item name="invoice.currency" type="custom" required="true" path="alexander/currency_in" label="Währung:" />
</imixs-form-section>
<imixs-form-section columns="4">
<item name="invoice.ttc" type="text" label="Transaction Type Code:" />
<item name="invoice.spc" type="text" label="Sender Purpose Code:" />
<item name="invoice.lcc" type="text" label="Local Clearing Code:" />
<item name="invoice.rpc" type="text" label="Receiver Purpose code:" />
</imixs-form-section>
<imixs-form-section columns="2">
<item name="cdtr.iban" type="text" label="IBAN:" />
@ -3258,7 +3251,7 @@ result.isValid=true;
<imixs-form-section columns="2">
<item name="invoice.period" type="text" required="false" label="Buchungsperiode (yyyymm):" />
<item name="" type="custom" path="alexander/zahlungsart" label="Zahlungsart:"/>
<item name="" type="custom" path="spaceref" label="Bereich:" required="true" />
<item name="" type="custom" path="alexander/spaceref" label="Bereich:" required="true" />
<item name="" type="custom" path="alexander/sachbearbeiter" label="Sachbearbeiter:"
hide="#{!teamController.isManagerOf(workflowController.workitem.item['process.ref'])}" /> />
</imixs-form-section>
@ -3831,10 +3824,10 @@ Export erfolgt über eine asynchrone Verarbeitung im Modell 'cargosoft-export']]
<imixs:value><![CDATA[<ml-config name="status">suggest</ml-config>
<validation name="required">false</validation>
<model>
<version>rechnungseingang-sachrechnung-de-1.0</version>
<version>(^rechnungseingang-sachrechnung-[a-z]{2,3}-\d+(?:\.\d+)?$)</version>
<task>5001</task>
<event>980</event>
</model>]]></imixs:value>
</model>]]></imixs:value>
</imixs:item>
<imixs:item name="txtname" type="xs:string">
<imixs:value><![CDATA[Anweisen]]></imixs:value>
@ -4450,6 +4443,7 @@ Export erfolgt über eine asynchrone Verarbeitung im Modell 'cargosoft-export']]
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_48" id="BPMNEdge_SequenceFlow_49" sourceElement="BPMNShape_IntermediateCatchEvent_22" targetElement="BPMNShape_IntermediateThrowEvent_3">
<bpmndi:BPMNLabel id="BPMNLabel_127"/>
<di:waypoint x="783.0" y="105.0"/>
<di:waypoint x="840.0" y="105.0"/>
<di:waypoint x="897.0" y="105.0"/>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="SequenceFlow_2" id="BPMNEdge_SequenceFlow_3" sourceElement="BPMNShape_IntermediateCatchEvent_17" targetElement="BPMNShape_Task_10">