# Workflow: Automatischer Dateieingang — SFTP → OCI Object Storage → DB **Stand:** 2026-04-08 --- ## Beteiligte Systeme | System | Rolle | |---|---| | **SFTP-Server** | Quelle — externer Lieferant legt ZIP-Dateien ab | | **Dateieingang Service** | Middleware (Quarkus) — holt ZIP, entpackt, lädt Dateien + Marker in OCI hoch | | **OCI Object Storage** | Zwischenspeicher — Eingangsordner, Zielordner nach Verarbeitung | | **Oracle DB / APEX** | Verarbeitung — liest Dateien aus OCI, importiert Daten | Details zum Dateieingang Service: `agent-backend/docs/Architecture.md` Details zur DB-Verarbeitung: `database/docs/plan_pck_net_storage.md` --- ## Ablauf ``` ┌─────────────────────────────────────────────────────────────────┐ │ APEX Automation (stündlich) │ │ │ │ 1. Unterordner in eingang/ mit Marker vorhanden? │ │ → ja: Dateien verarbeiten (gleiche Logik wie Schritt 4-6) │ │ │ │ 2. Dateieingang Service aufrufen (fire & forget) │ │ HTTP POST /api/process-incoming (Header: X-Api-Key) │ └────────────────────────────┬────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────┐ │ Dateieingang Service (Quarkus, läuft im Hintergrund) │ │ │ │ 3a. Neue *.zip-Dateien vom SFTP-Server auflisten │ │ 3b. ZIP herunterladen und entpacken │ │ 3c. Alle Dateien in OCI eingang// hochladen │ │ (Unterordner aus der ZIP werden beibehalten) │ │ → Fehler stoppt Verarbeitung dieser ZIP │ │ 3d. Marker eingang//_READY_FOR_DB_PROCESSING_ │ │ hochladen │ │ 3e. ZIP auf SFTP umbenennen (.processed oder .error) │ │ → erst NACH erfolgreichem Marker-Upload │ │ 3f. ORDS-Endpunkt aufrufen (pck_auto_import.p_process_incoming)│ │ 3g. Lokale Arbeitsdateien löschen │ └────────────────────────────┬────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────────┐ │ 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//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 / export_2026-04-07/ ← gleiche Struktur nach Verarbeitung datei1.csv ... ``` Der Marker bleibt solange erhalten bis **alle** Dateien des Unterordners erfolgreich verarbeitet wurden. Fehlgeschlagene Dateien werden beim nächsten Lauf erneut versucht. --- ## Fehlerfall-Verhalten **Service: Upload einer Datei schlägt fehl** - Verarbeitung dieser ZIP stoppt sofort - Kein Marker wird geschrieben, ZIP auf SFTP wird zu `.error` umbenannt - ORDS wird nicht aufgerufen - Bereits hochgeladene Dateien werden beim nächsten Trigger überschrieben (OCI PUT idempotent) **Service: ORDS-Aufruf schlägt fehl** - Marker liegt in `eingang//`, 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//` - ERROR in `lg_app_log` mit `log_object_ref = eingang//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//`, 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 - Unterordner ohne Marker = unvollständiger Upload, wird ignoriert - Datei im Zielordner = erfolgreich verarbeitet - Datei noch in `eingang//` = noch ausstehend oder fehlgeschlagen - ZIP auf SFTP mit `.error` = persistenter Fehler, manuelle Prüfung nötig 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 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.