2026-04-08 14:18:07 +02:00
|
|
|
# Workflow: Automatischer Dateieingang — SFTP → OCI Object Storage → DB
|
2026-04-08 08:37:58 +02:00
|
|
|
|
2026-04-08 14:18:07 +02:00
|
|
|
**Stand:** 2026-04-08
|
2026-04-08 08:37:58 +02:00
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## Beteiligte Systeme
|
|
|
|
|
|
|
|
|
|
| System | Rolle |
|
|
|
|
|
|---|---|
|
|
|
|
|
| **SFTP-Server** | Quelle — externer Lieferant legt ZIP-Dateien ab |
|
2026-04-08 14:18:07 +02:00
|
|
|
| **Dateieingang Service** | Middleware (Quarkus) — holt ZIP, entpackt, lädt Dateien + Marker in OCI hoch |
|
2026-04-08 08:37:58 +02:00
|
|
|
| **OCI Object Storage** | Zwischenspeicher — Eingangsordner, Zielordner nach Verarbeitung |
|
|
|
|
|
| **Oracle DB / APEX** | Verarbeitung — liest Dateien aus OCI, importiert Daten |
|
|
|
|
|
|
2026-04-08 14:18:07 +02:00
|
|
|
Details zum Dateieingang Service: `agent-backend/docs/Architecture.md`
|
|
|
|
|
Details zur DB-Verarbeitung: `database/docs/plan_pck_net_storage.md`
|
|
|
|
|
|
2026-04-08 08:37:58 +02:00
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## Ablauf
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
|
|
|
│ APEX Automation (stündlich) │
|
|
|
|
|
│ │
|
|
|
|
|
│ 1. Unterordner in eingang/ mit Marker vorhanden? │
|
|
|
|
|
│ → ja: Dateien verarbeiten (gleiche Logik wie Schritt 4-6) │
|
|
|
|
|
│ │
|
2026-04-08 14:18:07 +02:00
|
|
|
│ 2. Dateieingang Service aufrufen (fire & forget) │
|
|
|
|
|
│ HTTP POST /api/process-incoming (Header: X-Api-Key) │
|
2026-04-08 08:37:58 +02:00
|
|
|
└────────────────────────────┬────────────────────────────────────┘
|
|
|
|
|
│
|
|
|
|
|
▼
|
|
|
|
|
┌─────────────────────────────────────────────────────────────────┐
|
2026-04-08 14:18:07 +02:00
|
|
|
│ Dateieingang Service (Quarkus, läuft im Hintergrund) │
|
2026-04-08 08:37:58 +02:00
|
|
|
│ │
|
2026-04-08 14:18:07 +02:00
|
|
|
│ 3a. Neue *.zip-Dateien vom SFTP-Server auflisten │
|
|
|
|
|
│ 3b. ZIP herunterladen und entpacken │
|
2026-04-08 08:37:58 +02:00
|
|
|
│ 3c. Alle Dateien in OCI eingang/<zip-name>/ hochladen │
|
|
|
|
|
│ (Unterordner aus der ZIP werden beibehalten) │
|
2026-04-08 14:18:07 +02:00
|
|
|
│ → Fehler stoppt Verarbeitung dieser ZIP │
|
2026-04-08 08:37:58 +02:00
|
|
|
│ 3d. Marker eingang/<zip-name>/_READY_FOR_DB_PROCESSING_ │
|
|
|
|
|
│ hochladen │
|
2026-04-08 14:18:07 +02:00
|
|
|
│ 3e. ZIP auf SFTP umbenennen (.processed oder .error) │
|
2026-04-08 08:37:58 +02:00
|
|
|
│ → erst NACH erfolgreichem Marker-Upload │
|
2026-04-08 14:18:07 +02:00
|
|
|
│ 3f. ORDS-Endpunkt aufrufen (pck_auto_import.p_process_incoming)│
|
|
|
|
|
│ 3g. Lokale Arbeitsdateien löschen │
|
2026-04-08 08:37:58 +02:00
|
|
|
└────────────────────────────┬────────────────────────────────────┘
|
|
|
|
|
│
|
|
|
|
|
▼
|
|
|
|
|
┌─────────────────────────────────────────────────────────────────┐
|
|
|
|
|
│ Oracle DB (via ORDS-Endpunkt oder APEX Automation) │
|
|
|
|
|
│ │
|
|
|
|
|
│ 4. Unterordner in eingang/ auflisten │
|
|
|
|
|
│ 5. Für jeden Unterordner mit Marker: │
|
|
|
|
|
│ Für jede Datei (außer Marker) einzeln: │
|
|
|
|
|
│ a. Daten importieren (noch kein Commit) │
|
|
|
|
|
│ → log_object_ref = eingang/<zip-name>/datei.csv │
|
|
|
|
|
│ b. Datei in Zielordner verschieben │
|
|
|
|
|
│ c. Commit │
|
|
|
|
|
│ d. Fehler → Rollback, ERROR in lg_app_log, nächste Datei │
|
|
|
|
|
│ 6. Keine Dateien mehr im Unterordner (außer Marker)? │
|
|
|
|
|
│ → Marker löschen (Batch abgeschlossen) │
|
|
|
|
|
└─────────────────────────────────────────────────────────────────┘
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## OCI Ordnerstruktur
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
bucket/
|
|
|
|
|
eingang/
|
|
|
|
|
export_2026-04-07/ ← Unterordner = ZIP-Name
|
|
|
|
|
datei1.csv
|
|
|
|
|
datei2.csv
|
|
|
|
|
unterordner/
|
|
|
|
|
datei3.csv
|
|
|
|
|
_READY_FOR_DB_PROCESSING_ ← Marker: Batch vollständig
|
|
|
|
|
<zielordner>/
|
|
|
|
|
export_2026-04-07/ ← gleiche Struktur nach Verarbeitung
|
|
|
|
|
datei1.csv
|
|
|
|
|
...
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Der Marker bleibt solange erhalten bis **alle** Dateien des Unterordners
|
2026-04-08 14:18:07 +02:00
|
|
|
erfolgreich verarbeitet wurden. Fehlgeschlagene Dateien werden beim nächsten Lauf erneut versucht.
|
2026-04-08 08:37:58 +02:00
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## Fehlerfall-Verhalten
|
|
|
|
|
|
2026-04-08 14:18:07 +02:00
|
|
|
**Service: Upload einer Datei schlägt fehl**
|
|
|
|
|
- Verarbeitung dieser ZIP stoppt sofort
|
|
|
|
|
- Kein Marker wird geschrieben, ZIP auf SFTP wird zu `.error` umbenannt
|
2026-04-08 08:37:58 +02:00
|
|
|
- ORDS wird nicht aufgerufen
|
2026-04-08 14:18:07 +02:00
|
|
|
- Bereits hochgeladene Dateien werden beim nächsten Trigger überschrieben (OCI PUT idempotent)
|
2026-04-08 08:37:58 +02:00
|
|
|
|
2026-04-08 14:18:07 +02:00
|
|
|
**Service: ORDS-Aufruf schlägt fehl**
|
2026-04-08 08:37:58 +02:00
|
|
|
- Marker liegt in `eingang/<zip-name>/`, Dateien sind vollständig hochgeladen
|
|
|
|
|
- Beim nächsten Stundenlauf findet APEX Automation den Marker und verarbeitet
|
|
|
|
|
|
|
|
|
|
**DB: Verarbeitung einer einzelnen Datei schlägt fehl**
|
|
|
|
|
- Rollback — Datei bleibt in `eingang/<zip-name>/`
|
|
|
|
|
- ERROR in `lg_app_log` mit `log_object_ref = eingang/<zip-name>/datei.csv`
|
|
|
|
|
- Marker bleibt erhalten → nächste Dateien im Batch werden weiterverarbeitet
|
|
|
|
|
- Beim nächsten Lauf wird die fehlgeschlagene Datei erneut versucht
|
|
|
|
|
|
|
|
|
|
**DB: p_move_object schlägt nach erfolgreichem Import fehl**
|
|
|
|
|
- Rollback des Imports → sauberer Ausgangszustand
|
|
|
|
|
- Datei bleibt in `eingang/<zip-name>/`, Marker bleibt erhalten
|
|
|
|
|
- Nächster Lauf versucht es erneut
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## Warum kein Fehlerordner, keine Status-Tabelle?
|
|
|
|
|
|
|
|
|
|
Der Zustand steckt im Dateisystem:
|
|
|
|
|
- Unterordner mit Marker = Batch bereit oder teilweise verarbeitet
|
2026-04-08 14:18:07 +02:00
|
|
|
- Unterordner ohne Marker = unvollständiger Upload, wird ignoriert
|
2026-04-08 08:37:58 +02:00
|
|
|
- Datei im Zielordner = erfolgreich verarbeitet
|
|
|
|
|
- Datei noch in `eingang/<zip-name>/` = noch ausstehend oder fehlgeschlagen
|
2026-04-08 14:18:07 +02:00
|
|
|
- ZIP auf SFTP mit `.error` = persistenter Fehler, manuelle Prüfung nötig
|
2026-04-08 08:37:58 +02:00
|
|
|
|
|
|
|
|
Fehlerdetails stehen in `lg_app_log`. Über `log_object_ref` ist jede Datei
|
|
|
|
|
eindeutig einer ZIP zugeordnet. Kein Verhalten wird aus dem Log abgeleitet —
|
|
|
|
|
es dient ausschließlich dem Audit-Trail.
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## Zeitplan
|
|
|
|
|
|
2026-04-08 14:18:07 +02:00
|
|
|
APEX Automation läuft **1x pro Stunde**. Der Dateieingang Service wird dabei per
|
|
|
|
|
HTTP POST aufgerufen und läuft zeitlich versetzt nach dem Automation-Start.
|