From 979ef27a9defa304b5917d19707214dc9f5daae7 Mon Sep 17 00:00:00 2001 From: Shariq Ansari Date: Mon, 16 Sep 2024 19:30:53 +0530 Subject: [PATCH] fix: option to create customer on status change --- .../erpnext_crm_settings.json | 30 +++++++++++++++++-- .../erpnext_crm_settings.py | 10 +++++-- frontend/src/pages/Deal.vue | 22 ++++++++++++-- frontend/src/pages/Lead.vue | 7 ++++- 4 files changed, 62 insertions(+), 7 deletions(-) diff --git a/crm/fcrm/doctype/erpnext_crm_settings/erpnext_crm_settings.json b/crm/fcrm/doctype/erpnext_crm_settings/erpnext_crm_settings.json index 99fb35dc..1f19b7ef 100644 --- a/crm/fcrm/doctype/erpnext_crm_settings/erpnext_crm_settings.json +++ b/crm/fcrm/doctype/erpnext_crm_settings/erpnext_crm_settings.json @@ -13,7 +13,11 @@ "erpnext_site_url", "column_break_fllx", "api_key", - "api_secret" + "api_secret", + "section_break_jnbn", + "create_customer_on_status_change", + "column_break_kbhw", + "deal_status" ], "fields": [ { @@ -69,12 +73,34 @@ "fieldname": "is_erpnext_in_different_site", "fieldtype": "Check", "label": "Is ERPNext installed on a different site?" + }, + { + "fieldname": "section_break_jnbn", + "fieldtype": "Section Break" + }, + { + "default": "0", + "depends_on": "enabled", + "fieldname": "create_customer_on_status_change", + "fieldtype": "Check", + "label": "Create customer on status change" + }, + { + "fieldname": "column_break_kbhw", + "fieldtype": "Column Break" + }, + { + "depends_on": "create_customer_on_status_change", + "fieldname": "deal_status", + "fieldtype": "Link", + "label": "Deal Status", + "options": "CRM Deal Status" } ], "index_web_pages_for_search": 1, "issingle": 1, "links": [], - "modified": "2024-09-16 13:51:35.141503", + "modified": "2024-09-16 19:01:28.694010", "modified_by": "Administrator", "module": "FCRM", "name": "ERPNext CRM Settings", diff --git a/crm/fcrm/doctype/erpnext_crm_settings/erpnext_crm_settings.py b/crm/fcrm/doctype/erpnext_crm_settings/erpnext_crm_settings.py index c3143d77..6cbef5f4 100644 --- a/crm/fcrm/doctype/erpnext_crm_settings/erpnext_crm_settings.py +++ b/crm/fcrm/doctype/erpnext_crm_settings/erpnext_crm_settings.py @@ -139,7 +139,11 @@ def get_organization_address(organization): def create_customer_in_erpnext(doc, method): erpnext_crm_settings = frappe.get_single("ERPNext CRM Settings") - if not erpnext_crm_settings.enabled or doc.status != "Won": + if ( + not erpnext_crm_settings.enabled + or not erpnext_crm_settings.create_customer_on_status_change + or doc.status != erpnext_crm_settings.deal_status + ): return contacts = get_contacts(doc) @@ -160,7 +164,9 @@ def create_customer_in_erpnext(doc, method): from erpnext.crm.frappe_crm_api import create_customer create_customer(customer) else: - create_customer_in_remote_site(customer, erpnext_crm_settings) + create_customer_in_remote_site(customer, erpnext_crm_settings) + + frappe.publish_realtime("crm_customer_created") def create_customer_in_remote_site(customer, erpnext_crm_settings): client = get_erpnext_site_client(erpnext_crm_settings) diff --git a/frontend/src/pages/Deal.vue b/frontend/src/pages/Deal.vue index 27a8f3c5..d21c2508 100644 --- a/frontend/src/pages/Deal.vue +++ b/frontend/src/pages/Deal.vue @@ -361,10 +361,10 @@ import { call, usePageMeta, } from 'frappe-ui' -import { ref, computed, h, onMounted } from 'vue' +import { ref, computed, h, onMounted, onBeforeUnmount } from 'vue' import { useRoute, useRouter } from 'vue-router' -const { $dialog, makeCall } = globalStore() +const { $dialog, $socket, makeCall } = globalStore() const { organizations, getOrganization } = organizationsStore() const { statusOptions, getDealStatus } = statusesStore() const { isManager } = usersStore() @@ -386,10 +386,16 @@ const deal = createResource({ let obj = { doc: data, $dialog, + $socket, router, updateField, createToast, deleteDoc: deleteDeal, + resource: { + deal, + deal_contacts, + fieldsLayout, + }, call, } setupAssignees(data) @@ -399,10 +405,22 @@ const deal = createResource({ }) onMounted(() => { + $socket.on('crm_customer_created', () => { + createToast({ + title: __('Customer created successfully'), + icon: 'check', + iconClasses: 'text-green-600', + }) + }) + if (deal.data) return deal.fetch() }) +onBeforeUnmount(() => { + $socket.off('crm_customer_created') +}) + const reload = ref(false) const showOrganizationModal = ref(false) const showAssignmentModal = ref(false) diff --git a/frontend/src/pages/Lead.vue b/frontend/src/pages/Lead.vue index d89a9be0..728f45f7 100644 --- a/frontend/src/pages/Lead.vue +++ b/frontend/src/pages/Lead.vue @@ -335,7 +335,7 @@ import { import { ref, computed, onMounted, watch } from 'vue' import { useRouter, useRoute } from 'vue-router' -const { $dialog, makeCall } = globalStore() +const { $dialog, $socket, makeCall } = globalStore() const { getContactByName, contacts } = contactsStore() const { organizations } = organizationsStore() const { statusOptions, getLeadStatus } = statusesStore() @@ -358,10 +358,15 @@ const lead = createResource({ let obj = { doc: data, $dialog, + $socket, router, updateField, createToast, deleteDoc: deleteLead, + resource: { + lead, + fieldsLayout, + }, call, } setupAssignees(data)