nexterp_custom/api.py aktualisiert

This commit is contained in:
2026-06-06 19:47:50 +02:00
parent eab408e440
commit 5763b0ef9e
+43 -21
View File
@@ -4,26 +4,30 @@ 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"""
if not item_code: if not item_code:
frappe.throw(_("Kein Item Code angegeben")) frappe.throw(_("Kein Item Code angegeben"))
try:
doc = frappe.get_doc("Item", item_code) doc = frappe.get_doc("Item", item_code)
except Exception:
frappe.throw(_("Item {0} nicht gefunden").format(item_code))
if not doc.get("woocommerce_servers"): if not doc.get("woocommerce_servers"):
frappe.msgprint(_("Item hat keine verknüpften WooCommerce Server"), indicator="orange")
return False return False
# Hier die Felder definieren: ERPNext-Feldname : ACF-Feldname in WordPress # Hier die Felder definieren: ERPNext-Feld : ACF-Feld
field_mapping = { field_mapping = {
"custom_zustand2": "zustand2", "custom_zustand2": "zustand2",
# Weitere Felder hier hinzufügen, z.B.: # Weitere Felder hier hinzufügen:
# "custom_mein_feld": "mein_feld", # "custom_mein_feld": "mein_feld",
# "custom_preisstufe": "preisstufe", # "custom_preisstufe": "preisstufe",
# "custom_bemerkung": "bemerkung",
} }
success_count = 0 success_count = 0
errors = []
for wc_link in doc.woocommerce_servers: for wc_link in doc.woocommerce_servers:
if not wc_link.enable_sync or not wc_link.woocommerce_id: if not wc_link.enable_sync or not wc_link.woocommerce_id:
@@ -32,46 +36,64 @@ def sync_custom_fields_to_woocommerce(item_code):
try: try:
wc_server = frappe.get_doc("WooCommerce Server", wc_link.woocommerce_server) wc_server = frappe.get_doc("WooCommerce Server", wc_link.woocommerce_server)
if not wc_server.api_key or not wc_server.api_secret:
errors.append("WooCommerce Server {} hat keine Zugangsdaten".format(wc_link.woocommerce_server))
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"
url = f"{base_url}/products/{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)
# Aktuelles Produkt holen # Produkt holen
resp = requests.get(url, auth=auth, timeout=20) resp = requests.get(url, auth=auth, timeout=15)
resp.raise_for_status() resp.raise_for_status()
product = resp.json() product = resp.json()
# ACF Daten aufbauen / mergen # ACF Daten mergen
acf_data = product.get("acf", {}) acf_data = product.get("acf", {})
# Felder übertragen updated_fields = 0
for erp_field, acf_field in field_mapping.items(): for erp_field, acf_field in field_mapping.items():
value = doc.get(erp_field) value = doc.get(erp_field)
if value is not None: if value is not None:
acf_data[acf_field] = value acf_data[acf_field] = value
updated_fields += 1
if updated_fields == 0:
continue
payload = {"acf": acf_data} payload = {"acf": acf_data}
# Update an WooCommerce # Update durchführen
update_resp = requests.put(url, json=payload, auth=auth, timeout=20) 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 Exception as e: except requests.exceptions.RequestException as e:
frappe.log_error( error_msg = "API-Fehler fuer Produkt {}: {}".format(wc_link.woocommerce_id, str(e))
"Fehler beim Sync Custom Fields für Item {}: {}".format(item_code, str(e)), errors.append(error_msg)
"ACF Custom Fields Sync" frappe.log_error(error_msg, "WooCommerce ACF Sync")
)
except Exception as e:
error_msg = "Unerwarteter Fehler fuer Item {} / WC-ID {}: {}".format(item_code, wc_link.woocommerce_id, str(e))
errors.append(error_msg)
frappe.log_error(error_msg, "WooCommerce ACF Sync")
# Zusammenfassung
if success_count > 0: if success_count > 0:
frappe.msgprint( msg = "Custom Fields fuer {} WooCommerce-Produkt(e) erfolgreich synchronisiert".format(success_count)
"Custom Fields fuer {} WooCommerce-Produkt(e) synchronisiert".format(success_count), if errors:
alert=True, msg += " ({} Fehler)".format(len(errors))
indicator="green" frappe.msgprint(msg, alert=True, indicator="green")
)
return True return True
else:
if errors:
frappe.msgprint("Fehler beim Sync:\n" + "\n".join(errors[:3]), indicator="red")
else:
frappe.msgprint("Keine Felder wurden synchronisiert.", indicator="orange")
return False return False