Files
westech-r2/westech_r2/import_customer_interactions.py

108 lines
4.7 KiB
Python

import frappe
import csv
def create_customer_interaction_doctype():
"""Create Customer Interaction DocType if it doesn't exist"""
if frappe.db.exists("DocType", "Customer Interaction"):
print("Customer Interaction DocType already exists")
return
doc = frappe.get_doc({
"doctype": "DocType",
"module": "Westech R2",
"name": "Customer Interaction",
"title_field": "contact_name",
"autoname": "autoincrement",
"naming_rule": "Autoincrement",
"track_changes": 1,
"track_seen": 1,
"fields": [
{"label": "Customer", "fieldname": "customer", "fieldtype": "Link", "options": "Customer", "in_list_view": 1, "reqd": 1, "in_standard_filter": 1},
{"label": "Customer Number", "fieldname": "customer_number", "fieldtype": "Data", "in_list_view": 1, "in_standard_filter": 1},
{"label": "Contact Name", "fieldname": "contact_name", "fieldtype": "Data", "in_list_view": 1},
{"label": "Phone 1", "fieldname": "phone_1", "fieldtype": "Data"},
{"label": "Phone 2", "fieldname": "phone_2", "fieldtype": "Data"},
{"label": "Email 1", "fieldname": "email_1", "fieldtype": "Data"},
{"label": "Email 2", "fieldname": "email_2", "fieldtype": "Data"},
{"label": "Address", "fieldname": "address", "fieldtype": "Text"},
{"label": "City", "fieldname": "city", "fieldtype": "Data"},
{"label": "Zip", "fieldname": "zip", "fieldtype": "Data"},
{"label": "Hours", "fieldname": "hours", "fieldtype": "Data"},
{"label": "Notes", "fieldname": "notes", "fieldtype": "Text"},
{"label": "Red R2", "fieldname": "red_r2", "fieldtype": "Data", "in_standard_filter": 1},
{"label": "DNC", "fieldname": "dnc", "fieldtype": "Check"},
{"label": "Raw Name", "fieldname": "raw_name", "fieldtype": "Text"},
{"label": "Raw Phone 1", "fieldname": "raw_phone1", "fieldtype": "Data"},
{"label": "Raw Phone 2", "fieldname": "raw_phone2", "fieldtype": "Data"},
{"label": "Raw Email", "fieldname": "raw_email", "fieldtype": "Data"},
]
})
doc.insert()
frappe.db.commit()
print(f"Created Customer Interaction DocType")
def import_contacts(csv_path):
"""Import contacts from CSV file"""
count = 0
errors = 0
with open(csv_path, 'r', encoding='utf-8') as f:
reader = csv.DictReader(f)
for row in reader:
try:
# Find customer by customer_number
customer = frappe.db.get_value("Customer", {"customer_number": row['customer_number']}, "name")
if not customer:
# Customer doesn't exist yet, skip or create placeholder
errors += 1
continue
interaction = frappe.get_doc({
"doctype": "Customer Interaction",
"customer": customer,
"customer_number": row['customer_number'],
"contact_name": row.get('contact_name', ''),
"phone_1": row.get('phone_1', ''),
"phone_2": row.get('phone_2', ''),
"email_1": row.get('email_1', ''),
"email_2": row.get('email_2', ''),
"address": row.get('address', ''),
"city": row.get('city', ''),
"zip": row.get('zip', ''),
"hours": row.get('hours', ''),
"notes": row.get('notes', ''),
"red_r2": row.get('red_r2', ''),
"dnc": 1 if row.get('dnc', '').strip() else 0,
"raw_name": row.get('raw_name', ''),
"raw_phone1": row.get('raw_phone1', ''),
"raw_phone2": row.get('raw_phone2', ''),
"raw_email": row.get('raw_email', '')
})
interaction.insert()
count += 1
if count % 500 == 0:
frappe.db.commit()
print(f"Imported {count} interactions...")
except Exception as e:
errors += 1
if errors < 10:
print(f"Error importing row {count}: {e}")
frappe.db.commit()
print(f"Import complete: {count} interactions imported, {errors} errors")
if __name__ == "__main__":
frappe.init(site="erpnext.local")
frappe.connect()
try:
create_customer_interaction_doctype()
import_contacts("/home/frappe/erpnext-bench/apps/westech_r2/westech_r2/crm_contacts_clean.csv")
finally:
frappe.destroy()