clean up docu and junit tests
This commit is contained in:
parent
cfe1edb294
commit
2d3f98c15c
27 changed files with 310 additions and 321 deletions
|
|
@ -1,5 +0,0 @@
|
|||
# AGL - Local Backup Service
|
||||
|
||||
Run service with
|
||||
|
||||
$ docker compose up
|
||||
204
backup/README.md
Normal file
204
backup/README.md
Normal file
|
|
@ -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://<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.
|
||||
Binary file not shown.
99
doc/FTP.md
99
doc/FTP.md
|
|
@ -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
|
||||
|
|
@ -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
|
||||
|
|
@ -1,25 +0,0 @@
|
|||
# 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** |
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
NIP = "9552521552"
|
||||
|
||||
TOKEN = "20251113-EC-2751AC3000-5C5466924B-62|nip-9552521552|fc0c95d020dc45d4af491fb0aa755f3f3f674b33ecbf4250a88ea6e36fa8340b
|
||||
|
|
@ -1,9 +0,0 @@
|
|||
# Mail
|
||||
|
||||
Testen von Mailing kann man über
|
||||
|
||||
https://www.mail-tester.com/
|
||||
|
||||
Kutzner Mail gateway
|
||||
|
||||
PW: 26W%R#Xe4^Z2Gyz1
|
||||
|
|
@ -1 +0,0 @@
|
|||
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAnGiu0PUBl+G++vHrGP5wDRit4mXF4hXTyzUem3BPADaV0DUuYN1Fx5RpDl2F8mhnqDYcyCTBzLTJ+0jFqq1pzoJW5ZWZ+hSChabVCV4m8UkFkhbRmjxNkPx26ZMhfTD1mDqgCKQ+bbt1mi04UZppDKBr+9ZrMG3d0odHblEJHixtJ7Hqr9vvXXbvNv4E9B/9dlW57oyEUk/vKmwuLyGAsDjxjfB3W+Faab+gev8VDwJxdbD90HX0O2Az05wy9EC7M3pujcawsHdaFXgFFRRwlVuUkX3z9hp1Uekqg0N81hty7/i8GiZ9/m3Y6hIA5eRM4ZpDQFEF8SY9TLSzDehNoQ== seesped@cargodb
|
||||
|
|
@ -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
|
||||
|
|
@ -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) {
|
||||
|
|
|
|||
32
src/test/java/com/alexanderlogistics/EnvLoader.java
Normal file
32
src/test/java/com/alexanderlogistics/EnvLoader.java
Normal file
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
|
||||
<WariantFormularza>3</WariantFormularza>
|
||||
|
||||
<DataWytworzeniaFa>2026-08-15T10:44:53.056973507Z</DataWytworzeniaFa>
|
||||
<DataWytworzeniaFa>2026-08-20T11:01:10.498746084Z</DataWytworzeniaFa>
|
||||
|
||||
<SystemInfo>Imixs eInvoice</SystemInfo>
|
||||
|
||||
|
|
@ -87,7 +87,7 @@
|
|||
<P_2>FV/2025/7470</P_2>
|
||||
|
||||
|
||||
<P_6>2026-08-15</P_6>
|
||||
<P_6>2026-08-20</P_6>
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
|
||||
<WariantFormularza>3</WariantFormularza>
|
||||
|
||||
<DataWytworzeniaFa>2026-08-15T10:44:53.099870156Z</DataWytworzeniaFa>
|
||||
<DataWytworzeniaFa>2026-08-20T11:01:10.565274539Z</DataWytworzeniaFa>
|
||||
|
||||
<SystemInfo>Imixs eInvoice</SystemInfo>
|
||||
|
||||
|
|
@ -87,7 +87,7 @@
|
|||
<P_2>FV/2025/7471</P_2>
|
||||
|
||||
|
||||
<P_6>2026-08-15</P_6>
|
||||
<P_6>2026-08-20</P_6>
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
|
||||
<WariantFormularza>3</WariantFormularza>
|
||||
|
||||
<DataWytworzeniaFa>2026-08-15T10:44:53.032587863Z</DataWytworzeniaFa>
|
||||
<DataWytworzeniaFa>2026-08-20T11:01:10.473274636Z</DataWytworzeniaFa>
|
||||
|
||||
<SystemInfo>Imixs eInvoice</SystemInfo>
|
||||
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
|
||||
<WariantFormularza>3</WariantFormularza>
|
||||
|
||||
<DataWytworzeniaFa>2026-08-15T10:44:53.088734478Z</DataWytworzeniaFa>
|
||||
<DataWytworzeniaFa>2026-08-20T11:01:10.549495260Z</DataWytworzeniaFa>
|
||||
|
||||
<SystemInfo>Imixs eInvoice</SystemInfo>
|
||||
|
||||
|
|
@ -87,7 +87,7 @@
|
|||
<P_2>FV/2025/001</P_2>
|
||||
|
||||
|
||||
<P_6>2026-08-15</P_6>
|
||||
<P_6>2026-08-20</P_6>
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
|
||||
<WariantFormularza>3</WariantFormularza>
|
||||
|
||||
<DataWytworzeniaFa>2026-08-15T10:44:53.072046007Z</DataWytworzeniaFa>
|
||||
<DataWytworzeniaFa>2026-08-20T11:01:10.514998809Z</DataWytworzeniaFa>
|
||||
|
||||
<SystemInfo>Imixs eInvoice</SystemInfo>
|
||||
|
||||
|
|
@ -87,7 +87,7 @@
|
|||
<P_2>FV/2025/001</P_2>
|
||||
|
||||
|
||||
<P_6>2026-08-15</P_6>
|
||||
<P_6>2026-08-20</P_6>
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
|
||||
<WariantFormularza>3</WariantFormularza>
|
||||
|
||||
<DataWytworzeniaFa>2026-08-15T10:44:53.132180648Z</DataWytworzeniaFa>
|
||||
<DataWytworzeniaFa>2026-08-20T11:01:10.586373483Z</DataWytworzeniaFa>
|
||||
|
||||
<SystemInfo>Imixs eInvoice</SystemInfo>
|
||||
|
||||
|
|
@ -87,7 +87,7 @@
|
|||
<P_2>FV/2025/001</P_2>
|
||||
|
||||
|
||||
<P_6>2026-08-15</P_6>
|
||||
<P_6>2026-08-20</P_6>
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
|
||||
<WariantFormularza>3</WariantFormularza>
|
||||
|
||||
<DataWytworzeniaFa>2026-08-15T10:44:53.112255623Z</DataWytworzeniaFa>
|
||||
<DataWytworzeniaFa>2026-08-20T11:01:10.574896691Z</DataWytworzeniaFa>
|
||||
|
||||
<SystemInfo>Imixs eInvoice</SystemInfo>
|
||||
|
||||
|
|
@ -87,7 +87,7 @@
|
|||
<P_2>FV/2025/001</P_2>
|
||||
|
||||
|
||||
<P_6>2026-08-15</P_6>
|
||||
<P_6>2026-08-20</P_6>
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue