diff --git a/nexterp_custom/api.py b/nexterp_custom/api.py new file mode 100644 index 0000000..ff0cb17 --- /dev/null +++ b/nexterp_custom/api.py @@ -0,0 +1,77 @@ +import frappe +import requests +from frappe import _ + +@frappe.whitelist() +def sync_custom_fields_to_woocommerce(item_code): + """Sync Custom Fields vom Item nach WooCommerce (ACF)""" + + if not item_code: + frappe.throw(_("Kein Item Code angegeben")) + + doc = frappe.get_doc("Item", item_code) + + if not doc.get("woocommerce_servers"): + return False + + # Hier die Felder definieren: ERPNext-Feldname : ACF-Feldname in WordPress + field_mapping = { + "custom_zustand2": "zustand2", + # Weitere Felder hier hinzufügen, z.B.: + # "custom_mein_feld": "mein_feld", + # "custom_preisstufe": "preisstufe", + # "custom_bemerkung": "bemerkung", + } + + success_count = 0 + + for wc_link in doc.woocommerce_servers: + if not wc_link.enable_sync or not wc_link.woocommerce_id: + continue + + try: + wc_server = frappe.get_doc("WooCommerce Server", wc_link.woocommerce_server) + + base_url = wc_server.woocommerce_server_url.rstrip("/") + if not base_url.endswith("/wp-json/wc/v3"): + base_url += "/wp-json/wc/v3" + + url = f"{base_url}/products/{wc_link.woocommerce_id}" + auth = (wc_server.api_key, wc_server.api_secret) + + # Aktuelles Produkt holen + resp = requests.get(url, auth=auth, timeout=20) + resp.raise_for_status() + product = resp.json() + + # ACF Daten aufbauen / mergen + acf_data = product.get("acf", {}) + + # Felder übertragen + for erp_field, acf_field in field_mapping.items(): + value = doc.get(erp_field) + if value is not None: + acf_data[acf_field] = value + + payload = {"acf": acf_data} + + # Update an WooCommerce + update_resp = requests.put(url, json=payload, auth=auth, timeout=20) + update_resp.raise_for_status() + + success_count += 1 + + except Exception as e: + frappe.log_error( + "Fehler beim Sync Custom Fields für Item {}: {}".format(item_code, str(e)), + "ACF Custom Fields Sync" + ) + + if success_count > 0: + frappe.msgprint( + "Custom Fields fuer {} WooCommerce-Produkt(e) synchronisiert".format(success_count), + alert=True, + indicator="green" + ) + return True + return False \ No newline at end of file