From 2ea20a86e34cef2dc8957bf05d754bc2e6f9a6c6 Mon Sep 17 00:00:00 2001 From: Casey Wittrock Date: Tue, 25 Nov 2025 08:03:46 -0600 Subject: [PATCH] client creation bug fixes --- custom_ui/api/db/clients.py | 4 +-- custom_ui/db_utils.py | 16 +++++++++ custom_ui/events/address.py | 9 +++++ custom_ui/hooks.py | 5 ++- .../clientSubPages/ContactInformationForm.vue | 3 +- .../components/clientSubPages/Overview.vue | 1 + frontend/src/components/pages/Jobs.vue | 33 ++++++++++--------- 7 files changed, 52 insertions(+), 19 deletions(-) create mode 100644 custom_ui/events/address.py diff --git a/custom_ui/api/db/clients.py b/custom_ui/api/db/clients.py index 4a08a8f..cb7165c 100644 --- a/custom_ui/api/db/clients.py +++ b/custom_ui/api/db/clients.py @@ -299,7 +299,6 @@ def upsert_client(data): "link_name": customer_doc.name } address_doc.append("links", link) - address_doc.save(ignore_permissions=True) contact_exists = frappe.db.exists("Contact", {"email_id": data.get("contact_email")}) if not contact_exists: contact_doc = frappe.get_doc({ @@ -318,7 +317,8 @@ def upsert_client(data): else: contact_doc = frappe.get_doc("Contact", {"email_id": data.get("contact_email")}) print("Contact already exists:", contact_doc.as_dict()) - + address_doc.custom_contact = contact_doc.name + address_doc.save(ignore_permissions=True) return build_success_response({ "customer": customer_doc.as_dict(), "address": address_doc.as_dict(), diff --git a/custom_ui/db_utils.py b/custom_ui/db_utils.py index 87814ae..d29913b 100644 --- a/custom_ui/db_utils.py +++ b/custom_ui/db_utils.py @@ -126,4 +126,20 @@ def build_success_response(data): "status": "success", "data": data } + +def build_full_address(doc): + first_parts = [ + doc.address_line1, + doc.address_line2, + doc.city + ] + second_parts = [ + doc.state, + doc.pincode + ] + first = " ".join([p for p in first_parts if p]) + second = " ".join([p for p in second_parts if p]) + if first and second: + return f"{first}, {second}" + return first or second or "" \ No newline at end of file diff --git a/custom_ui/events/address.py b/custom_ui/events/address.py new file mode 100644 index 0000000..326d864 --- /dev/null +++ b/custom_ui/events/address.py @@ -0,0 +1,9 @@ +import frappe +from custom_ui.db_utils import build_full_address + +def after_insert(doc, method): + print(doc.as_dict()) + if not doc.full_address: + doc.full_address = build_full_address(doc) + doc.save() + \ No newline at end of file diff --git a/custom_ui/hooks.py b/custom_ui/hooks.py index e937b2d..801b001 100644 --- a/custom_ui/hooks.py +++ b/custom_ui/hooks.py @@ -161,7 +161,10 @@ add_to_apps_screen = [ doc_events = { "On-Site Meeting": { "after_insert": "custom_ui.events.onsite_meeting.after_insert" - } + }, + "Address": { + "after_insert": "custom_ui.events.address.after_insert" + }, } # Scheduled Tasks diff --git a/frontend/src/components/clientSubPages/ContactInformationForm.vue b/frontend/src/components/clientSubPages/ContactInformationForm.vue index 8f4df0c..4728742 100644 --- a/frontend/src/components/clientSubPages/ContactInformationForm.vue +++ b/frontend/src/components/clientSubPages/ContactInformationForm.vue @@ -148,7 +148,8 @@ const localFormData = computed({ set: (value) => emit("update:formData", value), }); -const isNewContact = ref(false); +// Default to true for new-client flows; if editing keep it off +const isNewContact = ref(!props.isEditMode); const selectedContact = ref(null); const sameAsClientName = ref(false); diff --git a/frontend/src/components/clientSubPages/Overview.vue b/frontend/src/components/clientSubPages/Overview.vue index 6baf61d..423adc7 100644 --- a/frontend/src/components/clientSubPages/Overview.vue +++ b/frontend/src/components/clientSubPages/Overview.vue @@ -262,6 +262,7 @@ const formData = ref({ onMounted(() => { if (props.isNew) { resetForm(); + isNewClientMode.value = true; // Set to true for new client mode console.log("Mounted in new client mode - initialized empty form"); } else if (props.clientData && Object.keys(props.clientData).length > 0) { populateFormFromClientData(); diff --git a/frontend/src/components/pages/Jobs.vue b/frontend/src/components/pages/Jobs.vue index 379bf2d..d5dfb7c 100644 --- a/frontend/src/components/pages/Jobs.vue +++ b/frontend/src/components/pages/Jobs.vue @@ -19,10 +19,12 @@ import Api from "../../api"; import { useLoadingStore } from "../../stores/loading"; import { usePaginationStore } from "../../stores/pagination"; import { useFiltersStore } from "../../stores/filters"; +import { useNotificationStore } from "../../stores/notifications-primevue"; const loadingStore = useLoadingStore(); const paginationStore = usePaginationStore(); const filtersStore = useFiltersStore(); +const notifications = useNotificationStore(); const tableData = ref([]); const totalRecords = ref(0); @@ -146,24 +148,25 @@ const handleLazyLoad = async (event) => { // Load initial data onMounted(async () => { + notifications.addWarning("Jobs page coming soon"); // Initialize pagination and filters - paginationStore.initializeTablePagination("jobs", { rows: 10 }); - filtersStore.initializeTableFilters("jobs", columns); - filtersStore.initializeTableSorting("jobs"); + // paginationStore.initializeTablePagination("jobs", { rows: 10 }); + // filtersStore.initializeTableFilters("jobs", columns); + // filtersStore.initializeTableSorting("jobs"); - // Load first page - const initialPagination = paginationStore.getTablePagination("jobs"); - const initialFilters = filtersStore.getTableFilters("jobs"); - const initialSorting = filtersStore.getTableSorting("jobs"); + // // Load first page + // const initialPagination = paginationStore.getTablePagination("jobs"); + // const initialFilters = filtersStore.getTableFilters("jobs"); + // const initialSorting = filtersStore.getTableSorting("jobs"); - await handleLazyLoad({ - page: initialPagination.page, - rows: initialPagination.rows, - first: initialPagination.first, - sortField: initialSorting.field || initialPagination.sortField, - sortOrder: initialSorting.order || initialPagination.sortOrder, - filters: initialFilters, - }); + // await handleLazyLoad({ + // page: initialPagination.page, + // rows: initialPagination.rows, + // first: initialPagination.first, + // sortField: initialSorting.field || initialPagination.sortField, + // sortOrder: initialSorting.order || initialPagination.sortOrder, + // filters: initialFilters, + // }); });