add something to massage some of the data
This commit is contained in:
parent
2f1c975e0a
commit
89bdbcfdcb
4 changed files with 121 additions and 9 deletions
|
|
@ -106,8 +106,12 @@ def get_client(client_name):
|
||||||
clientData.update(map_lead_client(clientData))
|
clientData.update(map_lead_client(clientData))
|
||||||
links = []
|
links = []
|
||||||
if customer.doctype == "Customer":
|
if customer.doctype == "Customer":
|
||||||
clientData["addresses"] = customer.custom_select_address or []
|
for address_link in customer.custom_select_address:
|
||||||
clientData["contacts"] = customer.custom_add_contacts or []
|
address_doc = frappe.get_doc("Address", address_link.address_name)
|
||||||
|
clientData["addresses"].append(address_doc.as_dict())
|
||||||
|
for contact_link in customer.custom_add_contacts:
|
||||||
|
contact_doc = frappe.get_doc("Contact", contact_link.contact)
|
||||||
|
clientData["contacts"].append(contact_doc.as_dict())
|
||||||
|
|
||||||
else:
|
else:
|
||||||
links = frappe.get_all(
|
links = frappe.get_all(
|
||||||
|
|
@ -130,7 +134,7 @@ def get_client(client_name):
|
||||||
clientData["contacts"].append(linked_doc.as_dict())
|
clientData["contacts"].append(linked_doc.as_dict())
|
||||||
elif link["link_doctype"] == "Address":
|
elif link["link_doctype"] == "Address":
|
||||||
clientData["addresses"].append(linked_doc.as_dict())
|
clientData["addresses"].append(linked_doc.as_dict())
|
||||||
doctypes_to_fetch_history = []
|
|
||||||
# TODO: Continue getting other linked docs like jobs, invoices, etc.
|
# TODO: Continue getting other linked docs like jobs, invoices, etc.
|
||||||
print("DEBUG: Final client data prepared:", clientData)
|
print("DEBUG: Final client data prepared:", clientData)
|
||||||
return build_success_response(clientData)
|
return build_success_response(clientData)
|
||||||
|
|
|
||||||
5
custom_ui/events/jobs.py
Normal file
5
custom_ui/events/jobs.py
Normal file
|
|
@ -0,0 +1,5 @@
|
||||||
|
import frappe
|
||||||
|
|
||||||
|
def after_insert(doc, method):
|
||||||
|
# This is where we will add logic to set tasks and other properties of a job based on it's project_template
|
||||||
|
pass
|
||||||
|
|
@ -477,6 +477,70 @@
|
||||||
"trigger": null,
|
"trigger": null,
|
||||||
"unique": 0,
|
"unique": 0,
|
||||||
"width": null
|
"width": null
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_in_quick_entry": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"collapsible_depends_on": null,
|
||||||
|
"columns": 0,
|
||||||
|
"default": null,
|
||||||
|
"depends_on": null,
|
||||||
|
"description": "The project that this Quotation will eventually generate.",
|
||||||
|
"documentation_url": null,
|
||||||
|
"fetch_from": null,
|
||||||
|
"fetch_if_empty": 0,
|
||||||
|
"fieldname": "project_template",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"hidden": 0,
|
||||||
|
"hide_border": 0,
|
||||||
|
"hide_days": 0,
|
||||||
|
"hide_seconds": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_preview": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"is_virtual": 0,
|
||||||
|
"label": "Project Template",
|
||||||
|
"length": 0,
|
||||||
|
"link_filters": null,
|
||||||
|
"make_attachment_public": 0,
|
||||||
|
"mandatory_depends_on": null,
|
||||||
|
"max_height": null,
|
||||||
|
"no_copy": 0,
|
||||||
|
"non_negative": 0,
|
||||||
|
"oldfieldname": null,
|
||||||
|
"oldfieldtype": null,
|
||||||
|
"options": "Project Template",
|
||||||
|
"parent": "Quotation Template",
|
||||||
|
"parentfield": "fields",
|
||||||
|
"parenttype": "DocType",
|
||||||
|
"permlevel": 0,
|
||||||
|
"placeholder": null,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"print_width": null,
|
||||||
|
"read_only": 0,
|
||||||
|
"read_only_depends_on": null,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"show_dashboard": 0,
|
||||||
|
"show_on_timeline": 0,
|
||||||
|
"show_preview_popup": 0,
|
||||||
|
"sort_options": 0,
|
||||||
|
"translatable": 0,
|
||||||
|
"trigger": null,
|
||||||
|
"unique": 0,
|
||||||
|
"width": null
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"force_re_route_to_default_view": 0,
|
"force_re_route_to_default_view": 0,
|
||||||
|
|
@ -498,8 +562,8 @@
|
||||||
"make_attachments_public": 0,
|
"make_attachments_public": 0,
|
||||||
"max_attachments": 0,
|
"max_attachments": 0,
|
||||||
"menu_index": null,
|
"menu_index": null,
|
||||||
"migration_hash": "2521636464aadbebbd70dfbf13252950",
|
"migration_hash": "d5c5525a76e0cba00a479f83d71ac74c",
|
||||||
"modified": "2026-01-07 11:10:03.317996",
|
"modified": "2026-01-09 09:08:21.281081",
|
||||||
"module": "Selling",
|
"module": "Selling",
|
||||||
"name": "Quotation Template",
|
"name": "Quotation Template",
|
||||||
"naming_rule": "",
|
"naming_rule": "",
|
||||||
|
|
@ -996,8 +1060,8 @@
|
||||||
"make_attachments_public": 0,
|
"make_attachments_public": 0,
|
||||||
"max_attachments": 0,
|
"max_attachments": 0,
|
||||||
"menu_index": null,
|
"menu_index": null,
|
||||||
"migration_hash": "2521636464aadbebbd70dfbf13252950",
|
"migration_hash": "d5c5525a76e0cba00a479f83d71ac74c",
|
||||||
"modified": "2026-01-07 11:10:03.406758",
|
"modified": "2026-01-09 08:52:19.818789",
|
||||||
"module": "Selling",
|
"module": "Selling",
|
||||||
"name": "Quotation Template Item",
|
"name": "Quotation Template Item",
|
||||||
"naming_rule": "",
|
"naming_rule": "",
|
||||||
|
|
|
||||||
|
|
@ -383,10 +383,13 @@ def update_address_fields():
|
||||||
'custom_estimate_sent_status': 0,
|
'custom_estimate_sent_status': 0,
|
||||||
'custom_job_status': 0,
|
'custom_job_status': 0,
|
||||||
'custom_payment_received_status': 0,
|
'custom_payment_received_status': 0,
|
||||||
|
'address_linked_to_customer': 0,
|
||||||
'total_field_updates': 0,
|
'total_field_updates': 0,
|
||||||
'addresses_updated': 0,
|
'addresses_updated': 0,
|
||||||
'quotations_updated': 0,
|
'quotations_updated': 0,
|
||||||
'sales_orders_updated': 0
|
'sales_orders_updated': 0,
|
||||||
|
'customers_updated': 0,
|
||||||
|
'contacts_updated': 0
|
||||||
}
|
}
|
||||||
|
|
||||||
onsite_meta = frappe.get_meta("On-Site Meeting")
|
onsite_meta = frappe.get_meta("On-Site Meeting")
|
||||||
|
|
@ -401,7 +404,7 @@ def update_address_fields():
|
||||||
|
|
||||||
# Print a three-line, refreshing progress block without adding new lines each loop
|
# Print a three-line, refreshing progress block without adding new lines each loop
|
||||||
progress_line = f"📊 Progress: [{bar}] {progress_percentage:3d}% ({index}/{total_doctypes})"
|
progress_line = f"📊 Progress: [{bar}] {progress_percentage:3d}% ({index}/{total_doctypes})"
|
||||||
counters_line = f" Fields updated: {field_counters['total_field_updates']} | DocTypes updated: {field_counters['addresses_updated'] + field_counters['quotations_updated'] + field_counters['sales_orders_updated']}"
|
counters_line = f" Fields updated: {field_counters['total_field_updates']} | DocTypes updated: {field_counters['addresses_updated'] + field_counters['quotations_updated'] + field_counters['sales_orders_updated'] + field_counters['customers_updated']}"
|
||||||
detail_line = f" Processing: {doc['name'][:40]}..."
|
detail_line = f" Processing: {doc['name'][:40]}..."
|
||||||
|
|
||||||
if index == 1:
|
if index == 1:
|
||||||
|
|
@ -498,6 +501,26 @@ def update_address_fields():
|
||||||
elif sales_invoices and sales_invoices[0]:
|
elif sales_invoices and sales_invoices[0]:
|
||||||
payment_received = "In Progress"
|
payment_received = "In Progress"
|
||||||
|
|
||||||
|
customer_name = getattr(address_doc, 'custom_customer_to_bill', None)
|
||||||
|
links = address_doc.get("links", [])
|
||||||
|
customer_links = [link for link in links if link.link_doctype == "Customer"]
|
||||||
|
needs_link_update = False
|
||||||
|
|
||||||
|
if customer_name and frappe.db.exists("Customer", customer_name):
|
||||||
|
customer_doc = frappe.get_doc("Customer", customer_name)
|
||||||
|
|
||||||
|
# Check if address needs link update
|
||||||
|
if not customer_links:
|
||||||
|
needs_link_update = True
|
||||||
|
|
||||||
|
if not address_doc.name in [link.address_name for link in customer_doc.get("custom_select_address", [])]:
|
||||||
|
customer_doc.append("custom_select_address", {
|
||||||
|
"address_name": address_doc.name
|
||||||
|
})
|
||||||
|
customer_doc.save(ignore_permissions=True)
|
||||||
|
field_counters['customers_updated'] += 1
|
||||||
|
field_counters['total_field_updates'] += 1
|
||||||
|
|
||||||
if getattr(address_doc, 'custom_onsite_meeting_scheduled', None) != onsite_meeting:
|
if getattr(address_doc, 'custom_onsite_meeting_scheduled', None) != onsite_meeting:
|
||||||
updates['custom_onsite_meeting_scheduled'] = onsite_meeting
|
updates['custom_onsite_meeting_scheduled'] = onsite_meeting
|
||||||
field_counters['custom_onsite_meeting_scheduled'] += 1
|
field_counters['custom_onsite_meeting_scheduled'] += 1
|
||||||
|
|
@ -519,6 +542,21 @@ def update_address_fields():
|
||||||
frappe.db.set_value("Address", doc['name'], updates)
|
frappe.db.set_value("Address", doc['name'], updates)
|
||||||
field_counters['addresses_updated'] += 1
|
field_counters['addresses_updated'] += 1
|
||||||
|
|
||||||
|
# Handle address links after db.set_value to avoid timestamp mismatch
|
||||||
|
if needs_link_update:
|
||||||
|
# Reload the document to get the latest version
|
||||||
|
address_doc = frappe.get_doc("Address", doc['name'])
|
||||||
|
address_doc.append("links", {
|
||||||
|
"link_doctype": "Customer",
|
||||||
|
"link_name": customer_name
|
||||||
|
})
|
||||||
|
address_doc.save(ignore_permissions=True)
|
||||||
|
field_counters['address_linked_to_customer'] += 1
|
||||||
|
field_counters['total_field_updates'] += 1
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Commit every 100 records to avoid long transactions
|
# Commit every 100 records to avoid long transactions
|
||||||
if index % 100 == 0:
|
if index % 100 == 0:
|
||||||
frappe.db.commit()
|
frappe.db.commit()
|
||||||
|
|
@ -530,6 +568,7 @@ def update_address_fields():
|
||||||
print(f" • Addresses updated: {field_counters['addresses_updated']:,}")
|
print(f" • Addresses updated: {field_counters['addresses_updated']:,}")
|
||||||
print(f" • Quotations updated: {field_counters['quotations_updated']:,}")
|
print(f" • Quotations updated: {field_counters['quotations_updated']:,}")
|
||||||
print(f" • Sales Orders updated: {field_counters['sales_orders_updated']:,}")
|
print(f" • Sales Orders updated: {field_counters['sales_orders_updated']:,}")
|
||||||
|
print(f" • Customers updated: {field_counters['customers_updated']:,}")
|
||||||
print(f" • Total field updates: {field_counters['total_field_updates']:,}")
|
print(f" • Total field updates: {field_counters['total_field_updates']:,}")
|
||||||
print(f"\n📝 Field-specific updates:")
|
print(f"\n📝 Field-specific updates:")
|
||||||
print(f" • Full Address: {field_counters['full_address']:,}")
|
print(f" • Full Address: {field_counters['full_address']:,}")
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue