Go to file
duffyduck 4b9df132d7 Add FTP/SFTP support and tree-view folder picker with lazy loading
FTP/SFTP processor:
- New ftp_processor.py with adapter pattern for FTP (passive) and SFTP
- Same design as smb_processor: read PDFs, forward via SMTP, move to processed
- Eingangs-/Ausgangsbelege with separate paths, modes (forward/separator)
- paramiko==3.5.0 for SFTP support
- Schema v9 with new ftp_* settings
- Integrated in scheduler

Tree-view folder picker (SMB + FTP):
- Reusable tree rendering from flat path lists
- Expandable/collapsible nodes with toggle arrows
- Lazy loading: only top-level folders on open, sub-folders on-demand
- Auto-expand ancestors of currently selected value (with preload)
- Reload button stays for manual refresh
- Always fresh load when opening picker
- New endpoints: /api/list-smb-subfolders, /api/list-ftp-subfolders

FTP-specific fixes:
- list_pdfs uses LIST instead of NLST (more reliable across servers)
- Stateful CWD bug fixed in ensure_dir/stat_exists/rename
  (previously created /Buch/Buch/X instead of /Buch/X due to CWD drift)
- All operations reset CWD via _reset_cwd() before stateful calls
- _resolve() helper for SFTP to handle empty path / chroot users

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 13:26:42 +02:00
app Add FTP/SFTP support and tree-view folder picker with lazy loading 2026-04-14 13:26:42 +02:00
.dockerignore dockerignore 2026-03-06 08:22:49 +01:00
.gitignore gitignore 2026-03-06 08:28:02 +01:00
Dockerfile added amazon importer and logging smtp 2026-03-20 16:22:38 +01:00
README.md Add FTP/SFTP support and tree-view folder picker with lazy loading 2026-04-14 13:26:42 +02:00
docker-compose.yml Amazon Business API integration replacing browser automation 2026-04-05 18:08:35 +02:00
requirements.txt Add FTP/SFTP support and tree-view folder picker with lazy loading 2026-04-14 13:26:42 +02:00

README.md

Belegimport

Automatischer Import von Belegen (Rechnungen, Gutschriften) aus verschiedenen Quellen und Weiterleitung per SMTP an Buchhaltungssoftware (z.B. Buchhaltungsbutler).

Features

  • Scan-Upload: PDF hochladen, automatische Trennung per QR-Code-Trennseiten
  • IMAP: Automatischer Abruf von Belegen aus Email-Postfachern
  • SMB/Netzlaufwerk: Automatischer Abruf von Belegen aus Netzwerkordnern
  • FTP / SFTP: Automatischer Abruf von Belegen via FTP (passiv, unverschluesselt) oder SFTP (SSH)
  • Amazon Business: Automatischer Abruf von Amazon-Rechnungen per API
  • Eingangs-/Ausgangsbelege: Getrennte Import-Adressen fur Einkauf und Verkauf
  • Scheduler: Automatischer Abruf in konfigurierbaren Intervallen
  • Verarbeitungslog: Ubersicht aller importierten Belege mit Status

Technologie

  • Python 3.12, FastAPI, Jinja2, SQLite (aiosqlite)
  • Docker / docker-compose
  • Playwright (optional, fur Amazon Browser-Automation als Fallback)

Installation

Docker (empfohlen)

git clone <repository-url>
cd lex-office-belegimport-mail
sudo docker-compose up --build -d

Die Webanwendung ist erreichbar unter: http://localhost:8081

Konfiguration

Alle Einstellungen werden uber die Weboberflache vorgenommen:

  1. Einstellungen (/settings): SMTP-Server, IMAP, SMB, Import-Emailadressen
  2. Plattformen (/platforms): Amazon Business API-Zugangsdaten
  3. Scan-Upload (/): Manueller PDF-Upload mit Belegart-Auswahl

Amazon Business API Einrichtung

Die Amazon-Integration nutzt die offizielle Amazon Business API (Reconciliation + Document API) um Rechnungen automatisch abzurufen. Kein Browser-Login, keine CAPTCHAs, vollautomatisch.

Voraussetzungen

Schritt 1: Als Entwickler registrieren

  1. Offne das Solution Provider Portal
  2. Wahle "Private seller applications" (fur eigene Integrationen)
  3. Wahle "Erstellen Sie Anwendungen, die SP-APIs verwenden"
  4. Fulle die Unternehmensdaten aus (Name, Handelsregisternummer, Adresse)
  5. Verifiziere per SMS

Schritt 2: Rollen auswahlen

Wahle folgende Rollen:

  • Abgleichen von Business-Einkaufen (Reconciliation API)
  • Amazon Business-Bestellung (Business Orders API)

Schritt 3: Sicherheitskontrollen

Beantworte alle Sicherheitsfragen mit "Ja".

Bei den Textfeldern:

  • Externe Parteien: Keine. Die Daten werden ausschliesslich intern fur die eigene Buchhaltung verwendet.
  • Externe Quellen: Keine.

Schritt 4: App registrieren

