big update
This commit is contained in:
parent
d53ebf9ecd
commit
5c7e93fcc7
26 changed files with 1890 additions and 423 deletions
|
|
@ -1,8 +1,9 @@
|
|||
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, 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.addresses import address_exists
|
||||
from custom_ui.api.db.contacts import check_and_get_contact, create_contact, create_contact_links
|
||||
from custom_ui.services import AddressService, ContactService, ClientService
|
||||
|
||||
# ===============================================================================
|
||||
# CLIENT MANAGEMENT API METHODS
|
||||
|
|
@ -96,7 +97,7 @@ def get_client(client_name):
|
|||
"""Get detailed information for a specific client including address, customer, and projects."""
|
||||
print("DEBUG: get_client called with client_name:", client_name)
|
||||
try:
|
||||
clientData = {"addresses": [], "contacts": [], "jobs": [], "sales_invoices": [], "payment_entries": [], "sales_orders": [], "tasks": []}
|
||||
clientData = {"addresses": [], "contacts": [], "jobs": [], "sales_invoices": [], "payment_entries": [], "tasks": []}
|
||||
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)
|
||||
|
|
@ -142,6 +143,30 @@ def get_client(client_name):
|
|||
return build_error_response(str(ve), 400)
|
||||
except Exception as e:
|
||||
return build_error_response(str(e), 500)
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_client_v2(client_name):
|
||||
"""Get detailed information for a specific client including address, customer, and projects."""
|
||||
print("DEBUG: get_client_v2 called with client_name:", client_name)
|
||||
try:
|
||||
clientData = {"addresses": [], "jobs": [], "payment_entries": [], "tasks": []}
|
||||
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()}
|
||||
clientData["contacts"] = [ContactService.get_or_throw(link.contact) for link in clientData["contacts"]]
|
||||
clientData["addresses"] = [AddressService.get_or_throw(link.address) for link in clientData["properties"]]
|
||||
if clientData["doctype"] == "Lead":
|
||||
clientData["customer_name"] = customer.custom_customer_name
|
||||
|
||||
# TODO: Continue getting other linked docs like jobs, invoices, etc.
|
||||
print("DEBUG: Final client data prepared:", clientData)
|
||||
return build_success_response(clientData)
|
||||
except frappe.ValidationError as ve:
|
||||
return build_error_response(str(ve), 400)
|
||||
except Exception as e:
|
||||
return build_error_response(str(e), 500)
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
|
|
@ -189,8 +214,7 @@ def get_clients_table_data(filters={}, sortings=[], page=1, page_size=10):
|
|||
customer_links = [link for link in links if link.link_doctype == "Lead"] if links else None
|
||||
is_lead = True if customer_links else False
|
||||
if not customer_name and not customer_links:
|
||||
print("DEBUG: No customer links found and no customer to bill.")
|
||||
customer_name = "N/A"
|
||||
customer_name = frappe.get_value("Lead", address.get("customer_name"), "custom_customer_name")
|
||||
elif not customer_name and customer_links:
|
||||
print("DEBUG: No customer to bill. Customer links found:", customer_links)
|
||||
customer_name = frappe.get_value("Lead", customer_links[0].link_name, "custom_customer_name") if is_lead else customer_links[0].link_name
|
||||
|
|
@ -202,9 +226,9 @@ def get_clients_table_data(filters={}, sortings=[], page=1, page_size=10):
|
|||
f"{address['city']}, {address['state']} {address['pincode']}"
|
||||
)
|
||||
tableRow["client_type"] = "Lead" if is_lead else "Customer"
|
||||
tableRow["appointment_scheduled_status"] = address.custom_onsite_meeting_scheduled
|
||||
tableRow["estimate_sent_status"] = address.custom_estimate_sent_status
|
||||
tableRow["job_status"] = address.custom_job_status
|
||||
# tableRow["appointment_scheduled_status"] = address.custom_onsite_meeting_scheduled
|
||||
# tableRow["estimate_sent_status"] = address.custom_estimate_sent_status
|
||||
# tableRow["job_status"] = address.custom_job_status
|
||||
tableRow["payment_received_status"] = address.custom_payment_received_status
|
||||
tableRows.append(tableRow)
|
||||
tableDataDict = build_datatable_dict(data=tableRows, count=count, page=page, page_size=page_size)
|
||||
|
|
@ -256,19 +280,21 @@ def upsert_client(data):
|
|||
|
||||
customer_name = data.get("customer_name")
|
||||
contacts = data.get("contacts", [])
|
||||
addresses = data.get("addresses", [])
|
||||
|
||||
# Check for existing address
|
||||
client_doc = check_and_get_client_doc(customer_name)
|
||||
if client_doc:
|
||||
return build_error_response(f"Client with name '{customer_name}' already exists.", 400)
|
||||
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)
|
||||
for address in addresses:
|
||||
if address_exists(
|
||||
address.get("address_line1"),
|
||||
address.get("address_line2"),
|
||||
address.get("city"),
|
||||
address.get("state"),
|
||||
address.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
|
||||
|
||||
|
|
@ -280,28 +306,16 @@ def upsert_client(data):
|
|||
"last_name": primary_contact.get("last_name"),
|
||||
"email_id": primary_contact.get("email"),
|
||||
"phone": primary_contact.get("phone_number"),
|
||||
"company": data.get("company"),
|
||||
"custom_customer_name": customer_name,
|
||||
"customer_type": customer_type
|
||||
"customer_type": customer_type,
|
||||
"companies": [{ "company": data.get("company_name")
|
||||
}]
|
||||
}
|
||||
if customer_type == "Company":
|
||||
lead_data["company_name"] = data.get("customer_name")
|
||||
client_doc = create_lead(lead_data)
|
||||
print(f"#####DEBUG: {client_doc.doctype}:", client_doc.as_dict())
|
||||
|
||||
# Handle address creation
|
||||
address_doc = create_address({
|
||||
"address_title": build_address_title(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"),
|
||||
"customer_type": "Lead",
|
||||
"customer_name": client_doc.name
|
||||
})
|
||||
|
||||
|
||||
#Handle contact creation
|
||||
contact_docs = []
|
||||
for contact_data in contacts:
|
||||
|
|
@ -316,12 +330,14 @@ def upsert_client(data):
|
|||
)
|
||||
if not contact_doc:
|
||||
print("#####DEBUG: No existing contact found. Creating new contact.")
|
||||
contact_doc = create_contact({
|
||||
contact_doc = ContactService.create({
|
||||
"first_name": contact_data.get("first_name"),
|
||||
"last_name": contact_data.get("last_name"),
|
||||
"role": contact_data.get("contact_role", "Other"),
|
||||
"custom_email": contact_data.get("email"),
|
||||
"is_primary_contact":1 if contact_data.get("is_primary", False) else 0,
|
||||
"customer_type": "Lead",
|
||||
"customer_name": client_doc.name,
|
||||
"email_ids": [{
|
||||
"email_id": contact_data.get("email"),
|
||||
"is_primary": 1
|
||||
|
|
@ -332,37 +348,61 @@ def upsert_client(data):
|
|||
"is_primary_phone": 1
|
||||
}]
|
||||
})
|
||||
ContactService.link_contact_to_customer(contact_doc, "Lead", client_doc.name)
|
||||
contact_docs.append(contact_doc)
|
||||
|
||||
# Link all contacts to client after creating them
|
||||
client_doc.reload()
|
||||
for idx, contact_data in enumerate(contacts):
|
||||
if isinstance(contact_data, str):
|
||||
contact_data = json.loads(contact_data)
|
||||
contact_doc = contact_docs[idx]
|
||||
client_doc.append("contacts", {
|
||||
"contact": contact_doc.name
|
||||
})
|
||||
if contact_data.get("is_primary", False):
|
||||
client_doc.primary_contact = contact_doc.name
|
||||
client_doc.save(ignore_permissions=True)
|
||||
|
||||
# ##### Create links
|
||||
# # Customer -> Address
|
||||
# if client_doc.doctype == "Customer":
|
||||
# print("#####DEBUG: Linking address to customer.")
|
||||
# client_doc.append("custom_select_address", {
|
||||
# "address_name": address_doc.name,
|
||||
# })
|
||||
|
||||
# # Customer -> Contact
|
||||
# print("#####DEBUG: Linking contacts to customer.")
|
||||
# for contact_doc in contact_docs:
|
||||
# client_doc.append("custom_add_contacts", {
|
||||
# "contact": contact_doc.name,
|
||||
# "email": contact_doc.custom_email,
|
||||
# "phone": contact_doc.phone,
|
||||
# "role": contact_doc.role
|
||||
# })
|
||||
# client_doc.save(ignore_permissions=True)
|
||||
|
||||
# Address -> Customer/Lead
|
||||
create_address_links(address_doc, client_doc, contact_docs)
|
||||
|
||||
# Contact -> Customer/Lead & Address
|
||||
create_contact_links(contact_docs, client_doc, address_doc)
|
||||
|
||||
# Handle address creation
|
||||
address_docs = []
|
||||
for address in addresses:
|
||||
print("#####DEBUG: Creating address with data:", address)
|
||||
address_doc = AddressService.create_address({
|
||||
"address_title": build_address_title(customer_name, address),
|
||||
"address_line1": address.get("address_line1"),
|
||||
"address_line2": address.get("address_line2"),
|
||||
"city": address.get("city"),
|
||||
"state": address.get("state"),
|
||||
"country": "United States",
|
||||
"pincode": address.get("pincode"),
|
||||
"customer_type": "Lead",
|
||||
"customer_name": client_doc.name,
|
||||
"companies": [{ "company": data.get("company_name") }]
|
||||
})
|
||||
AddressService.link_address_to_customer(address_doc, "Lead", client_doc.name)
|
||||
address_doc.reload()
|
||||
for contact_to_link_idx in address.get("contacts", []):
|
||||
contact_doc = contact_docs[contact_to_link_idx]
|
||||
AddressService.link_address_to_contact(address_doc, contact_doc.name)
|
||||
address_doc.reload()
|
||||
ContactService.link_contact_to_address(contact_doc, address_doc.name)
|
||||
primary_contact = contact_docs[address.get("primary_contact)", 0)]
|
||||
AddressService.set_primary_contact(address_doc.name, primary_contact.name)
|
||||
address_docs.append(address_doc)
|
||||
|
||||
# Link all addresses to client after creating them
|
||||
client_doc.reload()
|
||||
for address_doc in address_docs:
|
||||
client_doc.append("properties", {
|
||||
"address": address_doc.name
|
||||
})
|
||||
client_doc.save(ignore_permissions=True)
|
||||
|
||||
frappe.local.message_log = []
|
||||
return build_success_response({
|
||||
"customer": client_doc.as_dict(),
|
||||
"address": address_doc.as_dict(),
|
||||
"address": [address_doc.as_dict() for address_doc in address_docs],
|
||||
"contacts": [contact_doc.as_dict() for contact_doc in contact_docs]
|
||||
})
|
||||
except frappe.ValidationError as ve:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue