Kunden aus Shopware automatisch in ERPNext anlegen #28
Labels
No labels
API
Artikel
B2B
B2C
Bestandssync
Bestellungen
DACH
DocType
Dokumentation
Grundgerüst
Import
Kategorien
Kunden
Lager
Mapping
Mehrsprachigkeit
Performance
Preise
Push
Scheduler
Schweiz
Steuern
Storefront
Sync
Varianten
Verbindung
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
Frappe-Projekte/ecommerce_integrations#28
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Beim Bestellungsimport den Shopware-Kunden automatisch als ERPNext Customer anlegen:
shopware6/api/customer.pyUmsetzung
Ersetzt #27s bisherigen reinen E-Mail-Lookup durch echte Resolve-oder-Anlegen-Logik. Keine zusätzlichen Shopware-API-Aufrufe nötig — #27 lädt
orderCustomer/billingAddress/deliveries[].shippingOrderAddressbereits vollständig.Wichtigster Fund vor dem Bauen: Dieses Repo hat bereits eine geteilte Basisklasse
EcommerceCustomer(ecommerce_integrations/controllers/customer.py), die auch der bestehende Shopify-Connector nutzt.shopware6/customer.py:ShopwareCustomerist nur eine dünne Unterklasse davon — kein neuer Mechanismus.Auflösungsreihenfolge in
get_or_create_customer(order_data, storefront):shopware_customer_id(Custom Field, primärer Schlüssel).Contact Email→Dynamic Link) — bei Treffer wirdshopware_customer_idnachgetragen, keine Dublette.customer_type/tax_idwiederverwenden #25sdetermine_customer_tax_treatment(). Fehlende Straße/Stadt im Adress-Payload wirftfrappe.throw()— keine erfundenen Platzhalter.Zwei echte Bugs live gefunden und behoben
Selling Settings.customer_group-Fallback war unmöglich:get_root_of("Customer Group")liefert immer den Wurzelknoten, der per Nested-Set-Definition ein Gruppen-Typ ist — ERPNext-Core lehnt das fürCustomer.customer_groupgrundsätzlich ab. Kein sicherer generischer Fallback existiert. Fix: fail-loud statt raten —Selling Settings > Standard-Kundengruppemuss auf eine echte Blattgruppe konfiguriert sein, sonst klare Fehlermeldung.Upstream-Bug in der geteilten Basisklasse
EcommerceCustomer.sync_customer():"customer_type": _("Individual")übersetzt den Wert vor dem Speichern — auf einer deutschsprachigen Site wird literal"Einzelperson"gespeichert, was ERPNext-Core ablehnt (die Select-Optionen bleiben unübersetzt englisch). Betrifft nicht nur Shopware, sondern jeden Connector aufEcommerceCustomer(auch Shopify) auf jeder nicht-englischen Site. Da wir noch keinen PR an Frappe senden und uns weiter mit Upstream syncen: nicht in der geteilten Basisklasse gefixt. Stattdessen: Issue #34 bei uns + frappe/ecommerce_integrations#465 upstream, lokaler Override inshopware6/customer.pybis der Fix übernommen ist.Eigener Bug (nicht upstream): ERPNext legt beim Speichern eines Customers mit gesetzter
email_idautomatisch selbst einen Contact an (Customer.on_update() → create_primary_contact()) — führte zu doppelten Contacts pro neuem Kunden. Fix:Customer.email_idbewusst nicht setzen, da die eigene E-Mail-Dedup-Logik ohnehin dieContact Email-Tabelle liest.Live-Verifikation
Alle Fälle gegen die echte Testbench durchgespielt, jeweils in einer separaten Konsolen-Session unabhängig nachgeprüft: neuer B2C-Kunde, neuer B2B-Kunde (Firma + USt-IdNr., abweichende Lieferadresse → zwei Adressen), Dedup per
shopware_customer_id, E-Mail-Backfill auf bestehenden Kunden, Fail-loud bei fehlender Straße/Stadt, identische Rechnungs-/Lieferadresse → nur eine Address, sowie ein vollerimport_orders()-Lauf, der bei unbekanntem Kunden jetzt korrekt eine Sales Order statt eines Skips erzeugt. Alle Testdaten anschließend gelöscht und unabhängig als entfernt bestätigt.Details: docs/architecture.md#issue-28