Nach der Freischaltung (kann einige Tage dauern):

  1. Im Developer Central: "+ Neuen App-Client hinzufugen"

  2. Einstellungen:

    • App-Name: Beleg import (oder eigener Name)
    • API-Typ: SP-API
    • App-Typ: Produktion
    • Amazon Business: angehakt
    • Verkaufer: nicht angehakt
    • Rollen: Abgleichen von Business-Einkaufen + Amazon Business-Bestellung
    • RDT: Nein
    • OAuth-Anmeldungs-URI: https://ihre-domain.de/api/amazon-oauth-callback
    • OAuth-Umleitungs-URI: https://ihre-domain.de/api/amazon-oauth-callback
  3. Nach dem Speichern: "Anmeldedaten fur Login mit Amazon" -> "Anzeigen"

    • Notiere Client-ID (amzn1.application-oa2-client.xxxxx)
    • Notiere Client-Sicherheitsschluessel (amzn1.oa2-cs.v1.xxxxx)
  4. Die App-ID (amzn1.sp.solution.xxxxx) steht in der App-Ubersicht unter dem App-Namen

Hinweis: Die OAuth-Umleitungs-URI muss eine echte Domain mit Top-Level-Domain sein. localhost und .local Domains werden von Amazon nicht akzeptiert. Die URI muss nicht offentlich erreichbar sein - Amazon leitet nur den Browser des Benutzers dorthin weiter.

Fehler SPSA0404: Falls beim Autorisieren der Fehler "Keine unterstuetzte Geschaeftseinheit" erscheint, muss die Autorisierung uber den OAuth-Flow (Website) statt uber Self-Authorization erfolgen. Der Belegimport unterstutzt dies automatisch.

Schritt 5: Im Belegimport konfigurieren

  1. Offne die Plattformen-Seite im Belegimport
  2. Setze Abruf-Modus auf "API (empfohlen)"
  3. Trage ein:
    • App-ID: amzn1.sp.solution.xxxxx
    • Client-ID: amzn1.application-oa2-client.xxxxx
    • Client-Sicherheitsschluessel: Der Secret-Wert
  4. Einstellungen speichern
  5. Klicke "Bei Amazon autorisieren"
  6. Melde dich bei Amazon an und erlaube den Zugriff
  7. Kopiere den spapi_oauth_code (oder die ganze URL) aus der Browser-Adressleiste
  8. Trage den Code im Belegimport ein und klicke "Token tauschen"
  9. Status sollte auf "API autorisiert" wechseln

Schritt 6: Rechnungen abrufen

  • Manuell: Klicke "Jetzt Rechnungen abrufen"
  • Automatisch: Aktiviere den Scheduler unter Einstellungen (z.B. alle 60 Minuten)

Die Rechnungen werden als PDF per SMTP an die konfigurierte Eingangsbeleg-Adresse gesendet. Bereits abgerufene Rechnungen werden automatisch ubersprungen.

OAuth Redirect URI (lokale Installation)

Da Amazon keine localhost-URIs akzeptiert, gibt es zwei Optionen:

Option A: Eigene Domain verwenden (empfohlen)

Trage eine echte Domain ein (z.B. https://ihre-domain.de/api/amazon-oauth-callback). Nach der Amazon-Autorisierung leitet der Browser dorthin weiter - die Seite ladt nicht, aber der Auth-Code steht in der URL-Leiste. Diesen Code im Belegimport eintragen.

Option B: /etc/hosts Eintrag

Falls der Server lokal erreichbar sein soll:

# In /etc/hosts eintragen:
127.0.0.1  app.belegimport.de

Dann in der Amazon App als Redirect URI eintragen: https://app.belegimport.de/api/amazon-oauth-callback

Achtung: Amazon pruft ob die Domain eine Top-Level-Domain hat. .local funktioniert nicht, aber .de schon.

Umgebungsvariablen

In docker-compose.yml:

environment:
  - OAUTH_REDIRECT_BASE=https://ihre-domain.de  # Muss zur Amazon App passen

Eingangs- und Ausgangsbelege

Der Belegimport unterscheidet zwischen:

  • Eingangsbelege (Einkauf): Rechnungen die Sie von Lieferanten erhalten
  • Ausgangsbelege (Verkauf/Gutschrift): Rechnungen die Sie an Kunden senden

Fur beide Typen konnen separate Import-Emailadressen konfiguriert werden (z.B. fur Buchhaltungsbutler). Amazon-Rechnungen werden automatisch als Eingangsbelege klassifiziert.

Bei IMAP und SMB konnen jeweils getrennte Quell- und Verarbeitungsordner fur Eingangs- und Ausgangsbelege konfiguriert werden.

Beim Scan-Upload kann die Belegart per Radio-Button ausgewahlt werden.


Verarbeitungslog

Unter /log werden alle verarbeiteten Belege angezeigt mit:

  • Zeitpunkt, Betreff, Absender
  • Belegart (Eingang/Ausgang)
  • Anzahl Anhange
  • Status (OK/Fehler)
  • Fehlermeldung (falls vorhanden)
  • SMTP-Protokoll (anzeigbar)

Lizenz

Privates Projekt.