Importieren von Kunden mit Adressen per py-Script in Systemkonsole

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!