add something to massage some of the data

This commit is contained in:
Casey 2026-01-09 14:53:06 -06:00
parent 2f1c975e0a
commit 89bdbcfdcb
4 changed files with 121 additions and 9 deletions

View File

@ -106,8 +106,12 @@ def get_client(client_name):
clientData.update(map_lead_client(clientData))
links = []
if customer.doctype == "Customer":
clientData["addresses"] = customer.custom_select_address or []
clientData["contacts"] = customer.custom_add_contacts or []
for address_link in customer.custom_select_address:
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:
links = frappe.get_all(
@ -130,7 +134,7 @@ def get_client(client_name):
clientData["contacts"].append(linked_doc.as_dict())
elif link["link_doctype"] == "Address":
clientData["addresses"].append(linked_doc.as_dict())
doctypes_to_fetch_history = []
# TODO: Continue getting other linked docs like jobs, invoices, etc.
print("DEBUG: Final client data prepared:", clientData)
return build_success_response(clientData)

5
custom_ui/events/jobs.py Normal file
View 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

View File

@ -477,6 +477,70 @@
"trigger": null,
"unique": 0,
"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,
@ -498,8 +562,8 @@
"make_attachments_public": 0,
"max_attachments": 0,
"menu_index": null,
"migration_hash": "2521636464aadbebbd70dfbf13252950",
"modified": "2026-01-07 11:10:03.317996",
"migration_hash": "d5c5525a76e0cba00a479f83d71ac74c",
"modified": "2026-01-09 09:08:21.281081",
"module": "Selling",
"name": "Quotation Template",
"naming_rule": "",
@ -996,8 +1060,8 @@
"make_attachments_public": 0,
"max_attachments": 0,
"menu_index": null,
"migration_hash": "2521636464aadbebbd70dfbf13252950",
"modified": "2026-01-07 11:10:03.406758",
"migration_hash": "d5c5525a76e0cba00a479f83d71ac74c",
"modified": "2026-01-09 08:52:19.818789",
"module": "Selling",
"name": "Quotation Template Item",
"naming_rule": "",

View File

@ -383,10 +383,13 @@ def update_address_fields():
'custom_estimate_sent_status': 0,
'custom_job_status': 0,
'custom_payment_received_status': 0,
'address_linked_to_customer': 0,
'total_field_updates': 0,
'addresses_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")
@ -401,7 +404,7 @@ def update_address_fields():
# Print a three-line, refreshing progress block without adding new lines each loop
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]}..."
if index == 1:
@ -498,6 +501,26 @@ def update_address_fields():
elif sales_invoices and sales_invoices[0]:
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:
updates['custom_onsite_meeting_scheduled'] = onsite_meeting
field_counters['custom_onsite_meeting_scheduled'] += 1
@ -518,6 +541,21 @@ def update_address_fields():
if updates:
frappe.db.set_value("Address", doc['name'], updates)
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
if index % 100 == 0:
@ -530,6 +568,7 @@ def update_address_fields():
print(f" • Addresses updated: {field_counters['addresses_updated']:,}")
print(f" • Quotations updated: {field_counters['quotations_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"\n📝 Field-specific updates:")
print(f" • Full Address: {field_counters['full_address']:,}")