diff --git a/crm/fcrm/doctype/crm_user/crm_user.py b/crm/fcrm/doctype/crm_user/crm_user.py index 98c74d51..2bc585a8 100644 --- a/crm/fcrm/doctype/crm_user/crm_user.py +++ b/crm/fcrm/doctype/crm_user/crm_user.py @@ -21,6 +21,26 @@ class CRMUser(Document): self.image = user.user_image +@frappe.whitelist() +def add_existing_users(users, role='Sales User'): + """ + Add existing users to the CRM User doctype. + :param users: List of user names to be added + """ + frappe.only_for(["System Manager", "Sales Manager"]) + users = frappe.parse_json(users) + + for user in users: + if not frappe.db.exists("CRM User", {"user": user}): + new_user = frappe.new_doc("CRM User") + new_user.user = user + new_user.save(ignore_permissions=True) + + update_user_role(user, role) + else: + frappe.throw(f"User {user} already exists") + + @frappe.whitelist() def update_user_role(user, new_role): """ @@ -29,7 +49,7 @@ def update_user_role(user, new_role): :param new_role: The new role to assign (Sales Manager or Sales User) """ - frappe.only_for(["System Manager", "System Manager"]) + frappe.only_for(["System Manager", "Sales Manager"]) if new_role not in ["System Manager", "Sales Manager", "Sales User"]: frappe.throw("Cannot assign this role") @@ -55,6 +75,6 @@ def update_user_status(user, status): :param user: The name of the user :param status: The status to set (1 for active, 0 for inactive) """ - frappe.only_for("Sales Manager") + frappe.only_for(["System Manager", "Sales Manager"]) frappe.db.set_value("CRM User", user, "is_active", status) diff --git a/frontend/components.d.ts b/frontend/components.d.ts index 2f4fa89b..5c91efb8 100644 --- a/frontend/components.d.ts +++ b/frontend/components.d.ts @@ -12,6 +12,7 @@ declare module 'vue' { Activities: typeof import('./src/components/Activities/Activities.vue')['default'] ActivityHeader: typeof import('./src/components/Activities/ActivityHeader.vue')['default'] ActivityIcon: typeof import('./src/components/Icons/ActivityIcon.vue')['default'] + AddExistingUserModal: typeof import('./src/components/Modals/AddExistingUserModal.vue')['default'] AddressIcon: typeof import('./src/components/Icons/AddressIcon.vue')['default'] AddressModal: typeof import('./src/components/Modals/AddressModal.vue')['default'] Agents: typeof import('./src/components/Settings/Agents.vue')['default'] diff --git a/frontend/src/components/Modals/AddExistingUserModal.vue b/frontend/src/components/Modals/AddExistingUserModal.vue new file mode 100644 index 00000000..d196946f --- /dev/null +++ b/frontend/src/components/Modals/AddExistingUserModal.vue @@ -0,0 +1,113 @@ + + + diff --git a/frontend/src/components/Settings/Settings.vue b/frontend/src/components/Settings/Settings.vue index a9bc7bfb..fb597bd4 100644 --- a/frontend/src/components/Settings/Settings.vue +++ b/frontend/src/components/Settings/Settings.vue @@ -44,7 +44,6 @@ import WhatsAppIcon from '@/components/Icons/WhatsAppIcon.vue' import ERPNextIcon from '@/components/Icons/ERPNextIcon.vue' import PhoneIcon from '@/components/Icons/PhoneIcon.vue' -import InviteIcon from '@/components/Icons/InviteIcon.vue' import Email2Icon from '@/components/Icons/Email2Icon.vue' import Users from '@/components/Settings/Users.vue' import GeneralSettings from '@/components/Settings/GeneralSettings.vue' @@ -97,7 +96,7 @@ const tabs = computed(() => { }, { label: __('Invite User'), - icon: InviteIcon, + icon: 'user-plus', component: markRaw(InviteUserPage), condition: () => isManager(), }, diff --git a/frontend/src/components/Settings/Users.vue b/frontend/src/components/Settings/Users.vue index c6d375a3..2361e34d 100644 --- a/frontend/src/components/Settings/Users.vue +++ b/frontend/src/components/Settings/Users.vue @@ -127,10 +127,16 @@ +