Compare commits

..

No commits in common. "master" and "office-alexander-logistics-1.3" have entirely different histories.

368 changed files with 4882 additions and 12970 deletions

2
.gitignore vendored
View file

@ -13,11 +13,9 @@ target/
.metadata/ .metadata/
.project .project
.classpath .classpath
.env
# ignore docker deployments # ignore docker deployments
docker/deployments/ docker/deployments/
docker/keys/imixs-llm.xml
# Sepa Report # Sepa Report
reports/sepa/result_sepa* reports/sepa/result_sepa*

View file

@ -1,7 +1,11 @@
FROM imixs/imixs-office-workflow:5.1.5-wildfly-29.0.1.Final-jdk17 FROM imixs/imixs-office-workflow:5.1.1-wildfly-27.0.1.Final-jdk17
#FROM imixs/imixs-office-workflow:5.1.0
# Setup debug configuration
# COPY ./docker/configuration/standalone-debug.xml /opt/jboss/wildfly/standalone/configuration/
COPY ./docker/lucene-core-7.7.3.jar /opt/jboss/
# Deploy artefact # Deploy artefact
RUN rm -r /opt/jboss/wildfly/standalone/deployments/* RUN rm -r /opt/jboss/wildfly/standalone/deployments/*
# Deploy artefact COPY ./*-app/target/*.war /opt/jboss/wildfly/standalone/deployments/
COPY ./target/*.war /opt/jboss/wildfly/standalone/deployments/

View file

@ -1,8 +1,10 @@
FROM imixs/imixs-office-workflow:5.1.5-wildfly-29.0.1.Final-jdk17 FROM imixs/imixs-office-workflow:5.1.1-wildfly-27.0.1.Final-jdk17
#FROM imixs/imixs-office-workflow:5.1.0
# Deploy artefact # Deploy artefact
RUN rm -r /opt/jboss/wildfly/standalone/deployments/* RUN rm -r /opt/jboss/wildfly/standalone/deployments/*
COPY ./target/*.war /opt/jboss/wildfly/standalone/deployments/ COPY ./*-app/target/*.war /opt/jboss/wildfly/standalone/deployments/
# Run in Debug Mode # Run in Debug Mode
CMD ["/opt/jboss/wildfly/bin/standalone.sh", "-b", "0.0.0.0", "-bmanagement", "0.0.0.0", "--debug", "*:8787"] CMD ["/opt/jboss/wildfly/bin/standalone.sh", "-b", "0.0.0.0", "-bmanagement", "0.0.0.0", "--debug", "*:8787"]

View file

@ -1,17 +1,5 @@
# Versionen # Versionen
## 1.4.0 (Development)
- neuer AGLAIInvoiceAdapter
der Adapter `com.alexanderlogistics.AGLAIInvoiceAdapter` muss künftig in das Import Event der Rechnungseingangs Modelle. Dieser Adapter Findet den Space und den Mandanten.
Neue Modelle:
- Posteingang
- posteingang-de-3.0
- AMS
- rechnungseingang-ams-1.1.0.bpmn
## 1.3.6 (Development) ## 1.3.6 (Development)
**KSeF Produktiname II.** **KSeF Produktiname II.**

View file

@ -1,204 +0,0 @@
# Eigenes Backup-System (Backup-Mirror)
## Architektur, Einrichtung und Disaster-Recovery-Konzept
---
## 1. Idee und Architektur
### 1.1 Ausgangslage
Imixs-Office-Workflow wird von uns als eine transaktionale, hochverfügbare
Geschäftsprozessmanagement-Suite betrieben. Die Basis ist ein Open Source Kernel,
der frei zugänglich ist ([https://github.com/imixs/](https://github.com/imixs/)).
Unabhängig vom gewählten Betriebsmodell (SaaS, Public Cloud, Private Cloud, On
Premise) sind und bleiben Sie Eigentümer Ihrer Geschäftsdaten. Über den
Backup-Service haben Sie die Möglichkeit, jederzeit eigenständig auf eine
vollständige Kopie Ihrer Daten zuzugreifen unabhängig davon, wie und wo Ihre
Instanz aktuell betrieben wird.
### 1.2 Architektur Own your Data
Auch wenn wir den Betrieb Ihrer Instanz übernehmen, bedeutet das nicht, dass Sie
von uns abhängig sind. Über den Backup-Mirror betreiben Sie bei sich einen eigenen,
unabhängigen Backup-Dienst. Dieser Dienst wird von Ihnen selbst eingerichtet,
verwaltet und überwacht und läuft vollständig autark wir müssen ihn technisch
weder kennen noch verwalten. Dadurch gilt:
> **Sie verfügen über eine eigenständige, vollständige Kopie Ihrer
> Geschäftsdaten unabhängig von unserer Infrastruktur. Mit dieser Kopie kann
> Ihr System bei Bedarf komplett neu aufgebaut werden.**
Das ist ein bewusst einfaches und robustes Prinzip: Es kommt nicht darauf an, *wo*
Ihre Daten zusätzlich liegen, sondern *wer* die Kontrolle über diesen zusätzlichen
Sicherungsort hat. Nur wenn diese Kontrolle bei Ihnen liegt, sind Sie wirklich
unabhängig.
### 1.3 Wie es funktioniert
Technisch basiert das Konzept auf dem Open-Source-Projekt
[Imixs-Archive](https://github.com/imixs/imixs-archive), konkret auf dem Baustein
*Imixs-Archive-Backup*. Der Ablauf im Überblick:
1. Bei jeder Änderung an einem Geschäftsvorgang erzeugt Ihre Workflow-Instanz
automatisch einen unveränderlichen Snapshot (eine vollständige Kopie des
Vorgangs inkl. aller angehängten Dokumente).
2. Diese Snapshots werden über die REST-Schnittstelle Ihrer Workflow-Instanz
bereitgestellt.
3. Ein bei Ihnen installierter Backup-Dienst (siehe Abschnitt 2) ruft diese
Snapshots eigenständig ab und speichert sie auf einem Speicherort Ihrer Wahl
(z. B. eigener FTP-/Storage-Server).
Wichtig: Die Verbindung erfolgt **von Ihrem System zu unserer Workflow-Instanz**
(„Pull-Prinzip"). Sie benötigen dafür lediglich einen Netzwerkzugriff auf die
REST-Schnittstelle Ihrer Instanz wir müssen keinen Zugriff auf Ihre Infrastruktur
haben und erhalten auch keinen.
---
## 2. Technische Einrichtung
Der Backup-Dienst kann als Docker-Container in unterschiedlichen Umgebungen betrieben werden:
- **Local**: lokal über Docker oder Docker Compose,
- **Private Cloud**: in einer Private Cloud (z.b. Kubernetes, OpenShift)
- **Public Cloud**: in einer Public Cloud Umgebung (z.b. AWS, Microsoft Azure)
### 2.1 Voraussetzungen
- Eine eigene Server- bzw. Container-Umgebung (Docker) auf Ihrer Seite
- Ein eigener Speicherort für die Backup-Daten (z. B. FTP-Storage, NAS mit
FTP-Anbindung)
- Eine sogenannte **Mirror-ID**, die wir Ihnen bereitstellen
### 2.2 Mirror-ID anfragen
Die Mirror-ID ist eine organisatorische Kennung, mit der wir Ihre eigene
Backup-Verbindung für Ihre Instanz freischalten. Sie ist kein Sicherheitsmerkmal im
engeren Sinn, sondern eine Vereinbarung zwischen uns: *„Kunde X betreibt ein eigenes
Backup."* Bitte fordern Sie diese ID formlos bei uns an.
### 2.3 Backup-Nutzer in Ihrer eigenen Instanz anlegen
Ein zentraler Punkt für die Autarkie des Systems: **Sie legen den technischen
Benutzer für den Backup-Zugriff selbst in Ihrer Imixs-Instanz an.** Dieser Nutzer
gehört ausschließlich Ihnen wir kennen weder das Passwort noch verwalten wir
dieses Konto. Vergeben Sie dem Nutzer ausreichende Leserechte, damit er alle
relevanten Vorgänge und Dokumente sichern kann.
### 2.4 Docker-Compose Beispielkonfiguration
Das folgende Beispiel zeigt eine Docker Compose Konfiguraiton für den Betrieb des Backup-Dienstes:
```yaml
version: "3.6"
services:
backup:
image: imixs/imixs-archive-backup:latest
environment:
TZ: "Europe/Berlin"
WORKFLOW_SERVICE_ENDPOINT: "https://<ihre-instanz>.office-workflow.de/api/"
WORKFLOW_SERVICE_USER: "<ihr-backup-nutzer>"
WORKFLOW_SERVICE_PASSWORD: "<ihr-passwort>"
WORKFLOW_SERVICE_AUTHMETHOD: "form"
BACKUP_FTP_HOST: "<ihr-storage-host>"
BACKUP_FTP_PATH: "<ihr-zielverzeichnis>"
BACKUP_FTP_PORT: "21"
BACKUP_FTP_USER: "<ihr-ftp-nutzer>"
BACKUP_FTP_PASSWORD: "<ihr-ftp-passwort>"
BACKUP_MIRROR_ID: "<ihre-mirror-id>"
ports:
- "8084:8080"
- "9990:9990"
```
**Erläuterung der wichtigsten Parameter:**
| Parameter | Bedeutung |
|---|---|
| `WORKFLOW_SERVICE_ENDPOINT` | Die REST-API-Adresse Ihrer bei uns gehosteten Workflow-Instanz |
| `WORKFLOW_SERVICE_USER/PASSWORD` | Der von Ihnen selbst angelegte Backup-Nutzer |
| `BACKUP_FTP_*` | Ihr eigener Speicherort für die Backup-Daten |
| `BACKUP_MIRROR_ID` | Die von uns bereitgestellte Freischalt-ID |
Nach dem Start prüft der Dienst regelmäßig auf neue zu sichernde Vorgänge und
überträgt diese automatisch auf Ihren Speicherort.
### 2.5 Monitoring des eigenen Backup-Dienstes
Da der Dienst vollständig in Ihrer Verantwortung läuft, sollten Sie ihn aktiv
überwachen. Ein einfacher Ping-Check zeigt zwar, dass der Container erreichbar
ist sagt aber nichts darüber aus, ob der Dienst tatsächlich funktionsfähig ist
und Backups erfolgreich durchführt.
Der Imixs-Archive-Backup-Service stellt hierfür standardisierte **MicroProfile-Endpunkte** mit, die auf Port `9990`
bereitgestellt werden:
| Endpunkt | Beschreibung |
|---|---|
| `/health` | Liefert den Health-Status des Dienstes nach dem MicroProfile-Health-Standard inklusive Readiness (ist der Dienst betriebsbereit, z. B. Verbindung zur Workflow-API und zum FTP-Storage vorhanden?) und Liveness (läuft der Prozess korrekt?) |
| `/metrics` | Liefert Betriebskennzahlen im MicroProfile-Metrics-Format (Prometheus-kompatibel), z. B. Anzahl verarbeiteter Backups, Fehlerzähler, Laufzeiten |
Damit lässt sich der Dienst professionell überwachen:
- **Health-Checks** binden Sie direkt in gängige Monitoring-Systeme ein (z. B.
Kubernetes Liveness-/Readiness-Probes, Uptime-Kuma, Nagios, Icinga) und erkennen
so nicht nur einen abgestürzten Container, sondern auch einen Dienst, der zwar
läuft, aber z. B. keine Verbindung mehr zu Ihrer Workflow-Instanz oder zum
FTP-Ziel herstellen kann.
- **Metrics** lassen sich direkt von Prometheus abgegriffen und in Grafana
visualisiert werden so erkennen Sie auf einen Blick, ob regelmäßig Backups
durchgeführt werden, oder ob z. B. die Fehlerrate ansteigt.
**Voraussetzung:** Sie müssen Port `9990` in Ihrer Docker-Umgebung entsprechend
freigeben bzw. mappen, damit Ihr Monitoring-System auf die Endpunkte zugreifen kann
(siehe Port-Mapping im Beispiel aus Abschnitt 2.4).
Ein Backup, das unbemerkt seit Wochen nicht mehr funktioniert, bietet keinen Schutz.
Die Überwachung über Health- und Metrics-Endpunkte ist daher ein integraler
Bestandteil des Konzepts, nicht optional.
---
## 3. Notfall- und Wiederherstellungsfall (Disaster Recovery)
Im Falle eines Disaster-Recovery-Prozesses stellen Sie uns Ihr Backup zur Verfügung, damit Ihr System auf dessen Basis wiederhergestellt werden kann. Dieser Abschnitt beschreibt das Vorgehen nur in Stichpunkten.
Die vollständige technische Dokumentation der
Imixs-Workflow-Architektur ist Open Source und öffentlich einsehbar unter
[github.com/imixs](https://github.com/imixs).
**Grundprinzip der Wiederherstellung:**
- Ihre gesicherten Snapshot-Daten liegen vollständig und unverändert in Ihrem
eigenen Speicher (FTP/Storage) vor.
- Diese Daten liegen in einem offenen, plattformunabhängigen XML-Format vor und
sind nicht an unsere konkrete Infrastruktur gebunden.
- Auf Basis dieser Daten kann eine neue Imixs-Workflow-Instanz (bei Ihnen oder bei
einem anderen Dienstleister) aufgesetzt werden.
- Über die Restore-Funktion der Imixs-Archive-Komponenten werden die Snapshots in
die neue Instanz zurückgespielt jeder Geschäftsvorgang wird dabei inklusive
seiner Historie und aller Dokumente wiederhergestellt.
**Wichtige Stichpunkte für den Ernstfall:**
- Backup-Daten sind vollständig bei Ihnen vorhanden → keine Abhängigkeit von uns
- Wiederherstellung erfordert eine lauffähige Imixs-Workflow-Umgebung (Open Source,
frei verfügbar)
- Die technische Vorgehensweise zum Restore ist Teil der öffentlichen
Imixs-Archive-Dokumentation
- Wir unterstützen Sie im Ernstfall selbstverständlich gerne beim Wiederaufbau
diese Unterstützung ist jedoch **keine Voraussetzung**, da die Daten und das
Wiederherstellungsverfahren vollständig unabhängig von uns nutzbar sind
---
## 4. Zusammenfassung
Mit dem Backup-Mirror bleiben Sie jederzeit Eigentümer Ihrer Geschäftsdaten unabhängig
davon, wie und wo Ihre Instanz betrieben wird. Sie richten den Dienst selbst ein, verwalten
ihn eigenständig und behalten so die volle Kontrolle über Ihre zusätzliche Datenkopie. Genau
diese Unabhängigkeit ist es, die Ihnen im Bedarfsfall den vollständigen Wiederaufbau Ihres
Systems ermöglicht.
Bei Fragen zur Einrichtung oder zur Anforderung Ihrer Mirror-ID kontaktieren Sie uns
gerne.

View file

@ -1,22 +0,0 @@
version: "3.6"
services:
###############################################
# Backup Service
###############################################
backup:
image: imixs/imixs-archive-backup:latest
environment:
TZ: "Europe/Berlin"
WORKFLOW_SERVICE_ENDPOINT: "https://alexander-logistics-ams.office-workflow.de/api/"
WORKFLOW_SERVICE_USER: "kutzner-backup-service"
WORKFLOW_SERVICE_PASSWORD: "16e-7ede-4c1c-bdeb-e16ce"
WORKFLOW_SERVICE_AUTHMETHOD: "form"
BACKUP_FTP_HOST: "u248962.your-storagebox.de"
BACKUP_FTP_PATH: "/test/agl/ams-test"
BACKUP_FTP_PORT: "21"
BACKUP_FTP_USER: "u248962"
BACKUP_FTP_PASSWORD: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
BACKUP_MIRROR_ID: "backup-mirror-local"
WORKFLOW_REST_JPQL_DOUBLEDECODE_WORKAROUND: "true"
ports:
- "8084:8080"

4
devi
View file

@ -53,13 +53,15 @@ fi
if [[ "$(strip_dash $1)" == "hot" ]]; then if [[ "$(strip_dash $1)" == "hot" ]]; then
echo "* Hotdeploy..." echo "* Hotdeploy..."
cd *-app
mvn manik-hotdeploy:hotdeploy mvn manik-hotdeploy:hotdeploy
cd ..
fi fi
if [[ "$(strip_dash $1)" == "deploy" ]]; then if [[ "$(strip_dash $1)" == "deploy" ]]; then
echo " Deploy to Imixs-Cloud..." echo " Deploy to Imixs-Cloud..."
mvn clean install -Pimixs-cloud -DskipTests mvn clean install -Pkubernetes -DskipTests
fi fi

99
doc/FTP.md Normal file
View file

@ -0,0 +1,99 @@
# FTP Server
Wir stellen verschiedene FTP Laufwerke auf dem Hetzner bereit um Daten mit Cargosoft und anderen Partnern auszutauschen
# Cargosoft
**ACHTUNG:** Frau Beste bittet darum den public key für alle Sub Accounts zu installieren:
$ cat id_rsa_cargosoft.pub | ssh -p23 u248962-sub12@u248962.your-storagebox.de install-ssh-key
## Cargosoft Schnittstelle (Bremen - Mandant 001)
Server: u248962.your-storagebox.de
Pfad: /office-alexander-logistics/cargosoft
Benutzername: u248962-sub2
Passwort: aXa61n9Un3jDNQlL
## Cargosoft Schnittstelle (AMS - Mandant 002)
Server: u248962.your-storagebox.de
Pfad: /office-alexander-logistics/cargosoft-ams
Benutzername: u248962-sub12
Passwort: RA9N0V8EB8_1Dnw
## Cargosoft Schnittstelle (Bremerhaven Mandant 005)
Server: u248962.your-storagebox.de
Pfad: /office-alexander-logistics/cargosoft-bhv
Benutzername: u248962-sub5
Passwort: 5hKKzv6TFCKRrAdR
## Cargosoft Schnittstelle (Polen Mandant 003)
Server: u248962.your-storagebox.de
Pfad: /office-alexander-logistics/cargosoft-pl
Benutzername: u248962-sub7
Passwort: PGPzzqmtZ8BSxkbs
## Cargosoft Schnittstelle (Dubai Mandant 006)
Server: u248962.your-storagebox.de
Pfad: /office-alexander-logistics/cargosoft-dwc
Benutzername: u248962-sub3
Passwort: enHjxs9h4nJ6EgsZ
Wir stellen Herrn Hoelzl in Dubai ein eigenes FTP Laufwerk bereit, in das wir die Rechnungen per Imixs-Exporter verschieben.
Server: u248962.your-storagebox.de
Pfad: /office-alexander-logistics/filetransfer-dwc
Benutzername: u248962-sub11
Passwort: mH9mAS77QhuA5XJi
Herr Hoelzl überträgt dann die Daten in eine app von einer Steuerkanzlei.
Es wird dazu ein FTP Server bereitgestellt der von Herrn Hölzl und Frau Geisler lokal eingebunden werden kann.
Der aktuelle Workflow für Eingangs- und Ausgangsrechnungen wird dahingehend angepasst, dass die Belege automatisch nach folgenden Format exportiert werden:
```
├── invoice-out
│ ├── 2024
│ │ ├── 06
│ │ │ ├── 198_EX-DWC-2406-013.pdf
│ │ │ ├── 199_EX-DWC-2406-013.pdf
│ │ ├── 07
│ │ │ ├── 200_IM-DWC-2407-010.pdf
├── invoice-in
│ ├── 2024
│ │ ├── 06
│ │ │ ├── 700045_EX-DWC-2406-005.pdf
│ │ │ ├── 700045_59475.pdf
```
sequencenumer +
firmename + positionsnummer + rechnungsnummer +
Der Export erfolgt automatisch nach Empfang der Rechnung bzw. nach Prüfung der Rechnung (Review->Approved). Die Dateinamen werden vom System berechnet (siehe oben). Bei Sachrechnungen wird das Rechnungsdatum verwendet um die Buchungsperiode zu berechnen.
## Cargosoft Schnittstelle (USA Mandant 004)
Server: u248962.your-storagebox.de
Pfad: /office-alexander-logistics/cargosoft-usa
Benutzername: u248962-sub9
Passwort: GMk7NgDBrmb2QqXg
## Cargosoft Schnittstelle (China Mandant 007)
Server: u248962.your-storagebox.de
Pfad: /office-alexander-logistics/cargosoft-chn
Benutzername: u248962-sub10
Passwort: yswBeN83jMqkMqJa
## Cargosoft Schnittstelle (Brazil - Mandant 008)
Server: u248962.your-storagebox.de
Pfad: /office-alexander-logistics/cargosoft-br
Benutzername: u248962-sub13
Passwort: YjQ5u5Nzz535-eGR

View file

@ -0,0 +1,49 @@
Hallo,
wir nutzen oben genannte Storage Box für den Datenaustausch mit verschiedenen Kunden.
Einer der Kunden kann seit dem 25. Juli nicht mehr von seinem Firmennetzwerk darauf zugreifen.
Wir haben auf dem Linux Server beim Kunden folgende Tests durchgeführt:
cargodb@cargodb:~$ sftp -v -oPort=22 u248962-sub1@u248962.your-storagebox.de
OpenSSH_8.2p1 Ubuntu-4ubuntu0.3, OpenSSL 1.1.1f 31 Mar 2020
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: include /etc/ssh/ssh_config.d/_.conf matched no files
debug1: /etc/ssh/ssh_config line 21: Applying options for _
debug2: resolving "u248962.your-storagebox.de" port 22
debug2: ssh_connect_direct
debug1: Connecting to u248962.your-storagebox.de [78.47.94.120] port 22.
debug1: connect to address 78.47.94.120 port 22: Connection refused
debug1: Connecting to u248962.your-storagebox.de [2a01:4f8:2b01:db::2] port 22.
debug1: connect to address 2a01:4f8:2b01:db::2 port 22: Network is unreachable
ssh: connect to host u248962.your-storagebox.de port 22: Network is unreachable
Connection closed.
cargodb@cargodb:~$ nc -zv u248962-sub1@u248962.your-storagebox.de 22
nc: getaddrinfo for host u248962-sub1@u248962.your-storagebox.de port 22: Name or service not known
cargodb@cargodb:~$ tcptraceroute u248962.your-storagebox.de 22
Selected device ens160, address 192.168.83.3, port 52113 for outgoing packets
Tracing the path to u248962.your-storagebox.de (78.47.94.120) on TCP port 22 (ssh), 30 hops max
1 192.168.83.254 0.233 ms 0.175 ms 0.242 ms
2 82-198-218-38.briteline.de (82.198.218.38) 1.470 ms 1.103 ms 2.286 ms
3 10.200.48.254 0.930 ms 0.915 ms 0.776 ms
4 82-198-192-194.briteline.de (82.198.192.194) 1.092 ms 1.114 ms 0.902 ms
5 82-198-216-168.briteline.de (82.198.216.168) 1.101 ms 1.168 ms 1.034 ms
6 ae0-201.cr11.bre04.lwlcom.net (31.209.93.121) 1.543 ms 1.650 ms 1.528 ms
7 ae0-30.cr10.bre09.lwlcom.net (185.146.230.97) 7.713 ms 7.440 ms 11.215 ms
8 ae0-10.cr11.bre09.lwlcom.net (185.146.230.53) 7.647 ms 7.652 ms 7.617 ms
9 ae0-20.cr10.bre03.lwlcom.net (185.146.230.99) 7.530 ms 7.716 ms 7.505 ms
10 ae7-90.cr10.bre11.lwlcom.net (185.146.230.34) 7.723 ms 7.661 ms 7.578 ms
11 ae7-100.cr10.lut01.lwlcom.net (185.146.230.39) 7.446 ms 7.509 ms 7.673 ms
12 ae6-100.cr10.fra03.lwlcom.net (185.146.230.27) 7.980 ms 7.281 ms 7.981 ms
13 ae2-100.cr10.fra04.lwlcom.net (185.146.230.51) 7.287 ms 7.392 ms 7.406 ms
14 213-133-121-205.clients.your-server.de (213.133.121.205) 10.464 ms 10.542 ms 10.573 ms
15 core24.fsn1.hetzner.com (213.239.224.85) 16.458 ms 16.381 ms 16.338 ms
16 mx10k1.dc3.fsn1.hetzner.com (213.239.254.142) 16.632 ms 16.687 ms 24.837 ms
17 static.120.94.47.78.clients.your-server.de (78.47.94.120) 16.526 ms !p 16.509 ms !p 16.505 ms !p
Können Sie anhand dieser Daten erkennen worin das Problem besteht? Andere Kunden können die Storage Box problemlos nutzen.
Vielen Dank für Ihre Hilfe
Mit freundlichen Grüßen
Ralph Soika

25
doc/KSeF/FEEDBACK.md Normal file
View file

@ -0,0 +1,25 @@
# Feedback zum PDF FIle
| Feld / Komponente | Status |
| :------------------------------------------------------- | :----------------------- |
| **1. Podmiot 1 — Daten des Rechnungsausstellers (AGLP)** | |
| `<Nazwa>` | **FIXED** |
| `<AdresL1>` | **FIXED** |
| `<PrefiksPodatnika>PL</PrefiksPodatnika>` | **FIXED** |
| **2. Podmiot 2 — Daten des Rechnungsempfängers** | |
| `<NrID> <NIP>` | **ALREADY IMPLEMENTED** |
| EU-Rechnungsempfänger | **UNCLEAR!** |
| Anschrift des Rechnungsempfängers | **CARGOSOFT TOPIC** |
| **3. Abschnitt <Fa> — Rechnungskopf** | **FIXED** |
| `<P_1M>` | **FIXED** |
| `<KursWalutyZ>` | **FIXED** |
| **4. Rechnungspositionen <FaWiersz> — Pflichtfelder** | |
| `<P_7>` | **FIXED** |
| `<P_8B>` | **IGNORED - NOT FIXED!** |
| `<P_11A>` | **????** |
| `<P_11Vat>` | **????** |
| **5. Rechnungssummen — <P_13_x> / <P_14_x>** | |
| _Noch keine Details_ | — |
| **6. Zahlung — <Platnosc>** | |
| `<FormaPlatnosci>` | **FIXED** |
| `<RachunekBankowy>` | **FIXED** |

3
doc/KSeF/SECRETS.md Normal file
View file

@ -0,0 +1,3 @@
NIP = "9552521552"
TOKEN = "20251113-EC-2751AC3000-5C5466924B-62|nip-9552521552|fc0c95d020dc45d4af491fb0aa755f3f3f674b33ecbf4250a88ea6e36fa8340b

9
doc/MAIL.md Normal file
View file

@ -0,0 +1,9 @@
# Mail
Testen von Mailing kann man über
https://www.mail-tester.com/
Kutzner Mail gateway
PW: 26W%R#Xe4^Z2Gyz1

1
doc/id_rsa_cargosoft.pub Normal file
View file

@ -0,0 +1 @@
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAnGiu0PUBl+G++vHrGP5wDRit4mXF4hXTyzUem3BPADaV0DUuYN1Fx5RpDl2F8mhnqDYcyCTBzLTJ+0jFqq1pzoJW5ZWZ+hSChabVCV4m8UkFkhbRmjxNkPx26ZMhfTD1mDqgCKQ+bbt1mi04UZppDKBr+9ZrMG3d0odHblEJHixtJ7Hqr9vvXXbvNv4E9B/9dlW57oyEUk/vKmwuLyGAsDjxjfB3W+Faab+gev8VDwJxdbD90HX0O2Az05wy9EC7M3pujcawsHdaFXgFFRRwlVuUkX3z9hp1Uekqg0N81hty7/i8GiZ9/m3Y6hIA5eRM4ZpDQFEF8SY9TLSzDehNoQ== seesped@cargodb

78
doc/zoho/SECRETS.md Normal file
View file

@ -0,0 +1,78 @@
# Zoho Web API
AGL Dubai nutzt Zoho als Platform zusammen mit einer lokalen Steuerkanzlei
## Test/Prod Account Imixs
https://api-console.zoho.eu/
https://api-console.zoho.eu/client/1000.NLTM2KUEHI696MSLGEIANATVGGX7IN
```
zoho.accesstoken 1000.18f5fbeaf572425b8062d015d541aad5.a704efa994774ef33d7af75106468a13
zoho.apidomain https://www.zohoapis.eu
zoho.clientid 1000.GR5FTPZYB06HEWSFSSX4DJU3OBD4EJ
zoho.clientsecret 3f3e74c5212bbc924a7ebf77f887c6296db1106c47
zoho.code 1000.c184c7592a218fee58f7b7855b56eb77.7b533ff9f570fd6ab3296784caeec072
zoho.organization 20105697367
zoho.refreshtoken 1000.98fe4d0c4f676237b400bf8a3dc219f3.03d6bacf5b988d339eb788c4ecff440e
zoho.scope ZohoBooks.contacts.ALL ZohoBooks.invoices.CREATE ZohoBooks.invoices.READ ZohoBooks.invoices.UPDATE
```
## Atari
atari.600xl@gmail.com
800xlAtari
```
zoho.apidomain https://www.zohoapis.eu
zoho.clientid 1000.86O4P321HDYDRX0Q0N1G7YOJRJ9D5W
zoho.clientsecret 2a67b6cfc364f5df27cc8eb33e9b0e4e8a0221ebc3
zoho.code 1000.c7dc89c06111b93f1242b587fabed4ac.44c591dffbd978a316e3d90ed3fefc78
zoho.organization 886924765
zoho.scope ZohoBooks.contacts.ALL,ZohoBooks.invoices.ALL,ZohoBooks.bills.ALL
```
## Prod DWC
info@imixs.com
imixs4zoho
Für Drecks Forum
Imixs4#zoho
Imixs4#zoho
http://books.zoho.com/
https://api-console.zoho.com/
ZohoBooks.contacts.ALL,ZohoBooks.invoices.ALL,ZohoBooks.bills.ALL
```
zoho.apidomain https://www.zohoapis.com
zoho.clientid 1000.MQE1SU8UGY6F2PBPASOXGTLWYQD1FS
zoho.clientsecret 1ca70e1ab803b3fed6b1b5e00858c316e2003d289b
zoho.organization 884218508
zoho.scope ZohoBooks.contacts.ALL,ZohoBooks.invoices.ALL,ZohoBooks.bills.ALL
```
# API Dokumentation
- API Docu: https://www.zoho.com/books/api/v3/introduction/
- Authentication: https://www.zoho.com/books/api/v3/oauth/
# Testumgebung
https://books.zoho.eu/app/20105697367
https://accounts.zoho.eu/home#
Base API URI= https://accounts.zoho.eu/
# AGL Organisation
https://api-console.zoho.com
info@imixs.com
password imixs4zoho

View file

@ -41,8 +41,8 @@ services:
WORKFLOW_SERVICE_USER: "admin" WORKFLOW_SERVICE_USER: "admin"
WORKFLOW_SERVICE_PASSWORD: "adminadmin" WORKFLOW_SERVICE_PASSWORD: "adminadmin"
# LLM Integration LLM_SERVICE_ENDPOINT_USER: "admin"
LLM_CONFIG_FILE: /opt/jboss/imixs-llm.xml LLM_SERVICE_ENDPOINT_PASSWORD: "imixs4.null"
# KSeF - Polen Test # KSeF - Polen Test
KSEF_API_NIP: "9552521552" KSEF_API_NIP: "9552521552"
@ -57,7 +57,6 @@ services:
- "8787:8787" - "8787:8787"
volumes: volumes:
- ./docker/deployments:/opt/jboss/wildfly/standalone/deployments/ - ./docker/deployments:/opt/jboss/wildfly/standalone/deployments/
- ./docker/keys/imixs-llm.xml:/opt/jboss/imixs-llm.xml
- ./docker/transfer:/opt/jboss/wildfly/transfer/ - ./docker/transfer:/opt/jboss/wildfly/transfer/
############################################### ###############################################

Binary file not shown.

11
hotdeploy.sh Executable file
View file

@ -0,0 +1,11 @@
#!/bin/bash
############################################################
# Setup hotdeploy
#
############################################################
cd office-alexander-logistics-app
mvn manik-hotdeploy:hotdeploy
cd ..

View file

@ -0,0 +1 @@
/target/

View file

@ -0,0 +1,430 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>office-alexander-logistics</artifactId>
<groupId>com.alexander-logistics</groupId>
<version>1.3.6</version>
</parent>
<artifactId>office-alexander-logistics-app</artifactId>
<packaging>war</packaging>
<name>Imixs Office Workflow App</name>
<profiles>
<profile>
<id>docker</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
<executions>
<execution>
<phase>install</phase>
<configuration>
<target>
<exec executable="docker">
<arg value="build" />
<arg value="-t" />
<arg value="imixs/${imixs-office.applicationname}" />
<arg value="../." />
</exec>
</target>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>debug</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
<executions>
<execution>
<phase>install</phase>
<configuration>
<target>
<exec executable="docker">
<arg value="build" />
<arg value="-f" />
<arg value="../Dockerfile-wildfly-debug" />
<arg value="-t" />
<arg value="imixs/${imixs-office.applicationname}" />
<arg value="../." />
</exec>
</target>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
<profile>
<id>kubernetes</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
<executions>
<execution>
<phase>install</phase>
<configuration>
<target>
<exec executable="docker">
<arg value="build" />
<arg value="-t" />
<arg
value="imixs/${imixs-office.applicationname}:${project.version}" />
<arg value="../." />
</exec>
<exec executable="docker">
<arg value="tag" />
<arg
value="imixs/${imixs-office.applicationname}:${project.version}" />
<arg
value="${org.imixs.kubernetes.registry}/imixs/${imixs-office.applicationname}:${project.version}" />
</exec>
<exec executable="docker">
<arg value="push" />
<arg
value="${org.imixs.kubernetes.registry}/imixs/${imixs-office.applicationname}:${project.version}" />
</exec>
</target>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
<build>
<testResources>
<testResource>
<directory>${basedir}/../reports</directory>
</testResource>
<testResource>
<directory>${basedir}/../workflow</directory>
</testResource>
<testResource>
<directory>${basedir}/src/test/resources</directory>
</testResource>
</testResources>
<plugins>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.2</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
<webResources>
<resource>
<filtering>true</filtering>
<!-- this is relative to the pom.xml directory -->
<directory>${custom.webResources}</directory>
<includes>
<include>**/WEB-INF/*</include>
<!-- include any other file types you want to filter -->
</includes>
</resource>
</webResources>
<workDirectory>target/overlay-war-folder</workDirectory>
<!-- We exclude libs form the parent WAR artifact -->
<overlays>
<overlay>
<groupId>org.imixs.workflow</groupId>
<artifactId>imixs-office-workflow-app</artifactId>
<excludes>
<exclude>WEB-INF/lib/*.jar</exclude>
</excludes>
</overlay>
</overlays>
</configuration>
</plugin>
<plugin>
<groupId>org.imixs.maven</groupId>
<artifactId>manik-hotdeploy-maven-plugin</artifactId>
<version>2.0.0</version>
<executions>
<execution>
<phase>install</phase>
<goals>
<goal>deploy</goal>
</goals>
</execution>
</executions>
<configuration>
<!-- List Source and Target folders for Autodeploy and Hotdeploy -->
<autodeployments>
<deployment>
<!-- wildcard deployment -->
<source>target/*.{war,ear,jar}</source>
<target>../docker/deployments/</target>
<unpack>true</unpack>
</deployment>
</autodeployments>
<hotdeployments>
<deployment>
<source>src/main/webapp</source>
<target>../docker/deployments/office-alexander-logistics.war</target>
</deployment>
</hotdeployments>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<!-- Imixs Workflow -->
<dependency>
<groupId>org.imixs.workflow</groupId>
<artifactId>imixs-workflow-core</artifactId>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.imixs.workflow</groupId>
<artifactId>imixs-workflow-engine</artifactId>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.imixs.workflow</groupId>
<artifactId>imixs-workflow-jax-rs</artifactId>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.imixs.workflow</groupId>
<artifactId>imixs-workflow-faces</artifactId>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.imixs.workflow</groupId>
<artifactId>imixs-workflow-index-lucene</artifactId>
<scope>compile</scope>
</dependency>
<!-- Marty -->
<dependency>
<groupId>org.imixs.workflow</groupId>
<artifactId>imixs-marty</artifactId>
<type>jar</type>
<scope>compile</scope>
</dependency>
<!-- Imixs-Office-Workflow -->
<dependency>
<groupId>org.imixs.workflow</groupId>
<artifactId>imixs-office-workflow-app</artifactId>
<type>war</type>
</dependency>
<dependency>
<groupId>org.imixs.workflow</groupId>
<artifactId>imixs-office-workflow-util</artifactId>
<scope>compile</scope>
</dependency>
<!-- Imixs-Archive -->
<dependency>
<groupId>org.imixs.workflow</groupId>
<artifactId>imixs-archive-api</artifactId>
<scope>compile</scope>
</dependency>
<!-- Imixs Data -->
<dependency>
<groupId>org.imixs.workflow</groupId>
<artifactId>imixs-data-groups</artifactId>
</dependency>
<dependency>
<groupId>org.imixs.workflow</groupId>
<artifactId>imixs-data-views</artifactId>
</dependency>
<dependency>
<groupId>org.imixs.workflow</groupId>
<artifactId>imixs-data-documents</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.imixs.workflow</groupId>
<artifactId>imixs-data-importer</artifactId>
<scope>compile</scope>
</dependency>
<!-- SEPA Adapter -->
<dependency>
<groupId>org.imixs.workflow</groupId>
<artifactId>imixs-adapters-sepa</artifactId>
<scope>compile</scope>
</dependency>
<!-- DATEV Adapter -->
<dependency>
<groupId>org.imixs.workflow</groupId>
<artifactId>imixs-adapters-datev</artifactId>
<scope>compile</scope>
</dependency>
<!-- QR Code -->
<dependency>
<groupId>org.imixs.workflow</groupId>
<artifactId>imixs-adapters-qrcode</artifactId>
<scope>compile</scope>
</dependency>
<!-- POI Adapter -->
<dependency>
<groupId>org.imixs.workflow</groupId>
<artifactId>imixs-adapters-poi</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.imixs.workflow</groupId>
<artifactId>imixs-ai-workflow</artifactId>
<version>${org.imixs.ai.version}</version>
<scope>compile</scope>
</dependency>
<!-- E-Invoice -->
<dependency>
<groupId>org.imixs.util</groupId>
<artifactId>imixs-e-invoice</artifactId>
<version>${org.imixs.e-invoice.version}</version>
</dependency>
<!-- xsl 2.0 support for Reporting / Chart Diagrams -->
<dependency>
<groupId>net.sf.saxon</groupId>
<artifactId>Saxon-HE</artifactId>
</dependency>
<!-- Apache PDFBox -->
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>${apache.pdfbox.version}</version>
<scope>compile</scope>
</dependency>
<!-- Apache Commons FTP Client -->
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<version>3.6</version>
</dependency>
<!-- Microsoft oauth token -->
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.6.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.10</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.3</version>
<scope>test</scope>
</dependency>
<!-- JUnit Tests
<dependency>
<groupId>javax.json</groupId>
<artifactId>javax.json-api</artifactId>
<version>1.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.glassfish</groupId>
<artifactId>javax.json</artifactId>
<version>1.1</version>
<scope>test</scope>
</dependency>
-->
<!-- JAX-RS 2.0 Test dependencies -->
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>3.1.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-rs-client</artifactId>
<version>3.3.6</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.inject</groupId>
<artifactId>jersey-hk2</artifactId>
<version>3.1.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>jakarta.ws.rs</groupId>
<artifactId>jakarta.ws.rs-api</artifactId>
<version>3.1.0</version>
<scope>test</scope>
</dependency>
<!-- KSeF 2.0 Client
<dependency>
<groupId>pl.akmf.ksef-sdk</groupId>
<artifactId>ksef-client</artifactId>
<version>3.0.4</version>
<scope>test</scope>
</dependency>
-->
</dependencies>
<!--
<repositories>
<repository>
<id>github-cirfmf</id>
<url>https://maven.pkg.github.com/CIRFMF/ksef-client-java</url>
</repository>
</repositories>
-->
</project>

View file

@ -120,57 +120,55 @@ public class AGLAnalyticControllerDebitor implements Serializable {
link = link + "&processref=" + process.getUniqueID() + "&phrase=" + getDbtNr(); link = link + "&processref=" + process.getUniqueID() + "&phrase=" + getDbtNr();
} }
if ("analytic.invoices.count.all".equals(event.getKey())) { if ("analytic.invoices.count.all".equals(event.getKey())) {
event.getData().setItemValue("value", countAll); event.setValue("" + countAll);
event.getData().setItemValue("label", formatTotals(totalAllCurrency1, totalAllCurrency2)); event.setLabel(formatTotals(totalAllCurrency1, totalAllCurrency2));
event.getData().setItemValue("description", "Total invoices"); event.setDescription("Total invoices");
event.getWorkitem().setItemValue("invoices.total", countAll); event.getWorkitem().setItemValue("invoices.total", event.getValue());
event.getWorkitem().setItemValue("link", link); event.setLink(link);
} }
if ("analytic.invoices.count.open".equals(event.getKey())) { if ("analytic.invoices.count.open".equals(event.getKey())) {
event.getData().setItemValue("value", "" + countOpen); event.setValue("" + countOpen);
event.getData().setItemValue("label", formatTotals(totalOpenCurrency1, totalOpenCurrency2)); event.setLabel(formatTotals(totalOpenCurrency1, totalOpenCurrency2));
event.getData().setItemValue("description", "Total invoices not yet in due"); event.setDescription("Total invoices not yet in due");
event.getWorkitem().setItemValue("invoices.total.open", countOpen); event.getWorkitem().setItemValue("invoices.total.open", event.getValue());
event.getWorkitem().setItemValue("link", link); event.setLink(link);
} }
if ("analytic.invoices.count.due".equals(event.getKey())) { if ("analytic.invoices.count.due".equals(event.getKey())) {
event.getData().setItemValue("value", "" + countDue); event.setValue("" + countDue);
event.getData().setItemValue("label", formatTotals(totalDueCurrency1, totalDueCurrency2)); event.setLabel(formatTotals(totalDueCurrency1, totalDueCurrency2));
event.getData().setItemValue("description", "Total invoices in due"); event.setDescription("Total invoices in due");
event.getWorkitem().setItemValue("invoices.total.due", countDue); event.getWorkitem().setItemValue("invoices.total.due", event.getValue());
event.getWorkitem().setItemValue("link", link); event.setLink(link);
} }
if ("analytic.invoices.count.dunning".equals(event.getKey())) { if ("analytic.invoices.count.dunning".equals(event.getKey())) {
event.getData().setItemValue("value", "" + countDunning); event.setValue("" + countDunning);
event.getData().setItemValue("label", formatTotals(totalDunningCurrency1, totalDunningCurrency2)); event.setLabel(formatTotals(totalDunningCurrency1, totalDunningCurrency2));
event.getData().setItemValue("description", "Total invoices in dunning"); event.setDescription("Total invoices in dunning");
event.getWorkitem().setItemValue("invoices.total.dunning", countDunning); event.getWorkitem().setItemValue("invoices.total.dunning", event.getValue());
event.getWorkitem().setItemValue("link", link); event.setLink(link);
} }
if ("analytic.payment.avg.due".equals(event.getKey())) { if ("analytic.payment.avg.due".equals(event.getKey())) {
event.getData().setItemValue("value", "" + averagePaymentDue); event.setValue("" + averagePaymentDue);
event.getData().setItemValue("label", "days"); event.setLabel("days");
event.getData().setItemValue("description", "Average terms of credit in the last 12 months."); event.setDescription("Average terms of credit in the last 12 months.");
event.getWorkitem().setItemValue("payment.avg.due", averagePaymentDue); event.getWorkitem().setItemValue("payment.avg.due", event.getValue());
event.getWorkitem().setItemValue("link", link); event.setLink(link);
} }
if ("analytic.payment.avg.days".equals(event.getKey())) { if ("analytic.payment.avg.days".equals(event.getKey())) {
event.getData().setItemValue("value", "" + averagePaymentDays); event.setValue("" + averagePaymentDays);
event.getData().setItemValue("label", "days"); event.setLabel("days");
event.getData().setItemValue("description", "Average duration for payment during the last 12 months."); event.setDescription("Average duration for payment during the last 12 months.");
event.getWorkitem().setItemValue("payment.avg.days", averagePaymentDays); event.getWorkitem().setItemValue("payment.avg.days", event.getValue());
event.getWorkitem().setItemValue("link", link); event.setLink(link);
} }
if ("analytic.invoices.trend".equals(event.getKey())) { if ("analytic.invoices.trend".equals(event.getKey())) {
event.getData().setItemValue("value", chartData); event.setValue(chartData);
event.getData().setItemValue("label", "Payment duration in days"); event.setLabel("Payment duration in days");
event.getData().setItemValue("description", "Payment practice by week"); event.setDescription("Payment practice by week");
} }
} }

View file

@ -100,39 +100,34 @@ public class AGLAnalyticControllerOPListe implements Serializable {
+ "&spaceref=" + departmentID; + "&spaceref=" + departmentID;
} }
if ("analytic.invoices.count.all".equals(event.getKey())) { if ("analytic.invoices.count.all".equals(event.getKey())) {
event.getData().setItemValue("value", "" + countAll); event.setValue("" + countAll);
event.getData().setItemValue("label", resourceBundleHandler.findMessage("oplist.invoices")); event.setLabel(resourceBundleHandler.findMessage("oplist.invoices"));
event.getData().setItemValue("description", event.setDescription(resourceBundleHandler.findMessage("oplist.invoices.description.all"));
resourceBundleHandler.findMessage("oplist.invoices.description.all")); event.getWorkitem().setItemValue("invoices.total", event.getValue());
event.getWorkitem().setItemValue("invoices.total", countAll); event.setLink(link);
event.getWorkitem().setItemValue("link", link);
} }
if ("analytic.invoices.count.open".equals(event.getKey())) { if ("analytic.invoices.count.open".equals(event.getKey())) {
event.getData().setItemValue("value", "" + (countOpen)); event.setValue("" + (countOpen));
event.getData().setItemValue("label", resourceBundleHandler.findMessage("oplist.invoices")); event.setLabel(resourceBundleHandler.findMessage("oplist.invoices"));
event.getData().setItemValue("description", event.setDescription(resourceBundleHandler.findMessage("oplist.invoices.description.open"));
resourceBundleHandler.findMessage("oplist.invoices.description.open")); event.getWorkitem().setItemValue("invoices.total.open", event.getValue());
event.getWorkitem().setItemValue("invoices.total.open", countOpen); event.setLink(link);
event.getWorkitem().setItemValue("link", link);
} }
if ("analytic.invoices.count.due".equals(event.getKey())) { if ("analytic.invoices.count.due".equals(event.getKey())) {
event.getData().setItemValue("value", "" + countDue); event.setValue("" + countDue);
event.getData().setItemValue("label", resourceBundleHandler.findMessage("oplist.invoices")); event.setLabel(resourceBundleHandler.findMessage("oplist.invoices"));
event.getData().setItemValue("description", event.setDescription(resourceBundleHandler.findMessage("oplist.invoices.description.due"));
resourceBundleHandler.findMessage("oplist.invoices.description.due")); event.getWorkitem().setItemValue("invoices.total.due", event.getValue());
event.getWorkitem().setItemValue("invoices.total.due", countDue); event.setLink(link);
event.getWorkitem().setItemValue("link", link);
} }
if ("analytic.invoices.count.dunning".equals(event.getKey())) { if ("analytic.invoices.count.dunning".equals(event.getKey())) {
event.getData().setItemValue("value", "" + countDunning); event.setValue("" + countDunning);
event.getData().setItemValue("label", resourceBundleHandler.findMessage("oplist.invoices")); event.setLabel(resourceBundleHandler.findMessage("oplist.invoices"));
event.getData().setItemValue("description", event.setDescription(resourceBundleHandler.findMessage("oplist.invoices.description.dunning"));
resourceBundleHandler.findMessage("oplist.invoices.description.dunning")); event.getWorkitem().setItemValue("invoices.total.dunning", event.getValue());
event.getWorkitem().setItemValue("invoices.total.dunning", countDunning); event.setLink(link);
event.getWorkitem().setItemValue("link", link);
} }
} }

View file

@ -69,57 +69,53 @@ public class AGLAnalyticControllerSteuer implements Serializable {
link = link + "?processref=" + process.getUniqueID() + "&workflowgroup=Steuerbescheid"; link = link + "?processref=" + process.getUniqueID() + "&workflowgroup=Steuerbescheid";
} }
if ("analytic.steuer.eust".equals(event.getKey())) { if ("analytic.steuer.eust".equals(event.getKey())) {
Object eustTotal = computeSteuerbescheideEUST(); event.setValue(computeSteuerbescheideEUST());
event.getData().setItemValue("value", eustTotal); event.setLabel("EUR");
event.getData().setItemValue("label", "EUR"); event.setDescription("Gesamt Einfuhrumsatzsteuer (EUSt)");
event.getData().setItemValue("description", "Gesamt Einfuhrumsatzsteuer (EUSt)"); event.getWorkitem().setItemValue("eust.total", event.getValue());
event.getWorkitem().setItemValue("eust.total", eustTotal); event.setLink(link);
event.getWorkitem().setItemValue("link", link);
} }
if ("analytic.steuer.zoll".equals(event.getKey())) { if ("analytic.steuer.zoll".equals(event.getKey())) {
event.getData().setItemValue("value", computeSteuerbescheideZoll()); event.setValue(computeSteuerbescheideZoll());
event.getData().setItemValue("label", "EUR"); event.setLabel("EUR");
event.getData().setItemValue("description", "Gesamt Zölle (ZOLLEU)"); event.setDescription("Gesamt Zölle (ZOLLEU)");
event.getWorkitem().setItemValue("link", link); event.setLink(link);
} }
if ("analytic.steuer.total".equals(event.getKey())) { if ("analytic.steuer.total".equals(event.getKey())) {
event.getData().setItemValue("value", computeSteuerbescheideTotal()); event.setValue(computeSteuerbescheideTotal());
event.getData().setItemValue("label", "EUR"); event.setLabel("EUR");
event.getData().setItemValue("description", "Alle Steuerbescheide die noch nicht abgerechnet wurden."); event.setDescription("Alle Steuerbescheide die noch nicht abgerechnet wurden.");
event.getWorkitem().setItemValue("link", link); event.setLink(link);
} }
if ("analytic.steuer.saldo".equals(event.getKey())) { if ("analytic.steuer.saldo".equals(event.getKey())) {
event.getData().setItemValue("value", computeSteuerbescheideSaldo()); event.setValue(computeSteuerbescheideSaldo());
event.getData().setItemValue("label", "EUR"); event.setLabel("EUR");
event.getData().setItemValue("description", event.setDescription("Saldo aller Steuerbescheide die noch nicht abgerechnet wurden.");
"Saldo aller Steuerbescheide die noch nicht abgerechnet wurden."); event.setLink(link);
event.getWorkitem().setItemValue("link", link);
} }
if ("analytic.steuer.due".equals(event.getKey())) { if ("analytic.steuer.due".equals(event.getKey())) {
event.getData().setItemValue("value", computeSteuerbescheideSaldoDue()); event.setValue(computeSteuerbescheideSaldoDue());
event.getData().setItemValue("label", "EUR"); event.setLabel("EUR");
event.getData().setItemValue("description", event.setDescription("Saldo aller überfälligen Steuerbescheide die noch nicht abgerechnet wurden.");
"Saldo aller überfälligen Steuerbescheide die noch nicht abgerechnet wurden."); // event.setLink(link + "&task=Überfällig");
// event.getWorkitem().setItemValue("link", link + "&task=Überfällig"); event.setLink(link + "&task=1200");
event.getWorkitem().setItemValue("link", link + "&task=1200");
} }
// Charts // Charts
if ("analytic.steuer.trend".equals(event.getKey())) { if ("analytic.steuer.trend".equals(event.getKey())) {
event.getData().setItemValue("value", accumulateSteuerbescheideByWeek()); event.setValue(accumulateSteuerbescheideByWeek());
event.getData().setItemValue("label", "Zoll & EUST"); event.setLabel("Zoll & EUST");
event.getData().setItemValue("description", "Fälligkeiten nach KW"); event.setDescription("Fälligkeiten nach KW");
} }
if ("analytic.steuer.trend.abteilung".equals(event.getKey())) { if ("analytic.steuer.trend.abteilung".equals(event.getKey())) {
event.getData().setItemValue("value", accumulateSteuerbescheideAbteilungByWeek()); event.setValue(accumulateSteuerbescheideAbteilungByWeek());
event.getData().setItemValue("label", "Nach Abteilungen"); event.setLabel("Nach Abteilungen");
event.getData().setItemValue("description", "Offene Salden nach KW pro Abteilung"); event.setDescription("Offene Salden nach KW pro Abteilung");
} }
} }

View file

@ -25,7 +25,7 @@ import org.imixs.workflow.exceptions.PluginException;
import org.imixs.workflow.exceptions.QueryException; import org.imixs.workflow.exceptions.QueryException;
import org.imixs.workflow.office.config.ConfigService; import org.imixs.workflow.office.config.ConfigService;
import org.imixs.workflow.poi.POIFindReplaceAdapter; import org.imixs.workflow.poi.POIFindReplaceAdapter;
import org.imixs.workflow.poi.XSSFUtil; import org.imixs.workflow.poi.POIUtil;
import org.imixs.workflow.util.XMLParser; import org.imixs.workflow.util.XMLParser;
import jakarta.inject.Inject; import jakarta.inject.Inject;
@ -174,7 +174,7 @@ public class AGLAnalyticExcelAdapterDebitor extends POIFindReplaceAdapter {
int newColumns = (currencyList.size() - 1) * 2; int newColumns = (currencyList.size() - 1) * 2;
for (int i = 0; i < newColumns; i++) { for (int i = 0; i < newColumns; i++) {
logger.info(".. add currency column..."); logger.info(".. add currency column...");
XSSFUtil.insertColumn(sheet, 6, 8 + i); POIUtil.insertColumn(sheet, 6, 8 + i);
} }
// Beschriftungen eintragen // Beschriftungen eintragen
@ -247,7 +247,7 @@ public class AGLAnalyticExcelAdapterDebitor extends POIFindReplaceAdapter {
// jetzt füge alle Rechnungen an. // jetzt füge alle Rechnungen an.
int totalRowCount = invoices.size(); int totalRowCount = invoices.size();
XSSFUtil.insertRows(sheet, "A11", totalRowCount - 0); POIUtil.insertRows(sheet, "A11", totalRowCount - 0);
for (ItemCollection invoice : invoices) { for (ItemCollection invoice : invoices) {
logger.fine("......add invoice " + invoice.getUniqueID()); logger.fine("......add invoice " + invoice.getUniqueID());
@ -285,8 +285,8 @@ public class AGLAnalyticExcelAdapterDebitor extends POIFindReplaceAdapter {
// setze Summen Formeln // setze Summen Formeln
for (int column = 6; column < currencyList.size() * 2 + 6; column++) { for (int column = 6; column < currencyList.size() * 2 + 6; column++) {
XSSFCell cell = sheet.getRow(totalRowCount + 11).getCell(column); // G11 XSSFCell cell = sheet.getRow(totalRowCount + 11).getCell(column); // G11
String cellRefFrom = XSSFUtil.getCellReference(column, 10); String cellRefFrom = POIUtil.getCellReference(column, 10);
String cellRefTo = XSSFUtil.getCellReference(column, totalRowCount + 10); String cellRefTo = POIUtil.getCellReference(column, totalRowCount + 10);
String formula = "SUM(" + cellRefFrom + ":" + cellRefTo + ")"; String formula = "SUM(" + cellRefFrom + ":" + cellRefTo + ")";
cell.setCellFormula(formula); cell.setCellFormula(formula);
} }

View file

@ -26,7 +26,7 @@ import org.imixs.workflow.exceptions.PluginException;
import org.imixs.workflow.exceptions.QueryException; import org.imixs.workflow.exceptions.QueryException;
import org.imixs.workflow.office.config.ConfigService; import org.imixs.workflow.office.config.ConfigService;
import org.imixs.workflow.poi.POIFindReplaceAdapter; import org.imixs.workflow.poi.POIFindReplaceAdapter;
import org.imixs.workflow.poi.XSSFUtil; import org.imixs.workflow.poi.POIUtil;
import org.imixs.workflow.util.XMLParser; import org.imixs.workflow.util.XMLParser;
import jakarta.inject.Inject; import jakarta.inject.Inject;
@ -179,7 +179,7 @@ public class OPListExportAdapter extends POIFindReplaceAdapter {
int newColumns = (currencyList.size() - 1) * 1; int newColumns = (currencyList.size() - 1) * 1;
for (int i = 0; i < newColumns; i++) { for (int i = 0; i < newColumns; i++) {
logger.fine(".. add currency column..."); logger.fine(".. add currency column...");
XSSFUtil.insertColumn(sheet, 5, 6 + i); POIUtil.insertColumn(sheet, 5, 6 + i);
} }
// Beschriftungen eintragen // Beschriftungen eintragen

View file

@ -37,7 +37,7 @@ import org.imixs.workflow.exceptions.PluginException;
import org.imixs.workflow.exceptions.QueryException; import org.imixs.workflow.exceptions.QueryException;
import org.imixs.workflow.office.config.ConfigService; import org.imixs.workflow.office.config.ConfigService;
import org.imixs.workflow.poi.POIFindReplaceAdapter; import org.imixs.workflow.poi.POIFindReplaceAdapter;
import org.imixs.workflow.poi.XSSFUtil; import org.imixs.workflow.poi.POIUtil;
import org.imixs.workflow.util.XMLParser; import org.imixs.workflow.util.XMLParser;
import jakarta.inject.Inject; import jakarta.inject.Inject;
@ -199,13 +199,13 @@ public class OPListExportAdapterByWeek extends POIFindReplaceAdapter {
int newColumns = (currencyList.size() * (spaces.size())) - 1; int newColumns = (currencyList.size() * (spaces.size())) - 1;
for (int i = 0; i < newColumns; i++) { for (int i = 0; i < newColumns; i++) {
logger.fine(".. add currency column..."); logger.fine(".. add currency column...");
XSSFUtil.insertColumn(sheet, 1, 2 + i); POIUtil.insertColumn(sheet, 1, 2 + i);
} }
// Total spalten einfuegen // Total spalten einfuegen
for (int i = 0; i < currencyList.size() - 1; i++) { for (int i = 0; i < currencyList.size() - 1; i++) {
logger.fine(".. add total column..."); logger.fine(".. add total column...");
XSSFUtil.insertColumn(sheet, 2 + newColumns, 3 + newColumns + i); POIUtil.insertColumn(sheet, 2 + newColumns, 3 + newColumns + i);
} }
newColumns = newColumns + currencyList.size(); newColumns = newColumns + currencyList.size();

View file

@ -22,7 +22,6 @@ import org.imixs.workflow.exceptions.AdapterException;
import org.imixs.workflow.exceptions.PluginException; import org.imixs.workflow.exceptions.PluginException;
import org.imixs.workflow.exceptions.QueryException; import org.imixs.workflow.exceptions.QueryException;
import org.imixs.workflow.poi.POIFindReplaceAdapter; import org.imixs.workflow.poi.POIFindReplaceAdapter;
import org.imixs.workflow.poi.XSSFUtil;
import jakarta.inject.Inject; import jakarta.inject.Inject;
@ -172,7 +171,7 @@ public class ZahlungsavisExportAdapter extends POIFindReplaceAdapter {
sheet.shiftRows(referenceRowPos, lastRow + invoiceIDs.size(), -1, true, true); sheet.shiftRows(referenceRowPos, lastRow + invoiceIDs.size(), -1, true, true);
// finally update the total formula... // finally update the total formula...
XSSFUtil.evalXSSFSheet(doc, sheet, "TOTAL"); evalXSSFSheet(doc, sheet, "TOTAL");
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
// write back the file // write back the file

View file

@ -19,7 +19,7 @@ import org.imixs.workflow.exceptions.PluginException;
import org.imixs.workflow.exceptions.QueryException; import org.imixs.workflow.exceptions.QueryException;
import org.imixs.workflow.office.config.ConfigService; import org.imixs.workflow.office.config.ConfigService;
import org.imixs.workflow.poi.POIFindReplaceAdapter; import org.imixs.workflow.poi.POIFindReplaceAdapter;
import org.imixs.workflow.poi.XSSFUtil; import org.imixs.workflow.poi.POIUtil;
import com.alexanderlogistics.InvoiceService; import com.alexanderlogistics.InvoiceService;
@ -189,7 +189,7 @@ public class AGLDataViewDebitorAdapter extends POIFindReplaceAdapter {
int newColumns = (currencyList.size() - 1) * 2; int newColumns = (currencyList.size() - 1) * 2;
for (int i = 0; i < newColumns; i++) { for (int i = 0; i < newColumns; i++) {
logger.info(".. add currency column..."); logger.info(".. add currency column...");
XSSFUtil.insertColumn(sheet, 6, 8 + i); POIUtil.insertColumn(sheet, 6, 8 + i);
} }
// Beschriftungen eintragen // Beschriftungen eintragen
@ -259,7 +259,7 @@ public class AGLDataViewDebitorAdapter extends POIFindReplaceAdapter {
// jetzt füge alle Rechnungen an. // jetzt füge alle Rechnungen an.
int totalRowCount = invoices.size(); int totalRowCount = invoices.size();
XSSFUtil.insertRows(sheet, "A11", totalRowCount - 0); POIUtil.insertRows(sheet, "A11", totalRowCount - 0);
for (ItemCollection invoice : invoices) { for (ItemCollection invoice : invoices) {
logger.fine("......add invoice " + invoice.getUniqueID()); logger.fine("......add invoice " + invoice.getUniqueID());
@ -297,8 +297,8 @@ public class AGLDataViewDebitorAdapter extends POIFindReplaceAdapter {
// setze Summen Formeln // setze Summen Formeln
for (int column = 6; column < currencyList.size() * 2 + 6; column++) { for (int column = 6; column < currencyList.size() * 2 + 6; column++) {
XSSFCell cell = sheet.getRow(totalRowCount + 11).getCell(column); // G11 XSSFCell cell = sheet.getRow(totalRowCount + 11).getCell(column); // G11
String cellRefFrom = XSSFUtil.getCellReference(column, 10); String cellRefFrom = POIUtil.getCellReference(column, 10);
String cellRefTo = XSSFUtil.getCellReference(column, totalRowCount + 10); String cellRefTo = POIUtil.getCellReference(column, totalRowCount + 10);
String formula = "SUM(" + cellRefFrom + ":" + cellRefTo + ")"; String formula = "SUM(" + cellRefFrom + ":" + cellRefTo + ")";
cell.setCellFormula(formula); cell.setCellFormula(formula);
} }

View file

@ -22,7 +22,6 @@ import org.imixs.workflow.exceptions.AdapterException;
import org.imixs.workflow.exceptions.PluginException; import org.imixs.workflow.exceptions.PluginException;
import org.imixs.workflow.exceptions.QueryException; import org.imixs.workflow.exceptions.QueryException;
import org.imixs.workflow.poi.POIFindReplaceAdapter; import org.imixs.workflow.poi.POIFindReplaceAdapter;
import org.imixs.workflow.poi.XSSFUtil;
import jakarta.inject.Inject; import jakarta.inject.Inject;
@ -165,7 +164,7 @@ public class InkassoExportAdapter extends POIFindReplaceAdapter {
sheet.shiftRows(referenceRowPos, lastRow + invoiceIDs.size(), -1, true, true); sheet.shiftRows(referenceRowPos, lastRow + invoiceIDs.size(), -1, true, true);
// finally update the total formula... // finally update the total formula...
XSSFUtil.evalXSSFSheet(doc, sheet, "TOTAL"); evalXSSFSheet(doc, sheet, "TOTAL");
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
// write back the file // write back the file

View file

@ -9,14 +9,13 @@ import java.util.Map;
import java.util.logging.Logger; import java.util.logging.Logger;
import org.imixs.workflow.ItemCollection; import org.imixs.workflow.ItemCollection;
import org.imixs.workflow.Model;
import org.imixs.workflow.SignalAdapter; import org.imixs.workflow.SignalAdapter;
import org.imixs.workflow.engine.ModelService; import org.imixs.workflow.engine.ModelService;
import org.imixs.workflow.engine.WorkflowService; import org.imixs.workflow.engine.WorkflowService;
import org.imixs.workflow.exceptions.AdapterException; import org.imixs.workflow.exceptions.AdapterException;
import org.imixs.workflow.exceptions.ModelException; import org.imixs.workflow.exceptions.ModelException;
import org.imixs.workflow.exceptions.PluginException; import org.imixs.workflow.exceptions.PluginException;
import org.imixs.workflow.office.model.SharedModelManager;
import org.openbpmn.bpmn.BPMNModel;
import com.alexanderlogistics.InvoiceUtil; import com.alexanderlogistics.InvoiceUtil;
@ -51,9 +50,6 @@ public class MahnlaufExecuteAdapter implements SignalAdapter {
@Inject @Inject
MahnlaufService mahnlaufService; MahnlaufService mahnlaufService;
@Inject
SharedModelManager sharedModelManager;
/** /**
* This method finds all invices ($workitemref) and tirgges event 300 * This method finds all invices ($workitemref) and tirgges event 300
* *
@ -100,15 +96,10 @@ public class MahnlaufExecuteAdapter implements SignalAdapter {
if (isInDue(invoice)) { if (isInDue(invoice)) {
try { try {
// first fetch the event of the invoice to be processed // first fetch the event of the invoice to be processed
Model invoiceModel;
BPMNModel bpmnModel = modelService.getBPMNModel(invoice.getModelVersion()); invoiceModel = this.modelService.getModel(invoice.getModelVersion());
ItemCollection invoiceEvent = sharedModelManager.getModelManager().findEventByID(bpmnModel, ItemCollection invoiceEvent = invoiceModel.getEvent(invoice.getTaskID(),
invoice.getTaskID(), MahnlaufService.EVENT_MAHNLAUF_EXECUTE); MahnlaufService.EVENT_MAHNLAUF_EXECUTE);
// Model invoiceModel;
// invoiceModel = this.modelService.getModel(invoice.getModelVersion());
// ItemCollection invoiceEvent = invoiceModel.getEvent(invoice.getTaskID(),
// MahnlaufService.EVENT_MAHNLAUF_EXECUTE);
if (invoiceEvent != null) { if (invoiceEvent != null) {
ItemCollection eventDunningConfig = this.workflowService.evalWorkflowResult(invoiceEvent, ItemCollection eventDunningConfig = this.workflowService.evalWorkflowResult(invoiceEvent,
"dunning", invoice); "dunning", invoice);
@ -134,24 +125,24 @@ public class MahnlaufExecuteAdapter implements SignalAdapter {
} }
switch (invoice.getTaskID()) { switch (invoice.getTaskID()) {
case 5200: case 5200:
case 5201: case 5201:
if (dunningLevel < 1) if (dunningLevel < 1)
dunningLevel = 1; dunningLevel = 1;
break; break;
case 5210: case 5210:
case 5211: case 5211:
if (dunningLevel < 2) if (dunningLevel < 2)
dunningLevel = 2; dunningLevel = 2;
break; break;
case 5220: case 5220:
if (dunningLevel < 3) if (dunningLevel < 3)
dunningLevel = 3; dunningLevel = 3;
break; break;
default: default:
if (dunningLevel < 1) if (dunningLevel < 1)
dunningLevel = 1; dunningLevel = 1;
break; break;
} }
// create a workitem stub for the mail message // create a workitem stub for the mail message
@ -188,18 +179,18 @@ public class MahnlaufExecuteAdapter implements SignalAdapter {
// compute subject // compute subject
switch (dunningLevel) { switch (dunningLevel) {
case 2: case 2:
mahnLaufWorkitem.setItemValue("mail.subject_de", "2. MAHNUNG"); mahnLaufWorkitem.setItemValue("mail.subject_de", "2. MAHNUNG");
mahnLaufWorkitem.setItemValue("mail.subject_en", "2. REMINDER"); mahnLaufWorkitem.setItemValue("mail.subject_en", "2. REMINDER");
break; break;
case 3: case 3:
mahnLaufWorkitem.setItemValue("mail.subject_de", "LETZTE AUSSERGERICHTLICHE MAHNUNG"); mahnLaufWorkitem.setItemValue("mail.subject_de", "LETZTE AUSSERGERICHTLICHE MAHNUNG");
mahnLaufWorkitem.setItemValue("mail.subject_en", "LAST REMINDER"); mahnLaufWorkitem.setItemValue("mail.subject_en", "LAST REMINDER");
break; break;
default: default:
mahnLaufWorkitem.setItemValue("mail.subject_de", "1. MAHNUNG"); mahnLaufWorkitem.setItemValue("mail.subject_de", "1. MAHNUNG");
mahnLaufWorkitem.setItemValue("mail.subject_en", "1. REMINDER"); mahnLaufWorkitem.setItemValue("mail.subject_en", "1. REMINDER");
break; break;
} }
// Verify the dbtr.mail item (split into multi value) // Verify the dbtr.mail item (split into multi value)

View file

@ -5,6 +5,7 @@ import java.util.List;
import java.util.logging.Logger; import java.util.logging.Logger;
import org.imixs.workflow.ItemCollection; import org.imixs.workflow.ItemCollection;
import org.imixs.workflow.Model;
import org.imixs.workflow.SignalAdapter; import org.imixs.workflow.SignalAdapter;
import org.imixs.workflow.WorkflowKernel; import org.imixs.workflow.WorkflowKernel;
import org.imixs.workflow.engine.ModelService; import org.imixs.workflow.engine.ModelService;
@ -13,9 +14,7 @@ import org.imixs.workflow.exceptions.AdapterException;
import org.imixs.workflow.exceptions.ModelException; import org.imixs.workflow.exceptions.ModelException;
import org.imixs.workflow.exceptions.PluginException; import org.imixs.workflow.exceptions.PluginException;
import org.imixs.workflow.exceptions.QueryException; import org.imixs.workflow.exceptions.QueryException;
import org.imixs.workflow.office.model.SharedModelManager;
import org.imixs.workflow.sepa.services.SepaWorkflowService; import org.imixs.workflow.sepa.services.SepaWorkflowService;
import org.openbpmn.bpmn.BPMNModel;
import com.alexanderlogistics.BusinessPartnerService; import com.alexanderlogistics.BusinessPartnerService;
import com.alexanderlogistics.InvoiceUtil; import com.alexanderlogistics.InvoiceUtil;
@ -51,9 +50,6 @@ public class MahnlaufRefAddAdapter implements SignalAdapter {
@Inject @Inject
BusinessPartnerService businessPartnerService; BusinessPartnerService businessPartnerService;
@Inject
SharedModelManager sharedModelManager;
/** /**
* This method finds or create the Mahnlauf and adds a reference ($workitemref) * This method finds or create the Mahnlauf and adds a reference ($workitemref)
* to the current invoice. * to the current invoice.
@ -171,11 +167,8 @@ public class MahnlaufRefAddAdapter implements SignalAdapter {
mahnlaufWorkitem.setItemValue("invoice.language", invoice.getItemValue("invoice.language")); mahnlaufWorkitem.setItemValue("invoice.language", invoice.getItemValue("invoice.language"));
// set workflow group name from the Task Element to identify document in xslt // set workflow group name from the Task Element to identify document in xslt
BPMNModel bpmnModel = modelService.getBPMNModel(modelVersion); Model model = modelService.getModel(modelVersion);
ItemCollection task = sharedModelManager.getModelManager().findTaskByID(bpmnModel, taskID); ItemCollection task = model.getTask(taskID);
// Model model = modelService.getModel(modelVersion);
// ItemCollection task = model.getTask(taskID);
String modelTaskGroupName = task.getItemValueString("txtworkflowgroup"); // DO NOT CHANGE! String modelTaskGroupName = task.getItemValueString("txtworkflowgroup"); // DO NOT CHANGE!
mahnlaufWorkitem.setItemValue(WorkflowKernel.WORKFLOWGROUP, modelTaskGroupName); mahnlaufWorkitem.setItemValue(WorkflowKernel.WORKFLOWGROUP, modelTaskGroupName);

View file

@ -129,11 +129,10 @@ public class MahnlaufService {
* @param workitem * @param workitem
* @param spacePosMappings * @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 // Jezt noch das Space mapping
// dazu kucken wir in alle spaces den config wert 'pos.mapping' // dazu kucken wir in alle spaces den config wert 'pos.mapping'
String text = positionNumber; // workitem.getItemValueString("invoice.text"); String text = workitem.getItemValueString("invoice.text");
if (!text.isEmpty()) { if (!text.isEmpty()) {
boolean found = false; boolean found = false;
for (Map.Entry<String, List<String>> entry : spacePosMappings.entrySet()) { for (Map.Entry<String, List<String>> entry : spacePosMappings.entrySet()) {

View file

@ -428,8 +428,7 @@ public class CargosoftXMLEAkteImportService {
readXMLRows(doc, workitem); readXMLRows(doc, workitem);
// Jetzt noch das Space mapping // Jetzt noch das Space mapping
workitem.setItemValue("invoice.text", workitem.getItemValueString("invoice.positions")); 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. // Finally we attache the pdf file and the XML content to the workitem.
attacheFiles(doc, workitem); attacheFiles(doc, workitem);

View file

@ -482,8 +482,7 @@ public class CargosoftXMLInvoiceImportService {
resolveATCNumbers(doc, workitem); resolveATCNumbers(doc, workitem);
// Jetzt noch das Space mapping // Jetzt noch das Space mapping
mahnlaufService.mapInvoiceTextToSpace(workitem, spacePosMappings, mahnlaufService.mapInvoiceTextToSpace(workitem, spacePosMappings);
workitem.getItemValueString("invoice.text"));
// Rückstellungen ignorieren // Rückstellungen ignorieren
if (isRueckStellung(workitem)) { if (isRueckStellung(workitem)) {

View file

@ -36,7 +36,7 @@ import jakarta.inject.Named;
/** /**
* Der ZohoController ist für das Admin Interface um Access Tokens zu erzeugen. * Der ZohoController ist für das Admin Interface um Access Tokens zu erzeugen.
* *
* @see zoho.xhml * @see admin/zoho.xhml
* *
* @author rsoika * @author rsoika
* *

Some files were not shown because too many files have changed in this diff Show more