Kunden mit Adresse(n) und Kontakt(en) zu importieren, kann unintuitiv sein.
Daher hier etwas Beispielcode (Python), zur Nutzung in der “Systemkonsole” (System Console):
#======================
#Use in Systemkonsole
if True:
#for row in Kundentabelle:
import_name = 'TEST Vorname Nachname'
Kundennummer_alt = '1234'
Kundennummer = 'KdRnd-1234'
Strasse = "Straße 57"
Postleitzahl = "80815"
Ort = "Wundertüte"
Land = "Deutschland"
land = {'Deutschland': 'Germany', 'Frankreich': 'France', 'Belgien': 'Belgium'}
customer = frappe.get_doc({
'doctype': 'Customer',
'customer_name': import_name,
'customer_type': 'Individual',
'disabled': True,
'customer_details': f'Kundennummer Altsystem: {Kundennummer_alt}' #+++
}).insert()
print('Created:', customer.name, customer)
frappe.rename_doc('Customer', customer.name, Kundennummer)
print('Renamed:', customer.name, customer)
address_links = [{
'link_doctype': 'Customer',
'link_name': Kundennummer,
'link_title': 'Test Arbitrary Title'
}]
customer_address_billing = frappe.get_doc({
'doctype': 'Address',
'address_title': import_name, # bekommt Suffix '-Abrechnung'
'address_type': 'Billing',
'address_line1': import_name,
'address_line2': Strasse,
'pincode': Postleitzahl,
'city': Ort,
'country': land[Land],
'is_primary_address': True,
'links': address_links
}).insert()
print('customer_address_billing', customer_address_billing.name, customer_address_billing)
customer_address_shipping = frappe.get_doc({
'doctype': 'Address',
'address_title': import_name, # bekommt Suffix '-Versand'
'address_type': 'Shipping',
'address_line1': import_name,
'address_line2': Strasse,
'pincode': Postleitzahl,
'city': Ort,
'country': land[Land],
'is_shipping_address': True,
'links': address_links
}).insert()
print('customer_address_shipping', customer_address_shipping.name, customer_address_shipping)
Die prints dienen der Kontrolle während des Übens.
Die Ausgabe sieht so aus:
Ausgabe
Created: CUST-2025-00011 Customer(CUST-2025-00011)
Renamed: CUST-2025-00011 Customer(CUST-2025-00011)
customer_address_billing TEST Vorname Nachname-Abrechnung ERPNextAddress(TEST Vorname Nachname-Abrechnung)
customer_address_shipping TEST Vorname Nachname-Versand ERPNextAddress(TEST Vorname Nachname-Versand)
Ohne Markieren von “Verpflichten” erhält man nur den print-Output und eventuelle Fehler des Scripts.
Zum tatsächlichen Importieren muss “Verpflichten” (AI/Pauschal-Übersetzung von “Commit”) markiert werden, damit die Datenbank-Transaktionen nicht gleich wieder zurückgerollt werden.
Dann kann der importierte (Test-)Kunde in der Liste des entsprechenden DocTypes angeschaut werden; er ist deaktiviert (die Adressen jedoch nicht).
Wie man dann sieht, hat der Kunde als “name” (ID) dort auch die neue Kundennummer (aufgrund der Umbenennung) und kann mit dem relativen URL /app/customer/KdRnd-1234 aufgerufen werden, obwohl das print-Statement nach dem rename dies nicht wiedergibt.
Viel Erfolg bei Importieren derlei verlinkter Objekte!