add sales order generation functionality
This commit is contained in:
parent
796b835c08
commit
9c9050c558
13 changed files with 289 additions and 143 deletions
|
|
@ -1,5 +1,8 @@
|
|||
import frappe, json
|
||||
from custom_ui.db_utils import build_error_response, process_query_conditions, build_datatable_dict, get_count_or_filters, build_success_response, map_lead_client
|
||||
from custom_ui.db_utils import build_error_response, process_query_conditions, build_datatable_dict, get_count_or_filters, build_success_response, map_lead_client, build_address_title
|
||||
from erpnext.crm.doctype.lead.lead import make_customer
|
||||
from custom_ui.api.db.addresses import address_exists, create_address, create_address_links
|
||||
from custom_ui.api.db.contacts import check_and_get_contact, create_contact, create_contact_links
|
||||
|
||||
# ===============================================================================
|
||||
# CLIENT MANAGEMENT API METHODS
|
||||
|
|
@ -94,15 +97,9 @@ def get_client(client_name):
|
|||
print("DEBUG: get_client called with client_name:", client_name)
|
||||
try:
|
||||
clientData = {"addresses": [], "contacts": [], "jobs": [], "sales_invoices": [], "payment_entries": [], "sales_orders": [], "tasks": []}
|
||||
client_exists = frappe.db.exists("Customer", client_name)
|
||||
if client_exists:
|
||||
customer = frappe.get_doc("Customer", client_name)
|
||||
else:
|
||||
print("DEBUG: Client not found as Customer. Checking Lead.")
|
||||
lead_name = frappe.db.get_all("Lead", pluck="name", filters={"lead_name": client_name})[0]
|
||||
customer = frappe.get_doc("Lead", lead_name)
|
||||
if not customer:
|
||||
return build_error_response(f"Client '{client_name}' not found as Customer or Lead.", 404)
|
||||
customer = check_and_get_client_doc(client_name)
|
||||
if not customer:
|
||||
return build_error_response(f"Client with name '{client_name}' does not exist.", 404)
|
||||
print("DEBUG: Retrieved customer/lead document:", customer.as_dict())
|
||||
clientData = {**clientData, **customer.as_dict()}
|
||||
if customer.doctype == "Lead":
|
||||
|
|
@ -117,7 +114,7 @@ def get_client(client_name):
|
|||
"Dynamic Link",
|
||||
filters={
|
||||
"link_doctype": "Lead",
|
||||
"link_name": lead_name,
|
||||
"link_name": customer.name,
|
||||
"parenttype": ["in", ["Address", "Contact"]],
|
||||
},
|
||||
fields=[
|
||||
|
|
@ -218,67 +215,55 @@ def upsert_client(data):
|
|||
"""Create or update a client (customer and address)."""
|
||||
try:
|
||||
data = json.loads(data)
|
||||
print("#####DEBUG: Upsert client data received:", data)
|
||||
if address_exists(
|
||||
data.get("address_line1"),
|
||||
data.get("address_line2"),
|
||||
data.get("city"),
|
||||
data.get("state"),
|
||||
data.get("pincode")
|
||||
):
|
||||
return build_error_response("This address already exists. Please use a different address or search for the address to find the associated client.", 400)
|
||||
|
||||
# Handle customer creation/update
|
||||
print("#####DEBUG: Upsert client data received:", data)
|
||||
|
||||
print("#####DEBUG: Checking for existing customer with name:", data.get("customer_name"))
|
||||
customer = frappe.db.exists("Customer", {"customer_name": data.get("customer_name")})
|
||||
|
||||
if not customer:
|
||||
print("#####DEBUG: No existing customer found. Checking for existing lead")
|
||||
customer = frappe.db.exists("Lead", {"lead_name": data.get("customer_name")})
|
||||
if not customer:
|
||||
print("#####DEBUG: No existing lead found. Creating new lead.")
|
||||
primary_contact = next((c for c in data.get("contacts", []) if c.get("is_primary")), None)
|
||||
if not primary_contact:
|
||||
return build_error_response("Primary contact information is required to create a new customer.", 400)
|
||||
print("#####DEBUG: Primary contact found:", primary_contact)
|
||||
client_doc = create_lead({
|
||||
"lead_name": data.get("customer_name"),
|
||||
"first_name": primary_contact.get("first_name"),
|
||||
"last_name": primary_contact.get("last_name"),
|
||||
"email_id": primary_contact.get("email"),
|
||||
"phone": primary_contact.get("phone_number"),
|
||||
"customer_type": data.get("customer_type"),
|
||||
"company": data.get("company")
|
||||
})
|
||||
else:
|
||||
print("#####DEBUG: Existing lead found:", customer)
|
||||
client_doc = frappe.get_doc("Lead", customer)
|
||||
else:
|
||||
print("#####DEBUG: Existing customer found:", customer)
|
||||
|
||||
if not customer:
|
||||
print("#####DEBUG: No existing lead found. Creating new lead.")
|
||||
is_individual = data.get("customer_type") == "Individual"
|
||||
|
||||
primary_contact = next((c for c in data.get("contacts", []) if c.get("is_primary")), None)
|
||||
if not primary_contact:
|
||||
return build_error_response("Primary contact information is required to create a new customer.", 400)
|
||||
print("#####DEBUG: Primary contact found:", primary_contact)
|
||||
|
||||
new_lead_data = {
|
||||
"doctype": "Lead",
|
||||
"lead_name": data.get("customer_name"),
|
||||
"first_name": primary_contact.get("first_name"),
|
||||
"last_name": primary_contact.get("last_name"),
|
||||
"email_id": primary_contact.get("email"),
|
||||
"phone": primary_contact.get("phone_number"),
|
||||
"customer_type": data.get("customer_type"),
|
||||
"company": data.get("company")
|
||||
}
|
||||
print("#####DEBUG: New lead data prepared:", new_lead_data)
|
||||
new_client_doc = frappe.get_doc(new_lead_data).insert(ignore_permissions=True)
|
||||
else:
|
||||
new_client_doc = frappe.get_doc("Customer", data.get("customer_name"))
|
||||
print(f"#####DEBUG: {new_client_doc.doctype}:", new_client_doc.as_dict())
|
||||
client_doc = frappe.get_doc("Customer", customer)
|
||||
print(f"#####DEBUG: {client_doc.doctype}:", client_doc.as_dict())
|
||||
|
||||
# Handle address creation
|
||||
print("#####DEBUG: Checking for existing address for customer/lead:", data.get("customer_name"))
|
||||
existing_address = frappe.db.exists(
|
||||
"Address",
|
||||
{
|
||||
"address_line1": data.get("address_line1"),
|
||||
"city": data.get("city"),
|
||||
"state": data.get("state"),
|
||||
})
|
||||
print("Existing address check:", existing_address)
|
||||
if existing_address:
|
||||
return build_error_response("Address already exists for this customer.", 400)
|
||||
address_doc = frappe.get_doc({
|
||||
"doctype": "Address",
|
||||
"address_title": data.get("address_title"),
|
||||
address_doc = create_address({
|
||||
"address_title": build_address_title(data.get("customer_name"), data),
|
||||
"address_line1": data.get("address_line1"),
|
||||
"address_line2": data.get("address_line2"),
|
||||
"city": data.get("city"),
|
||||
"state": data.get("state"),
|
||||
"country": "United States",
|
||||
"pincode": data.get("pincode")
|
||||
}).insert(ignore_permissions=True)
|
||||
print("Address:", address_doc.as_dict())
|
||||
})
|
||||
|
||||
#Handle contact creation
|
||||
contact_docs = []
|
||||
|
|
@ -286,19 +271,22 @@ def upsert_client(data):
|
|||
if isinstance(contact_data, str):
|
||||
contact_data = json.loads(contact_data)
|
||||
print("#####DEBUG: Processing contact data:", contact_data)
|
||||
contact_exists = frappe.db.exists("Contact", {"email_id": contact_data.get("email"), "phone": contact_data.get("phone_number")})
|
||||
print("Contact exists check:", contact_exists)
|
||||
if not contact_exists:
|
||||
contact_doc = frappe.get_doc({
|
||||
"doctype": "Contact",
|
||||
contact_doc = check_and_get_contact(
|
||||
contact_data.get("first_name"),
|
||||
contact_data.get("last_name"),
|
||||
contact_data.get("email"),
|
||||
contact_data.get("phone_number")
|
||||
)
|
||||
if not contact_doc:
|
||||
print("#####DEBUG: No existing contact found. Creating new contact.")
|
||||
contact_doc = create_contact({
|
||||
"first_name": contact_data.get("first_name"),
|
||||
"last_name": contact_data.get("last_name"),
|
||||
# "email_id": contact_data.get("email"),
|
||||
# "phone": contact_data.get("phone_number"),
|
||||
"custom_customer": customer_doc.name,
|
||||
"role": contact_data.get("contact_role", "Other"),
|
||||
"custom_email": contact_data.get("email"),
|
||||
"is_primary_contact":1 if data.get("is_primary", False) else 0,
|
||||
"is_primary_contact":1 if contact_data.get("is_primary", False) else 0,
|
||||
"email_ids": [{
|
||||
"email_id": contact_data.get("email"),
|
||||
"is_primary": 1
|
||||
|
|
@ -308,85 +296,37 @@ def upsert_client(data):
|
|||
"is_primary_mobile_no": 1,
|
||||
"is_primary_phone": 1
|
||||
}]
|
||||
}).insert(ignore_permissions=True)
|
||||
print("Created new contact:", contact_doc.as_dict())
|
||||
else:
|
||||
contact_doc = frappe.get_doc("Contact", {"email_id": contact_data.get("email"), "phone": contact_data.get("phone_number")})
|
||||
print("Contact already exists:", contact_doc.as_dict())
|
||||
})
|
||||
contact_docs.append(contact_doc)
|
||||
|
||||
##### Create links
|
||||
# Customer -> Address
|
||||
if new_client_doc.doctype == "Customer":
|
||||
print("#####DEBUG: Creating links between customer, address, and contacts.")
|
||||
new_client_doc.append("custom_select_address", {
|
||||
if client_doc.doctype == "Customer":
|
||||
print("#####DEBUG: Linking address to customer.")
|
||||
client_doc.append("custom_select_address", {
|
||||
"address_name": address_doc.name,
|
||||
"address_line_1": address_doc.address_line1,
|
||||
"city": address_doc.city,
|
||||
"state": address_doc.state,
|
||||
"pincode": address_doc.pincode
|
||||
})
|
||||
|
||||
# Customer -> Contact
|
||||
print("#####DEBUG: Linking contacts to customer.")
|
||||
for contact_doc in contact_docs:
|
||||
print("Linking contact:", contact_doc.as_dict())
|
||||
print("with role:", contact_doc.role)
|
||||
print("customer to append to:", new_client_doc.as_dict())
|
||||
new_client_doc.append("custom_add_contacts", {
|
||||
client_doc.append("custom_add_contacts", {
|
||||
"contact": contact_doc.name,
|
||||
"email": contact_doc.custom_email,
|
||||
"phone": contact_doc.phone,
|
||||
"role": contact_doc.role
|
||||
})
|
||||
new_client_doc.append("links", {
|
||||
"link_doctype": "Contact",
|
||||
"link_name": contact_doc.name
|
||||
}
|
||||
)
|
||||
new_client_doc.save(ignore_permissions=True)
|
||||
client_doc.save(ignore_permissions=True)
|
||||
|
||||
# Address -> Customer/Lead
|
||||
print("#####DEBUG: Linking address to customer.")
|
||||
address_doc.append("links", {
|
||||
"link_doctype": new_client_doc.doctype,
|
||||
"link_name": new_client_doc.name
|
||||
})
|
||||
if new_client_doc.doctype == "Lead":
|
||||
address_doc.lead_name = new_client_doc.lead_name
|
||||
|
||||
|
||||
# Address -> Contact
|
||||
print("#####DEBUG: Linking address to contacts.")
|
||||
address_doc.custom_contact = next((c.name for c in contact_docs if c.is_primary_contact), contact_docs[0].name)
|
||||
for contact_doc in contact_docs:
|
||||
address_doc.append("custom_linked_contacts", {
|
||||
"contact": contact_doc.name,
|
||||
"email": contact_doc.email_id,
|
||||
"phone": contact_doc.phone,
|
||||
"role": contact_doc.role
|
||||
})
|
||||
|
||||
address_doc.save(ignore_permissions=True)
|
||||
create_address_links(address_doc, client_doc, contact_docs)
|
||||
|
||||
# Contact -> Customer/Lead & Address
|
||||
print("#####DEBUG: Linking contacts to customer.")
|
||||
for contact_doc in contact_docs:
|
||||
contact_doc.address = address_doc.name
|
||||
contact_doc.append("links", {
|
||||
"link_doctype": new_client_doc.doctype,
|
||||
"link_name": new_client_doc.name
|
||||
})
|
||||
contact_doc.append("links", {
|
||||
"link_doctype": "Address",
|
||||
"link_name": address_doc.name
|
||||
})
|
||||
contact_doc.custom_customer = new_client_doc.name
|
||||
contact_doc.save(ignore_permissions=True)
|
||||
create_contact_links(contact_docs, client_doc, address_doc)
|
||||
|
||||
frappe.local.message_log = []
|
||||
return build_success_response({
|
||||
"customer": new_client_doc.as_dict(),
|
||||
"customer": client_doc.as_dict(),
|
||||
"address": address_doc.as_dict(),
|
||||
"contacts": [contact_doc.as_dict() for contact_doc in contact_docs]
|
||||
})
|
||||
|
|
@ -402,7 +342,48 @@ def get_client_names(search_term):
|
|||
search_pattern = f"%{search_term}%"
|
||||
client_names = frappe.db.get_all(
|
||||
"Customer",
|
||||
filters={"customer_name": ["like", search_pattern]},
|
||||
pluck="name")
|
||||
return build_success_response(client_names)
|
||||
except Exception as e:
|
||||
return build_error_response(str(e), 500)
|
||||
|
||||
def check_if_customer(client_name):
|
||||
"""Check if the given client name corresponds to a Customer."""
|
||||
return frappe.db.exists("Customer", client_name) is not None
|
||||
|
||||
def check_and_get_client_doc(client_name):
|
||||
"""Check if a client exists as Customer or Lead and return the document."""
|
||||
print("DEBUG: Checking for existing client with name:", client_name)
|
||||
customer = None
|
||||
if check_if_customer(client_name):
|
||||
print("DEBUG: Client found as Customer.")
|
||||
customer = frappe.get_doc("Customer", client_name)
|
||||
else:
|
||||
print("DEBUG: Client not found as Customer. Checking Lead.")
|
||||
lead_name = frappe.db.get_all("Lead", pluck="name", filters={"lead_name": client_name})
|
||||
if lead_name:
|
||||
print("DEBUG: Client found as Lead.")
|
||||
customer = frappe.get_doc("Lead", lead_name[0])
|
||||
return customer
|
||||
|
||||
def convert_lead_to_customer(lead_name):
|
||||
lead = frappe.get_doc("Lead", lead_name)
|
||||
customer = make_customer(lead)
|
||||
customer.insert(ignore_permissions=True)
|
||||
|
||||
|
||||
def create_lead(lead_data):
|
||||
lead = frappe.get_doc({
|
||||
"doctype": "Lead",
|
||||
**lead_data
|
||||
})
|
||||
lead.insert(ignore_permissions=True)
|
||||
return lead
|
||||
|
||||
def get_customer_or_lead(client_name):
|
||||
if check_if_customer(client_name):
|
||||
return frappe.get_doc("Customer", client_name)
|
||||
else:
|
||||
lead_name = frappe.db.get_all("Lead", pluck="name", filters={"lead_name": client_name})[0]
|
||||
return frappe.get_doc("Lead", lead_name)
|
||||
Loading…
Add table
Add a link
Reference in a new issue