Syncronisation zwischen Frappe und Optigem / GDI Lohn & Gehalt
Docker (Web Service ist Standard):
docker run \
-p 8000:8000 \
-e CRON="*/15 * * * *" \ # optional, sonst kein Auto-Run
-v ./config.yaml:/config.yaml \
-v ./timestamps.db:/timestamps.db \
davidloe/frappe-optigem-gdi-sync --config /config.yamlLokal: Setup und dann Web Service oder einmalige Ausführung:
# Web Service
python3 service.py --config config.yaml --port 8000
# Einmaliger Lauf
python3 synchronize.py --config config.yamlDer Container startet standardmäßig den Web Service. Darüber lässt sich der Cron-Plan online setzen (keine Ausführung ohne gesetzten Cron), ein Lauf manuell anstoßen und die Logs der vergangenen Runs abrufen.
Lokal starten:
python3 service.py --config config.yaml --port 8000
# optional direkt einen Cron mitgeben:
# python3 service.py --config config.yaml --port 8000 --cron "*/10 * * * *"Docker:
docker run \
-p 8000:8000 \
-e CRON="*/15 * * * *" \
-v ./config.yaml:/config.yaml \
-v ./timestamps.db:/timestamps.db \
davidloe/frappe-optigem-gdi-sync --config /config.yamlAPI-Endpunkte (Port 8000, JSON):
GET /health– Status & aktueller Cron-PlanGET /schedule/PUT /schedule– Cron-Ausdruck setzen ({"cron": "5 2 * * *"})POST /run– manuellen Sync startenGET /runs?limit=50&task_name=...– letzte RunsGET /runs/{run_id}/logs?limit=200– Logs zu einem Run
Der Web Service liefert unter / ein leichtgewichtiges Dashboard für die oben genannten Endpunkte. Service starten und dann im Browser http://localhost:8000/ aufrufen, um den Cron zu pflegen, einen Run anzustoßen und Logs anzusehen.
Der Plan wird in der timestamps.db gespeichert. Ohne gesetzten Cron (z. B. per CRON oder PUT /schedule) wird nichts automatisch ausgeführt.
cp config.yaml.example config.yamlDiese Konfigurationsdatei ermöglicht es, Datenbankverbindungen, den Frappe-Zugang sowie diverse Synchronisationsaufgaben zentral zu definieren. Dadurch können Sie flexibel festlegen, wie Daten zwischen Frappe und unterschiedlichen Datenbanken (MSSQL, Firebird) ausgetauscht werden sollen.
Unter databases legen Sie eine oder mehrere Datenbankverbindungen fest. Jede Datenbank wird durch einen eindeutigen Schlüssel identifiziert.
-
MSSQL-Datenbank (
type: mssql):- server: Adresse des MSSQL-Servers.
- trust_server_certificate: Boolean, ob dem Serverzertifikat vertraut werden soll.
- database: Name der Datenbank.
- user: Benutzername zur Authentifizierung.
- password: Passwort zur Authentifizierung.
-
Firebird-Datenbank (
type: firebird):- host: Adresse des Firebird-Servers.
- port: Portnummer, unter der der Server erreichbar ist.
- charset: Zeichensatz, Standardwert ist "UTF8".
- database: Name der Datenbank.
- user: Benutzername.
- password: Passwort.
Die frappe-Sektion enthält alle notwendigen Informationen, um eine Verbindung zu einer Frappe-Instanz herzustellen:
- api_key / api_secret: Zugriffsdaten für die Frappe-API (Pflicht).
- limit_page_length: Maximale Anzahl an Einträgen pro Seite (Standard: 20).
- url: Basis-URL der Frappe-Instanz (ohne abschließenden Schrägstrich, Pflicht).
Die tasks-Sektion definiert die zu synchronisierenden Aufgaben. Jede Aufgabe wird unter einem eigenen Schlüssel definiert und muss den Typ der Synchronisation über das Feld direction angeben. Es gibt drei Typen:
-
Bidirektionale Synchronisation (
direction: bidirectional):
Synchronisiert Daten in beide Richtungen (Frappe ↔ Datenbank).
Wichtige Felder:- doc_type: Der in Frappe verwendete Dokumenttyp.
- db_name: Bezeichnung der verwendeten Datenbank (entspricht einem Schlüssel unter
databases). - mapping: Dictionary, das Frappe-Felder zu DB-Spalten mappt (alle
key_fieldsmüssen hier enthalten sein). - key_fields: Liste der Felder, die als Schlüssel dienen.
- table_name: Name der Zieltabelle in der Datenbank.
- frappe: Enthält Frappe-spezifische Einstellungen, zusätzlich:
- fk_id_field: Fremdschlüssel-Feld zur eindeutigen Identifikation.
- modified_fields: Liste der Änderungs-Timestamps (Default:
["modified"]); wird auch alsdatetime_fieldshinterlegt. - datetime_fields / int_fields: Felder, die beim Einlesen in Datums- bzw. Ganzzahlen gecastet werden sollen.
- db: Enthält Datenbankspezifische Einstellungen, zusätzlich:
- fk_id_field: Fremdschlüssel-Feld.
- id_field: Identifikationsfeld in der Datenbank.
- manual_id_sequence: Manuelles Hochzählen des Primärschlüssels (Standard: false).
- manual_id_sequence_max: Optionaler Maximalwert für die manuelle Sequenz.
- modified_fields: Liste der Änderungs-Timestamps (Pflicht).
- delete: Gibt an, ob Datensätze gelöscht werden sollen (Standard: true).
- datetime_comparison_accuracy_milliseconds: Genauigkeit beim Vergleich von Datums-/Zeitfeldern in Millisekunden.
-
DB zu Frappe Synchronisation (
direction: db_to_frappe):
Importiert Daten von der Datenbank nach Frappe.
Wichtige Felder:- doc_type, db_name, mapping und key_fields: Wie oben.
- Es muss entweder
table_nameoderqueryangegeben werden. Wirdquerygenutzt unduse_last_sync_dateist aktiv, muss zusätzlichquery_with_timestampvorhanden sein. - frappe und db: Pflicht, wenn
use_last_sync_dateaktiv ist (Default: true). - process_all: Boolean, ob alle Datensätze verarbeitet werden sollen (Standard: true).
-
Frappe zu DB Synchronisation (
direction: frappe_to_db):
Exportiert Daten von Frappe in die Datenbank.
Wichtige Felder:- doc_type, db_name, mapping und key_fields: Wie oben.
- table_name: Gibt an, in welche Tabelle die Daten in der Datenbank geschrieben werden sollen (Pflicht).
- db: Enthält u. a.
id_field,manual_id_sequence(Standard: false) und optionalmanual_id_sequence_max.
Zusätzlich gibt es in allen Aufgaben (TaskBase) folgende allgemeine Optionen:
- create_new: Legt fest, ob neue Datensätze angelegt werden (Standard: true).
- use_last_sync_date: Filtert nur geänderte Datensätze anhand der
modified_fields(Standard: true). Dann sindfrappeunddbPflicht. - value_mapping: Optionales Mapping pro Frappe-Feld, um Werte zwischen Frappe und DB zu übersetzen.
- use_strict_value_mapping: Wenn true, werden unbekannte Werte im Mapping verworfen und es wird ein Warning geloggt.
- query_with_timestamp: Muss vorhanden sein, wenn
querygenutzt wird unduse_last_sync_dateaktiv ist.
- dry_run: Wenn auf
truegesetzt, werden keine Änderungen an den Systemen vorgenommen – die Ausführung erfolgt als Simulation. - timestamp_file: Pfad zur Datei, in der Zeitstempel der letzten Synchronisation gespeichert werden. (relativ zum Ordner der config Datei)
- timestamp_buffer_seconds: Zeitpuffer in Sekunden, um zeitliche Ungenauigkeiten bei der Synchronisation zu kompensieren.
- max_success_runs_per_task / max_error_runs_per_task: Maximale Anzahl gespeicherter erfolgreicher bzw. fehlerhafter Runs pro Task. Wenn nicht gesetzt, werden alle Runs behalten.
Die Zeitstempel werden in einer SQLite-DB (data.db per Default) abgelegt. Für jeden Task-Run wird dort zusätzlich ein Run-Eintrag mit den zugehörigen Log-Meldungen gespeichert.
https://github.com/mkleehammer/pyodbc/wiki/Install
pip install -r requirements.txt