diff --git a/backup-test/README.md b/backup-test/README.md deleted file mode 100644 index 949b4a1..0000000 --- a/backup-test/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# AGL - Local Backup Service - -Run service with - - $ docker compose up diff --git a/backup/README.md b/backup/README.md new file mode 100644 index 0000000..f850a97 --- /dev/null +++ b/backup/README.md @@ -0,0 +1,204 @@ +# 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://.office-workflow.de/api/" + WORKFLOW_SERVICE_USER: "" + WORKFLOW_SERVICE_PASSWORD: "" + WORKFLOW_SERVICE_AUTHMETHOD: "form" + BACKUP_FTP_HOST: "" + BACKUP_FTP_PATH: "" + BACKUP_FTP_PORT: "21" + BACKUP_FTP_USER: "" + BACKUP_FTP_PASSWORD: "" + BACKUP_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. \ No newline at end of file diff --git a/backup-test/docker-compose.yaml b/backup/docker-compose.yaml similarity index 100% rename from backup-test/docker-compose.yaml rename to backup/docker-compose.yaml diff --git a/cargosoft-migration/AGL_ADRESSEN_GLEICHENUMMER_VERSCHIEDENEFELDER.xls b/cargosoft-migration/AGL_ADRESSEN_GLEICHENUMMER_VERSCHIEDENEFELDER.xls deleted file mode 100644 index 3667504..0000000 Binary files a/cargosoft-migration/AGL_ADRESSEN_GLEICHENUMMER_VERSCHIEDENEFELDER.xls and /dev/null differ diff --git a/doc/FTP.md b/doc/FTP.md deleted file mode 100644 index 46356ce..0000000 --- a/doc/FTP.md +++ /dev/null @@ -1,99 +0,0 @@ -# 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 diff --git a/doc/HETZNER_SUPPORT/2025-07-28.md b/doc/HETZNER_SUPPORT/2025-07-28.md deleted file mode 100644 index 692622e..0000000 --- a/doc/HETZNER_SUPPORT/2025-07-28.md +++ /dev/null @@ -1,49 +0,0 @@ -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 diff --git a/doc/KSeF/FEEDBACK.md b/doc/KSeF/FEEDBACK.md deleted file mode 100644 index c35ad33..0000000 --- a/doc/KSeF/FEEDBACK.md +++ /dev/null @@ -1,25 +0,0 @@ -# Feedback zum PDF FIle - -| Feld / Komponente | Status | -| :------------------------------------------------------- | :----------------------- | -| **1. Podmiot 1 — Daten des Rechnungsausstellers (AGLP)** | | -| `` | **FIXED** | -| `` | **FIXED** | -| `PL` | **FIXED** | -| **2. Podmiot 2 — Daten des Rechnungsempfängers** | | -| ` ` | **ALREADY IMPLEMENTED** | -| EU-Rechnungsempfänger | **UNCLEAR!** | -| Anschrift des Rechnungsempfängers | **CARGOSOFT TOPIC** | -| **3. Abschnitt — Rechnungskopf** | **FIXED** | -| `` | **FIXED** | -| `` | **FIXED** | -| **4. Rechnungspositionen — Pflichtfelder** | | -| `` | **FIXED** | -| `` | **IGNORED - NOT FIXED!** | -| `` | **????** | -| `` | **????** | -| **5. Rechnungssummen — / ** | | -| _Noch keine Details_ | — | -| **6. Zahlung — ** | | -| `` | **FIXED** | -| `` | **FIXED** | diff --git a/doc/KSeF/SECRETS.md b/doc/KSeF/SECRETS.md deleted file mode 100644 index 9a78aa4..0000000 --- a/doc/KSeF/SECRETS.md +++ /dev/null @@ -1,3 +0,0 @@ -NIP = "9552521552" - -TOKEN = "20251113-EC-2751AC3000-5C5466924B-62|nip-9552521552|fc0c95d020dc45d4af491fb0aa755f3f3f674b33ecbf4250a88ea6e36fa8340b diff --git a/doc/MAIL.md b/doc/MAIL.md deleted file mode 100644 index e1a13c6..0000000 --- a/doc/MAIL.md +++ /dev/null @@ -1,9 +0,0 @@ -# Mail - -Testen von Mailing kann man über - -https://www.mail-tester.com/ - -Kutzner Mail gateway - -PW: 26W%R#Xe4^Z2Gyz1 diff --git a/doc/id_rsa_cargosoft.pub b/doc/id_rsa_cargosoft.pub deleted file mode 100644 index 1c83088..0000000 --- a/doc/id_rsa_cargosoft.pub +++ /dev/null @@ -1 +0,0 @@ -ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAnGiu0PUBl+G++vHrGP5wDRit4mXF4hXTyzUem3BPADaV0DUuYN1Fx5RpDl2F8mhnqDYcyCTBzLTJ+0jFqq1pzoJW5ZWZ+hSChabVCV4m8UkFkhbRmjxNkPx26ZMhfTD1mDqgCKQ+bbt1mi04UZppDKBr+9ZrMG3d0odHblEJHixtJ7Hqr9vvXXbvNv4E9B/9dlW57oyEUk/vKmwuLyGAsDjxjfB3W+Faab+gev8VDwJxdbD90HX0O2Az05wy9EC7M3pujcawsHdaFXgFFRRwlVuUkX3z9hp1Uekqg0N81hty7/i8GiZ9/m3Y6hIA5eRM4ZpDQFEF8SY9TLSzDehNoQ== seesped@cargodb diff --git a/doc/zoho/SECRETS.md b/doc/zoho/SECRETS.md deleted file mode 100644 index f35c1bd..0000000 --- a/doc/zoho/SECRETS.md +++ /dev/null @@ -1,78 +0,0 @@ -# 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 diff --git a/src/main/java/com/alexanderlogistics/AGLAIInvoiceAdapter.java b/src/main/java/com/alexanderlogistics/AGLAIInvoiceAdapter.java index f2e6c23..097a69c 100644 --- a/src/main/java/com/alexanderlogistics/AGLAIInvoiceAdapter.java +++ b/src/main/java/com/alexanderlogistics/AGLAIInvoiceAdapter.java @@ -133,7 +133,7 @@ public class AGLAIInvoiceAdapter implements SignalAdapter { 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")); + workitem.setItemValue("partner.name", businessPartner.getItemValueString("cdtr.name")); return; } } catch (QueryException e) { diff --git a/src/test/java/com/alexanderlogistics/EnvLoader.java b/src/test/java/com/alexanderlogistics/EnvLoader.java new file mode 100644 index 0000000..438b0a4 --- /dev/null +++ b/src/test/java/com/alexanderlogistics/EnvLoader.java @@ -0,0 +1,32 @@ +package com.alexanderlogistics; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + +/** + * Helper class for junit tests to load secrets + * + * + */ +public class EnvLoader { + private EnvLoader() { + } + + public static void loadIfPresent(Path envFile) throws IOException { + if (!Files.exists(envFile)) { + return; + } + for (String line : Files.readAllLines(envFile)) { + if (line.isBlank() || line.startsWith("#")) { + continue; + } + String[] parts = line.split("=", 2); + if (parts.length == 2) { + // System.setProperty instead of env, since Java env vars are immutable at + // runtime + System.setProperty(parts[0].trim(), parts[1].trim()); + } + } + } +} diff --git a/src/test/java/com/alexanderlogistics/TestIMAPAuhtenticators.java b/src/test/java/com/alexanderlogistics/TestIMAPAuhtenticators.java index 7db555d..0d25482 100644 --- a/src/test/java/com/alexanderlogistics/TestIMAPAuhtenticators.java +++ b/src/test/java/com/alexanderlogistics/TestIMAPAuhtenticators.java @@ -4,6 +4,8 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.fail; +import java.io.IOException; +import java.nio.file.Path; import java.util.Properties; import java.util.logging.Level; import java.util.logging.Logger; @@ -13,6 +15,7 @@ import org.imixs.workflow.ItemCollection; import org.imixs.workflow.importer.DocumentImportService; import org.imixs.workflow.importer.mail.IMAPBasicAuthenticator; import org.imixs.workflow.importer.mail.IMAPOutlookAuthenticator; +import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; @@ -31,7 +34,18 @@ public class TestIMAPAuhtenticators { private final static Logger logger = Logger.getLogger(TestIMAPAuhtenticators.class.getName()); - private final static String secret = "0lG8Q~UigK0f7n-cR8SSiSXhVChkBD3Qm1CqvbID"; + private static String TENANT_ID = ""; + private static String CLIENT_ID = ""; + private static String CLIENT_SECRET = ""; + + @BeforeAll + public static void setUp() throws IOException { + // Loads local .env file + EnvLoader.loadIfPresent(Path.of("src/test/resources/.env")); + TENANT_ID = System.getProperty("TENANT_ID"); + CLIENT_SECRET = System.getProperty("CLIENT_SECRET"); + CLIENT_ID = System.getProperty("CLIENT_ID"); + } /** * Test IMAP connect via OAuth for email address imixs@alexander-logistics.com @@ -47,11 +61,11 @@ public class TestIMAPAuhtenticators { source.setItemValue(DocumentImportService.SOURCE_ITEM_SERVER, "outlook.office365.com"); source.setItemValue(DocumentImportService.SOURCE_ITEM_PORT, "993"); source.setItemValue(DocumentImportService.SOURCE_ITEM_USER, "imixs@alexander-logistics.com"); - source.setItemValue(DocumentImportService.SOURCE_ITEM_PASSWORD, secret); + source.setItemValue(DocumentImportService.SOURCE_ITEM_PASSWORD, CLIENT_SECRET); Properties sourceOptions = new Properties(); - sourceOptions.put("microsoft.tenantid", "51e2f038-0a96-41be-801d-bb4118aa018e"); - sourceOptions.put("microsoft.clientid", "39e9eec5-6939-47dc-9729-3438a9898e63"); + sourceOptions.put("microsoft.tenantid", TENANT_ID); + sourceOptions.put("microsoft.clientid", CLIENT_ID); logger.info("Connect started...."); try { Store store = auth.openMessageStore(source, sourceOptions); @@ -89,11 +103,11 @@ public class TestIMAPAuhtenticators { source.setItemValue(DocumentImportService.SOURCE_ITEM_PORT, "993"); source.setItemValue(DocumentImportService.SOURCE_ITEM_USER, "Imixsbhv@alexander-logistics.com"); - source.setItemValue(DocumentImportService.SOURCE_ITEM_PASSWORD, secret); + source.setItemValue(DocumentImportService.SOURCE_ITEM_PASSWORD, CLIENT_SECRET); Properties sourceOptions = new Properties(); - sourceOptions.put("microsoft.tenantid", "51e2f038-0a96-41be-801d-bb4118aa018e"); - sourceOptions.put("microsoft.clientid", "39e9eec5-6939-47dc-9729-3438a9898e63"); + sourceOptions.put("microsoft.tenantid", TENANT_ID); + sourceOptions.put("microsoft.clientid", CLIENT_ID); logger.info("Connect started...."); try { @@ -131,11 +145,11 @@ public class TestIMAPAuhtenticators { source.setItemValue(DocumentImportService.SOURCE_ITEM_PORT, "993"); source.setItemValue(DocumentImportService.SOURCE_ITEM_USER, "imixspl@alexander-logistics.com"); - source.setItemValue(DocumentImportService.SOURCE_ITEM_PASSWORD, secret); + source.setItemValue(DocumentImportService.SOURCE_ITEM_PASSWORD, CLIENT_SECRET); Properties sourceOptions = new Properties(); - sourceOptions.put("microsoft.tenantid", "51e2f038-0a96-41be-801d-bb4118aa018e"); - sourceOptions.put("microsoft.clientid", "39e9eec5-6939-47dc-9729-3438a9898e63"); + sourceOptions.put("microsoft.tenantid", TENANT_ID); + sourceOptions.put("microsoft.clientid", CLIENT_ID); logger.info("Connect started...."); try { diff --git a/src/test/java/com/alexanderlogistics/TestIMAPOutlookOAuth.java b/src/test/java/com/alexanderlogistics/TestIMAPOutlookOAuth.java index 7c94d10..ca456bd 100644 --- a/src/test/java/com/alexanderlogistics/TestIMAPOutlookOAuth.java +++ b/src/test/java/com/alexanderlogistics/TestIMAPOutlookOAuth.java @@ -8,6 +8,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import java.io.StringWriter; +import java.nio.file.Path; import java.util.Map; import java.util.Properties; @@ -21,6 +22,7 @@ import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicHeader; import org.eclipse.angus.mail.imap.IMAPFolder; import org.imixs.workflow.importer.mail.IMAPImportHelper; +import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; @@ -49,12 +51,18 @@ import jakarta.mail.internet.MimeUtility; */ public class TestIMAPOutlookOAuth { - private static final String TENANT_ID = "51e2f038-0a96-41be-801d-bb4118aa018e"; - private static final String CLIENT_ID = "39e9eec5-6939-47dc-9729-3438a9898e63"; - // private static final String CLIENT_SECRET = - // "A6x8Q~EWVUyt~gfyTHtIJf4ig.F9tajUpEEXMaCL"; + private static String TENANT_ID = ""; + private static String CLIENT_ID = ""; + private static String CLIENT_SECRET = ""; - private static final String CLIENT_SECRET = "0lG8Q~UigK0f7n-cR8SSiSXhVChkBD3Qm1CqvbID"; + @BeforeAll + public static void setUp() throws IOException { + // Loads local .env file + EnvLoader.loadIfPresent(Path.of("src/test/resources/.env")); + TENANT_ID = System.getProperty("TENANT_ID"); + CLIENT_SECRET = System.getProperty("CLIENT_SECRET"); + CLIENT_ID = System.getProperty("CLIENT_ID"); + } /* * Neue Daten diff --git a/src/test/java/com/alexanderlogistics/TestIMAPOutlookOAuthDebug.java b/src/test/java/com/alexanderlogistics/TestIMAPOutlookOAuthDebug.java index 22a34dd..c974665 100644 --- a/src/test/java/com/alexanderlogistics/TestIMAPOutlookOAuthDebug.java +++ b/src/test/java/com/alexanderlogistics/TestIMAPOutlookOAuthDebug.java @@ -8,6 +8,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import java.io.StringWriter; +import java.nio.file.Path; import java.util.Map; import java.util.Properties; @@ -31,6 +32,7 @@ import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicHeader; import org.imixs.workflow.importer.mail.IMAPImportHelper; +import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; @@ -45,9 +47,18 @@ import com.sun.mail.imap.IMAPFolder; */ public class TestIMAPOutlookOAuthDebug { - private static final String TENANT_ID = "xxxxxx"; - private static final String CLIENT_ID = "yyyyyyy"; - private static final String CLIENT_SECRET = "zzzzz"; + private static String TENANT_ID = ""; + private static String CLIENT_ID = ""; + private static String CLIENT_SECRET = ""; + + @BeforeAll + public static void setUp() throws IOException { + // Loads local .env file + EnvLoader.loadIfPresent(Path.of("src/test/resources/.env")); + TENANT_ID = System.getProperty("TENANT_ID"); + CLIENT_SECRET = System.getProperty("CLIENT_SECRET"); + CLIENT_ID = System.getProperty("CLIENT_ID"); + } @Test @Disabled diff --git a/src/test/java/com/alexanderlogistics/migration/MigrationMahnerAusziffern.java b/src/test/java/com/alexanderlogistics/migration/MigrationMahnerAusziffern.java index 925a900..5eae5fe 100644 --- a/src/test/java/com/alexanderlogistics/migration/MigrationMahnerAusziffern.java +++ b/src/test/java/com/alexanderlogistics/migration/MigrationMahnerAusziffern.java @@ -31,7 +31,7 @@ public class MigrationMahnerAusziffern { WorkflowClient workflowCLient = null; String user = "archive"; - String ps = "archive4imixs"; + String ps = ""; // ARCHIVE_PASSWORD! String restAPI = "https://alexander-logistics.office-workflow.de/api"; int countProcessed = 0; int notFound = 0; diff --git a/src/test/java/com/alexanderlogistics/migration/MigrationSpaceZuordnung.java b/src/test/java/com/alexanderlogistics/migration/MigrationSpaceZuordnung.java index 018034d..b89fa6b 100644 --- a/src/test/java/com/alexanderlogistics/migration/MigrationSpaceZuordnung.java +++ b/src/test/java/com/alexanderlogistics/migration/MigrationSpaceZuordnung.java @@ -29,7 +29,7 @@ public class MigrationSpaceZuordnung { WorkflowClient workflowCLient = null; String user = "archive"; - String ps = "archive4imixs"; + String ps = ""; // ARCHIVE_PASSWORD! String restAPI = "https://alexander-logistics.office-workflow.de/api"; int countProcessed = 0; int notFound = 0; diff --git a/src/test/java/com/alexanderlogistics/rest/TestDataClient.java b/src/test/java/com/alexanderlogistics/rest/TestDataClient.java index dd93722..4613329 100644 --- a/src/test/java/com/alexanderlogistics/rest/TestDataClient.java +++ b/src/test/java/com/alexanderlogistics/rest/TestDataClient.java @@ -30,7 +30,7 @@ public class TestDataClient { Client rsClient = null; String restAPI = "https://alexander-logistics.office-workflow.de/api"; - String sessionID = "rMxsrGJwT2GOisKrjEcaI5kpny_DnWieEPbIUvH2.imixs-office-workflow-8c9795689-d62t5"; + String sessionID = "xxxxxxxxxxxxxxxxxx"; String reportName = "Steuerbescheide"; @BeforeEach diff --git a/src/test/java/com/alexanderlogistics/zoho/TestUpdateTokens.java b/src/test/java/com/alexanderlogistics/zoho/TestUpdateTokens.java index 30a15d7..b927c2b 100644 --- a/src/test/java/com/alexanderlogistics/zoho/TestUpdateTokens.java +++ b/src/test/java/com/alexanderlogistics/zoho/TestUpdateTokens.java @@ -42,20 +42,9 @@ public class TestUpdateTokens { private String redirectURI = "https://alexander-logistics-dwc.office-workflow.de/api/zoho/grant"; - // private String clientID = "1000.GR5FTPZYB06HEWSFSSX4DJU3OBD4EJ"; - // private String clientSecret = "3f3e74c5212bbc924a7ebf77f887c6296db1106c47"; - - // forum - // private String clientID = "1000.ECQXCXYOTQ9LGLRK2V4PYU94OORJKR"; - // private String clientSecret = "ce93df3860fc3d804cd015a0bec9b92dcfcf6329b8"; - - // DWC - // private String clientID = "1000.MQE1SU8UGY6F2PBPASOXGTLWYQD1FS"; - // private String clientSecret = "1ca70e1ab803b3fed6b1b5e00858c316e2003d289b"; - // Atari - private String clientID = "1000.86O4P321HDYDRX0Q0N1G7YOJRJ9D5W"; - private String clientSecret = "2a67b6cfc364f5df27cc8eb33e9b0e4e8a0221ebc3"; + private String clientID = "1000.xxxxxxxxxxxxxxxxxxx"; + private String clientSecret = "2axxxxxxxxxxxxxxxxx"; // ROLES // ZohoBooks.contacts.ALL,ZohoBooks.invoices.ALL,ZohoBooks.bills.ALL @@ -82,7 +71,7 @@ public class TestUpdateTokens { logger.info("├── update Zoho tokens"); refreshToken = null; accessToken = null; - code = "1000.d2a4e3a9622fc4c5eebe1ae5ee1989b5.d6899d23da56e6d8f73125ebaa498a3e"; + code = "1000.xxxxxxxxxxx"; try { // String requestUrl = "https://accounts.zoho.eu/oauth/v2/token" + "?code=" @@ -147,7 +136,7 @@ public class TestUpdateTokens { public void testRefreshAccessToken() throws IOException { logger.info("├── refresh Zoho access token"); - refreshToken = "1000.cf458816e97f848df8134ce1c7e923a1.5b9dbdee317e35d7f0c619e7648d55ff"; + refreshToken = "1000.xxxxxxxxxxxxxxxx"; try { String requestUrl = "https://accounts.zoho.eu/oauth/v2/token" + "?refresh_token=" @@ -200,7 +189,7 @@ public class TestUpdateTokens { public void testGetOrganizations() throws IOException { logger.info("├── get Zoho organizations"); - accessToken = "1000.21912dc6af0906707f51d336fd98ab61.eb153952d0d86a828fcb7e18426c2c1a"; + accessToken = "1000.xxxxxxxxxxxxxxx"; try { String url = "https://www.zohoapis.eu/books/v3/organizations"; @@ -243,7 +232,7 @@ public class TestUpdateTokens { public void testGetInvoices() throws IOException { logger.info("├── get Zoho documents"); - accessToken = "1000.21912dc6af0906707f51d336fd98ab61.eb153952d0d86a828fcb7e18426c2c1a"; + accessToken = "1000.xxxxxxxxxxxx"; try { String url = "https://www.zohoapis.eu/books/v3/invoices?organization_id=20105697367"; diff --git a/src/test/resources/ksef/output/invoice-eu-service-np.xml b/src/test/resources/ksef/output/invoice-eu-service-np.xml index c8dd093..5eeb657 100644 --- a/src/test/resources/ksef/output/invoice-eu-service-np.xml +++ b/src/test/resources/ksef/output/invoice-eu-service-np.xml @@ -7,7 +7,7 @@ 3 - 2026-08-15T10:44:53.056973507Z + 2026-08-20T11:01:10.498746084Z Imixs eInvoice @@ -87,7 +87,7 @@ FV/2025/7470 - 2026-08-15 + 2026-08-20 diff --git a/src/test/resources/ksef/output/invoice-mixed-rates.xml b/src/test/resources/ksef/output/invoice-mixed-rates.xml index 41cf06d..4e6ca8f 100644 --- a/src/test/resources/ksef/output/invoice-mixed-rates.xml +++ b/src/test/resources/ksef/output/invoice-mixed-rates.xml @@ -7,7 +7,7 @@ 3 - 2026-08-15T10:44:53.099870156Z + 2026-08-20T11:01:10.565274539Z Imixs eInvoice @@ -87,7 +87,7 @@ FV/2025/7471 - 2026-08-15 + 2026-08-20 diff --git a/src/test/resources/ksef/output/invoice-multiple-zero-rate-codes.xml b/src/test/resources/ksef/output/invoice-multiple-zero-rate-codes.xml index 1049025..7c9b026 100644 --- a/src/test/resources/ksef/output/invoice-multiple-zero-rate-codes.xml +++ b/src/test/resources/ksef/output/invoice-multiple-zero-rate-codes.xml @@ -7,7 +7,7 @@ 3 - 2026-08-15T10:44:53.032587863Z + 2026-08-20T11:01:10.473274636Z Imixs eInvoice diff --git a/src/test/resources/ksef/output/invoice-np.xml b/src/test/resources/ksef/output/invoice-np.xml index fbed70f..fc83b7a 100644 --- a/src/test/resources/ksef/output/invoice-np.xml +++ b/src/test/resources/ksef/output/invoice-np.xml @@ -7,7 +7,7 @@ 3 - 2026-08-15T10:44:53.088734478Z + 2026-08-20T11:01:10.549495260Z Imixs eInvoice @@ -87,7 +87,7 @@ FV/2025/001 - 2026-08-15 + 2026-08-20 diff --git a/src/test/resources/ksef/output/invoice-npt.xml b/src/test/resources/ksef/output/invoice-npt.xml index 32ddebe..6c2836d 100644 --- a/src/test/resources/ksef/output/invoice-npt.xml +++ b/src/test/resources/ksef/output/invoice-npt.xml @@ -7,7 +7,7 @@ 3 - 2026-08-15T10:44:53.072046007Z + 2026-08-20T11:01:10.514998809Z Imixs eInvoice @@ -87,7 +87,7 @@ FV/2025/001 - 2026-08-15 + 2026-08-20 diff --git a/src/test/resources/ksef/output/invoice-simple.xml b/src/test/resources/ksef/output/invoice-simple.xml index 00c8934..e06a82e 100644 --- a/src/test/resources/ksef/output/invoice-simple.xml +++ b/src/test/resources/ksef/output/invoice-simple.xml @@ -7,7 +7,7 @@ 3 - 2026-08-15T10:44:53.132180648Z + 2026-08-20T11:01:10.586373483Z Imixs eInvoice @@ -87,7 +87,7 @@ FV/2025/001 - 2026-08-15 + 2026-08-20 diff --git a/src/test/resources/ksef/output/test-korrekturrechnung.xml b/src/test/resources/ksef/output/test-korrekturrechnung.xml index 91c75a4..5a1e0c4 100644 --- a/src/test/resources/ksef/output/test-korrekturrechnung.xml +++ b/src/test/resources/ksef/output/test-korrekturrechnung.xml @@ -7,7 +7,7 @@ 3 - 2026-08-15T10:44:53.112255623Z + 2026-08-20T11:01:10.574896691Z Imixs eInvoice @@ -87,7 +87,7 @@ FV/2025/001 - 2026-08-15 + 2026-08-20