This commit is contained in:
Jens Falk
2026-06-06 20:46:13 +02:00
parent 18555bf5bb
commit 324e8cadf7
2 changed files with 6 additions and 17 deletions
+5 -16
View File
@@ -4,8 +4,7 @@ from frappe import _
@frappe.whitelist() @frappe.whitelist()
def sync_custom_fields_to_woocommerce(item_code): def sync_custom_fields_to_woocommerce(item_code):
"""Sync Custom Fields vom Item nach WooCommerce ACF """Sync Custom Fields vom Item nach WooCommerce ACF (dynamisch)"""
Liest die Zuordnungen dynamisch aus dem DocType 'WooCommerce ACF Mapping'"""
if not item_code: if not item_code:
frappe.throw(_("Kein Item Code angegeben")) frappe.throw(_("Kein Item Code angegeben"))
@@ -19,7 +18,7 @@ def sync_custom_fields_to_woocommerce(item_code):
frappe.msgprint(_("Item hat keine verknüpften WooCommerce Server"), indicator="orange") frappe.msgprint(_("Item hat keine verknüpften WooCommerce Server"), indicator="orange")
return False return False
# Dynamisches Mapping aus dem DocType laden # Dynamisches Mapping aus DocType laden
field_mapping = {} field_mapping = {}
mappings = frappe.get_all("WooCommerce ACF Mapping", mappings = frappe.get_all("WooCommerce ACF Mapping",
filters={"enabled": 1}, filters={"enabled": 1},
@@ -30,7 +29,7 @@ def sync_custom_fields_to_woocommerce(item_code):
field_mapping[m.erp_field] = m.acf_field field_mapping[m.erp_field] = m.acf_field
if not field_mapping: if not field_mapping:
frappe.msgprint(_("Keine aktivierten Mappings im DocType 'WooCommerce ACF Mapping' gefunden"), frappe.msgprint(_("Keine aktivierten Mappings im DocType 'WooCommerce ACF Mapping' gefunden."),
indicator="orange") indicator="orange")
return False return False
@@ -48,7 +47,6 @@ def sync_custom_fields_to_woocommerce(item_code):
errors.append("WooCommerce Server {} hat keine Zugangsdaten".format(wc_link.woocommerce_server)) errors.append("WooCommerce Server {} hat keine Zugangsdaten".format(wc_link.woocommerce_server))
continue continue
# Basis URL vorbereiten
base_url = wc_server.woocommerce_server_url.rstrip("/") base_url = wc_server.woocommerce_server_url.rstrip("/")
if not base_url.endswith("/wp-json/wc/v3"): if not base_url.endswith("/wp-json/wc/v3"):
base_url += "/wp-json/wc/v3" base_url += "/wp-json/wc/v3"
@@ -56,12 +54,10 @@ def sync_custom_fields_to_woocommerce(item_code):
url = "{}/products/{}".format(base_url, wc_link.woocommerce_id) url = "{}/products/{}".format(base_url, wc_link.woocommerce_id)
auth = (wc_server.api_key, wc_server.api_secret) auth = (wc_server.api_key, wc_server.api_secret)
# Produkt holen
resp = requests.get(url, auth=auth, timeout=15) resp = requests.get(url, auth=auth, timeout=15)
resp.raise_for_status() resp.raise_for_status()
product = resp.json() product = resp.json()
# ACF Daten mergen
acf_data = product.get("acf", {}) acf_data = product.get("acf", {})
updated_fields = 0 updated_fields = 0
@@ -76,27 +72,20 @@ def sync_custom_fields_to_woocommerce(item_code):
payload = {"acf": acf_data} payload = {"acf": acf_data}
# Update durchführen
update_resp = requests.put(url, json=payload, auth=auth, timeout=15) update_resp = requests.put(url, json=payload, auth=auth, timeout=15)
update_resp.raise_for_status() update_resp.raise_for_status()
success_count += 1 success_count += 1
except requests.exceptions.RequestException as e:
error_msg = "API-Fehler für Produkt {}: {}".format(wc_link.woocommerce_id, str(e))
errors.append(error_msg)
frappe.log_error(error_msg, "WooCommerce ACF Sync")
except Exception as e: except Exception as e:
error_msg = "Unerwarteter Fehler für Item {} / WC-ID {}: {}".format(item_code, wc_link.woocommerce_id, str(e)) error_msg = "Fehler für Item {} / WC-ID {}: {}".format(item_code, wc_link.woocommerce_id, str(e))
errors.append(error_msg) errors.append(error_msg)
frappe.log_error(error_msg, "WooCommerce ACF Sync") frappe.log_error(error_msg, "WooCommerce ACF Sync")
# Zusammenfassung
if success_count > 0: if success_count > 0:
msg = "Custom Fields für {} WooCommerce-Produkt(e) erfolgreich synchronisiert".format(success_count) msg = "Custom Fields für {} WooCommerce-Produkt(e) erfolgreich synchronisiert".format(success_count)
if errors: if errors:
msg += " ({} Fehler aufgetreten)".format(len(errors)) msg += " ({} Fehler)".format(len(errors))
frappe.msgprint(msg, alert=True, indicator="green") frappe.msgprint(msg, alert=True, indicator="green")
return True return True
else: else:
+1 -1
View File
@@ -1,7 +1,7 @@
[project] [project]
name = "erpnext_custom" name = "erpnext_custom"
version = "0.0.1" version = "0.0.1"
description = "Custom App für NEXTErp" description = "Custom App für NEXTErp - WooCommerce ACF Sync"
readme = "README.md" readme = "README.md"
requires-python = ">=3.10" requires-python = ">=3.10"