diff --git a/crm/api/dashboard.py b/crm/api/dashboard.py
index 4bed4218..0b51b6a2 100644
--- a/crm/api/dashboard.py
+++ b/crm/api/dashboard.py
@@ -1008,7 +1008,7 @@ def get_deals_by_territory(from_date="", to_date="", user=""):
WHERE DATE(d.creation) BETWEEN %(from)s AND %(to)s
{deal_conds}
GROUP BY d.territory
- ORDER BY value DESC
+ ORDER BY deals DESC, value DESC
""",
{"from": from_date, "to": to_date},
as_dict=True,
@@ -1065,7 +1065,7 @@ def get_deals_by_salesperson(from_date="", to_date="", user=""):
WHERE DATE(d.creation) BETWEEN %(from)s AND %(to)s
{deal_conds}
GROUP BY d.deal_owner
- ORDER BY value DESC
+ ORDER BY deals DESC, value DESC
""",
{"from": from_date, "to": to_date},
as_dict=True,
diff --git a/crm/fcrm/doctype/crm_dashboard/crm_dashboard.py b/crm/fcrm/doctype/crm_dashboard/crm_dashboard.py
index 0f6ffaa3..f9a04395 100644
--- a/crm/fcrm/doctype/crm_dashboard/crm_dashboard.py
+++ b/crm/fcrm/doctype/crm_dashboard/crm_dashboard.py
@@ -26,8 +26,9 @@ def create_default_manager_dashboard(force=False):
doc.title = "Manager Dashboard"
doc.layout = default_manager_dashboard_layout()
doc.insert(ignore_permissions=True)
- elif force:
+ else:
doc = frappe.get_doc("CRM Dashboard", "Manager Dashboard")
- doc.layout = default_manager_dashboard_layout()
- doc.save(ignore_permissions=True)
+ if force:
+ doc.layout = default_manager_dashboard_layout()
+ doc.save(ignore_permissions=True)
return doc.layout
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 84351670..fde6fb72 100644
--- a/crm/fcrm/doctype/erpnext_crm_settings/erpnext_crm_settings.py
+++ b/crm/fcrm/doctype/erpnext_crm_settings/erpnext_crm_settings.py
@@ -135,7 +135,7 @@ def get_quotation_url(crm_deal, organization):
"party_name": crm_deal,
"company": erpnext_crm_settings.erpnext_company,
"contact_person": contact,
- "customer_address": address
+ "customer_address": address,
}
else:
site_url = erpnext_crm_settings.get("erpnext_site_url")
@@ -147,14 +147,11 @@ def get_quotation_url(crm_deal, organization):
"party_name": prospect,
"company": erpnext_crm_settings.erpnext_company,
"contact_person": contact,
- "customer_address": address
+ "customer_address": address,
}
-
+
# Filter out None values and build query string
- query_string = "&".join(
- f"{key}={value}" for key, value in params.items()
- if value is not None
- )
+ query_string = "&".join(f"{key}={value}" for key, value in params.items() if value is not None)
return f"{base_url}?{query_string}"
diff --git a/crm/fcrm/doctype/helpdesk_crm_settings/__init__.py b/crm/fcrm/doctype/helpdesk_crm_settings/__init__.py
new file mode 100644
index 00000000..e69de29b
diff --git a/crm/fcrm/doctype/helpdesk_crm_settings/helpdesk_crm_settings.js b/crm/fcrm/doctype/helpdesk_crm_settings/helpdesk_crm_settings.js
new file mode 100644
index 00000000..b31a6f24
--- /dev/null
+++ b/crm/fcrm/doctype/helpdesk_crm_settings/helpdesk_crm_settings.js
@@ -0,0 +1,8 @@
+// Copyright (c) 2025, Frappe Technologies Pvt. Ltd. and contributors
+// For license information, please see license.txt
+
+// frappe.ui.form.on("Helpdesk CRM Settings", {
+// refresh(frm) {
+
+// },
+// });
diff --git a/crm/fcrm/doctype/helpdesk_crm_settings/helpdesk_crm_settings.json b/crm/fcrm/doctype/helpdesk_crm_settings/helpdesk_crm_settings.json
new file mode 100644
index 00000000..220666ab
--- /dev/null
+++ b/crm/fcrm/doctype/helpdesk_crm_settings/helpdesk_crm_settings.json
@@ -0,0 +1,102 @@
+{
+ "actions": [],
+ "allow_rename": 1,
+ "creation": "2025-08-18 17:25:49.638398",
+ "doctype": "DocType",
+ "engine": "InnoDB",
+ "field_order": [
+ "enabled",
+ "column_break_idaw",
+ "is_helpdesk_in_different_site",
+ "helpdesk_site_url",
+ "helpdesk_site_apis_section",
+ "api_key",
+ "column_break_tqsm",
+ "api_secret"
+ ],
+ "fields": [
+ {
+ "default": "0",
+ "fieldname": "enabled",
+ "fieldtype": "Check",
+ "label": "Enabled"
+ },
+ {
+ "fieldname": "column_break_idaw",
+ "fieldtype": "Column Break"
+ },
+ {
+ "default": "0",
+ "depends_on": "enabled",
+ "fieldname": "is_helpdesk_in_different_site",
+ "fieldtype": "Check",
+ "label": "Is Helpdesk installed on a different site?"
+ },
+ {
+ "depends_on": "eval:doc.enabled && doc.is_helpdesk_in_different_site",
+ "fieldname": "helpdesk_site_url",
+ "fieldtype": "Data",
+ "label": "Helpdesk Site URL",
+ "mandatory_depends_on": "is_helpdesk_in_different_site"
+ },
+ {
+ "depends_on": "enabled",
+ "fieldname": "helpdesk_site_apis_section",
+ "fieldtype": "Section Break",
+ "label": "Helpdesk Site API's"
+ },
+ {
+ "depends_on": "eval:doc.enabled && doc.is_helpdesk_in_different_site",
+ "fieldname": "api_key",
+ "fieldtype": "Data",
+ "label": "API Key",
+ "mandatory_depends_on": "is_helpdesk_in_different_site"
+ },
+ {
+ "fieldname": "column_break_tqsm",
+ "fieldtype": "Column Break"
+ },
+ {
+ "depends_on": "eval:doc.enabled && doc.is_helpdesk_in_different_site",
+ "fieldname": "api_secret",
+ "fieldtype": "Password",
+ "label": "API Secret",
+ "mandatory_depends_on": "is_helpdesk_in_different_site"
+ }
+ ],
+ "grid_page_length": 50,
+ "index_web_pages_for_search": 1,
+ "issingle": 1,
+ "links": [],
+ "modified": "2025-08-18 17:33:38.616328",
+ "modified_by": "Administrator",
+ "module": "FCRM",
+ "name": "Helpdesk CRM Settings",
+ "owner": "Administrator",
+ "permissions": [
+ {
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "print": 1,
+ "read": 1,
+ "role": "System Manager",
+ "share": 1,
+ "write": 1
+ },
+ {
+ "create": 1,
+ "delete": 1,
+ "email": 1,
+ "print": 1,
+ "read": 1,
+ "role": "Sales Manager",
+ "share": 1,
+ "write": 1
+ }
+ ],
+ "row_format": "Dynamic",
+ "sort_field": "creation",
+ "sort_order": "DESC",
+ "states": []
+}
diff --git a/crm/fcrm/doctype/helpdesk_crm_settings/helpdesk_crm_settings.py b/crm/fcrm/doctype/helpdesk_crm_settings/helpdesk_crm_settings.py
new file mode 100644
index 00000000..efc6b999
--- /dev/null
+++ b/crm/fcrm/doctype/helpdesk_crm_settings/helpdesk_crm_settings.py
@@ -0,0 +1,178 @@
+# Copyright (c) 2025, Frappe Technologies Pvt. Ltd. and contributors
+# For license information, please see license.txt
+
+import frappe
+from frappe import _
+from frappe.model.document import Document
+
+
+class HelpdeskCRMSettings(Document):
+ def validate(self):
+ if self.enabled:
+ self.validate_if_helpdesk_installed()
+ self.create_helpdesk_script()
+
+ def validate_if_helpdesk_installed(self):
+ if not self.is_helpdesk_in_different_site:
+ if "helpdesk" not in frappe.get_installed_apps():
+ frappe.throw(_("Helpdesk is not installed in the current site"))
+
+ def create_helpdesk_script(self):
+ if not frappe.db.exists("CRM Form Script", "Helpdesk Integration Script"):
+ script = get_helpdesk_script()
+ frappe.get_doc(
+ {
+ "doctype": "CRM Form Script",
+ "name": "Helpdesk Integration Script",
+ "dt": "CRM Deal",
+ "view": "Form",
+ "script": script,
+ "enabled": 1,
+ "is_standard": 1,
+ }
+ ).insert()
+
+
+@frappe.whitelist()
+def create_customer_in_helpdesk(name, email):
+ helpdesk_crm_settings = frappe.get_single("Helpdesk CRM Settings")
+ if not helpdesk_crm_settings.enabled:
+ frappe.throw(_("Helpdesk is not integrated with the CRM"))
+
+ if not helpdesk_crm_settings.is_helpdesk_in_different_site:
+ # from helpdesk.integrations.crm.api import create_customer
+ return create_customer(name, email)
+
+
+def get_helpdesk_script():
+ return """class CRMDeal {
+ onLoad() {
+ this.actions.push(
+ {
+ group: "Helpdesk",
+ hideLabel: true,
+ items: [
+ {
+ label: "Create customer in Helpdesk",
+ onClick: () => {
+ call('crm.fcrm.doctype.helpdesk_crm_settings.helpdesk_crm_settings.create_customer_in_helpdesk', {
+ name: this.doc.organization,
+ email: this.doc.email
+ }).then((a) => {
+ toast.success("Customer created successfully, " + a.customer)
+ })
+ }
+ }
+ ]
+ }
+ )
+ }
+}"""
+
+# Helpdesk methods TODO: move to helpdesk.integrations.crm.api
+def create_customer(name, email):
+ customer = frappe.db.exists("HD Customer", name)
+ if not customer:
+ customer = frappe.get_doc(
+ {
+ "doctype": "HD Customer",
+ "customer_name": name,
+ }
+ )
+ customer.insert(ignore_permissions=True, ignore_if_duplicate=True)
+ else:
+ customer = frappe.get_doc("HD Customer", customer)
+
+ contact = frappe.db.exists("Contact", {"email_id": email})
+ if contact:
+ contact = frappe.get_doc("Contact", contact)
+ contact.append(
+ "links", {"link_doctype": "HD Customer", "link_name": customer.name}
+ )
+ contact.save(ignore_permissions=True)
+ else:
+ contact = frappe.get_doc(
+ {
+ "doctype": "Contact",
+ "first_name": email.split("@")[0],
+ "email_ids": [{"email_id": email, "is_primary": 1}],
+ "links": [{"link_doctype": "HD Customer", "link_name": customer.name}],
+ }
+ )
+ contact.insert(ignore_permissions=True)
+
+ if not frappe.db.exists("User", contact.email_id):
+ invite_user(contact.name)
+ else:
+ base_url = frappe.utils.get_url() + "/helpdesk"
+ frappe.sendmail(
+ recipients=[contact.email_id],
+ subject="Welcome existing user to Helpdesk",
+ message=f"""
+
Hello,
+
+ """,
+ now=True,
+ )
+
+ return {"customer": customer.name, "contact": contact.name}
+
+
+def invite_user(contact: str):
+ contact = frappe.get_doc("Contact", contact)
+ contact.check_permission()
+
+ if not contact.email_id:
+ frappe.throw(_("Please set Email Address"))
+
+ user = frappe.get_doc(
+ {
+ "doctype": "User",
+ "first_name": contact.first_name,
+ "last_name": contact.last_name,
+ "email": contact.email_id,
+ "user_type": "Website User",
+ "send_welcome_email": 0
+ }
+ ).insert()
+
+ contact.user = user.name
+ contact.save(ignore_permissions=True)
+
+ send_welcome_mail_to_user(user)
+ return user.name
+
+
+def send_welcome_mail_to_user(user):
+ from frappe.utils import get_url
+ from frappe.utils.user import get_user_fullname
+
+ link = user.reset_password()
+
+ frappe.cache.hset("redirect_after_login", user.name, "/helpdesk")
+
+ site_url = get_url()
+ subject = _("Welcome to Helpdesk")
+
+ created_by = get_user_fullname(frappe.session["user"])
+ if created_by == "Guest":
+ created_by = "Administrator"
+
+ args = {
+ "first_name": user.first_name or user.last_name or "user",
+ "last_name": user.last_name,
+ "user": user.name,
+ "title": subject,
+ "login_url": get_url(),
+ "created_by": created_by,
+ "site_url": site_url,
+ "link": link
+ }
+
+ frappe.sendmail(
+ recipients=[user.email],
+ subject=subject,
+ template="helpdesk_invitation",
+ args=args,
+ now=True,
+ )
diff --git a/crm/fcrm/doctype/helpdesk_crm_settings/test_helpdesk_crm_settings.py b/crm/fcrm/doctype/helpdesk_crm_settings/test_helpdesk_crm_settings.py
new file mode 100644
index 00000000..c60d55dc
--- /dev/null
+++ b/crm/fcrm/doctype/helpdesk_crm_settings/test_helpdesk_crm_settings.py
@@ -0,0 +1,21 @@
+# Copyright (c) 2025, Frappe Technologies Pvt. Ltd. and Contributors
+# See license.txt
+
+# import frappe
+from frappe.tests import IntegrationTestCase
+
+# On IntegrationTestCase, the doctype test records and all
+# link-field test record dependencies are recursively loaded
+# Use these module variables to add/remove to/from that list
+EXTRA_TEST_RECORD_DEPENDENCIES = [] # eg. ["User"]
+IGNORE_TEST_RECORD_DEPENDENCIES = [] # eg. ["User"]
+
+
+
+class IntegrationTestHelpdeskCRMSettings(IntegrationTestCase):
+ """
+ Integration tests for HelpdeskCRMSettings.
+ Use this class for testing interactions between multiple components.
+ """
+
+ pass
diff --git a/crm/locale/de.po b/crm/locale/de.po
index 952f891c..8e78aa61 100644
--- a/crm/locale/de.po
+++ b/crm/locale/de.po
@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: frappe\n"
"Report-Msgid-Bugs-To: shariq@frappe.io\n"
"POT-Creation-Date: 2025-08-03 09:38+0000\n"
-"PO-Revision-Date: 2025-08-04 08:34\n"
+"PO-Revision-Date: 2025-08-09 10:05\n"
"Last-Translator: shariq@frappe.io\n"
"Language-Team: German\n"
"MIME-Version: 1.0\n"
@@ -621,16 +621,16 @@ msgstr "Zwischen"
#: frontend/src/components/Settings/General/BrandSettings.vue:40
msgid "Brand name"
-msgstr ""
+msgstr "Markenname"
#: frontend/src/components/Settings/General/BrandSettings.vue:9
msgid "Brand settings"
-msgstr ""
+msgstr "Markeneinstellungen"
#. Label of the branding_tab (Tab Break) field in DocType 'FCRM Settings'
#: crm/fcrm/doctype/fcrm_settings/fcrm_settings.json
msgid "Branding"
-msgstr ""
+msgstr "Firmenlogo"
#: frontend/src/components/Modals/EditValueModal.vue:2
msgid "Bulk Edit"
@@ -1295,7 +1295,7 @@ msgstr "Interessent erstellen"
#: frontend/src/components/Layouts/AppSidebar.vue:344
msgid "Create your first lead"
-msgstr ""
+msgstr "Erstellen Sie Ihren ersten Interessenten"
#: frontend/src/components/Layouts/AppSidebar.vue:414
msgid "Create your first note"
@@ -1303,7 +1303,7 @@ msgstr ""
#: frontend/src/components/Layouts/AppSidebar.vue:394
msgid "Create your first task"
-msgstr ""
+msgstr "Erstellen Sie Ihre erste Aufgabe"
#. Label of the currency (Link) field in DocType 'CRM Deal'
#. Label of the currency (Link) field in DocType 'CRM Organization'
@@ -1334,7 +1334,7 @@ msgstr ""
#: frontend/src/components/Layouts/AppSidebar.vue:536
msgid "Custom branding"
-msgstr ""
+msgstr "Benutzerdefiniertes Branding"
#: frontend/src/components/Layouts/AppSidebar.vue:585
msgid "Custom fields"
@@ -1568,7 +1568,7 @@ msgstr "Ansicht löschen"
#: frontend/src/components/DeleteLinkedDocModal.vue:65
msgid "Delete all"
-msgstr ""
+msgstr "Alles löschen"
#: frontend/src/components/Activities/AttachmentArea.vue:62
#: frontend/src/components/Activities/AttachmentArea.vue:138
@@ -1581,15 +1581,15 @@ msgstr "Kontakt löschen"
#: frontend/src/components/DeleteLinkedDocModal.vue:229
msgid "Delete linked item"
-msgstr ""
+msgstr "Verknüpftes Element löschen"
#: frontend/src/components/DeleteLinkedDocModal.vue:11
msgid "Delete or unlink linked documents"
-msgstr ""
+msgstr "Verknüpfte Dokumente löschen oder ihre Verknüpfung aufheben"
#: frontend/src/components/DeleteLinkedDocModal.vue:23
msgid "Delete or unlink these linked documents before deleting this document"
-msgstr ""
+msgstr "Verknüpfte Dokumente löschen oder ihre Verknüpfung aufheben bevor dieses Dokument gelöscht wird"
#: frontend/src/pages/MobileOrganization.vue:263
msgid "Delete organization"
@@ -1597,11 +1597,11 @@ msgstr "Organisation löschen"
#: frontend/src/components/DeleteLinkedDocModal.vue:66
msgid "Delete {0} item(s)"
-msgstr ""
+msgstr "{0} Element(e) löschen"
#: frontend/src/components/BulkDeleteLinkedDocModal.vue:28
msgid "Delete {0} items"
-msgstr ""
+msgstr "{0} Element(e) löschen"
#. Label of the description (Text Editor) field in DocType 'CRM Holiday'
#. Label of the description (Text Editor) field in DocType 'CRM Lost Reason'
@@ -1676,7 +1676,7 @@ msgstr "Dokumententyp"
#: frontend/src/data/document.js:28
msgid "Document does not exist"
-msgstr ""
+msgstr "Dokument existiert nicht"
#: crm/api/activities.py:19
msgid "Document not found"
@@ -1684,7 +1684,7 @@ msgstr "Dokument nicht gefunden"
#: frontend/src/data/document.js:42
msgid "Document updated successfully"
-msgstr ""
+msgstr "Dokument erfolgreich aktualisiert"
#: frontend/src/components/Modals/AboutModal.vue:62
msgid "Documentation"
@@ -1698,7 +1698,7 @@ msgstr "Erledigt"
#: frontend/src/components/Dashboard/AddChartModal.vue:33
#: frontend/src/components/Dashboard/AddChartModal.vue:71
msgid "Donut chart"
-msgstr ""
+msgstr "Donut-Diagramm"
#: frontend/src/components/Activities/AudioPlayer.vue:166
#: frontend/src/components/ViewControls.vue:254
@@ -1737,7 +1737,7 @@ msgstr "Ansicht duplizieren"
#: frontend/src/components/Settings/EmailTemplate/NewEmailTemplate.vue:10
msgid "Duplicate template"
-msgstr ""
+msgstr "Vorlage duplizieren"
#. Label of the duration (Duration) field in DocType 'CRM Call Log'
#. Label of the duration (Duration) field in DocType 'CRM Status Change Log'
@@ -1778,11 +1778,11 @@ msgstr "ERPNext ist nicht mit dem CRM integriert"
#: frontend/src/components/Settings/ERPNextSettings.vue:4
msgid "ERPNext settings"
-msgstr ""
+msgstr "ERPNext-Einstellungen"
#: frontend/src/components/Settings/ERPNextSettings.vue:5
msgid "ERPNext settings updated"
-msgstr ""
+msgstr "ERPNext-Einstellungen aktualisiert"
#: frontend/src/components/FieldLayout/Field.vue:91
#: frontend/src/components/FieldLayoutEditor.vue:319
@@ -1803,7 +1803,7 @@ msgstr "Layout der Datenfelder bearbeiten"
#: frontend/src/components/Settings/EmailEdit.vue:6
msgid "Edit Email"
-msgstr ""
+msgstr "E-Mail bearbeiten"
#: frontend/src/components/Modals/SidePanelModal.vue:7
msgid "Edit Field Layout"
@@ -1861,11 +1861,11 @@ msgstr "E-Mail"
#: frontend/src/components/Settings/Settings.vue:107
msgid "Email Accounts"
-msgstr ""
+msgstr "E-Mail Konten"
#: frontend/src/components/Settings/emailConfig.js:168
msgid "Email ID is required"
-msgstr ""
+msgstr "E-Mail ID ist erforderlich"
#. Label of the email_sent_at (Datetime) field in DocType 'CRM Invitation'
#: crm/fcrm/doctype/crm_invitation/crm_invitation.json
@@ -1879,19 +1879,19 @@ msgstr "E-Mail-Vorlagen"
#: frontend/src/components/Settings/EmailAdd.vue:141
msgid "Email account created successfully"
-msgstr ""
+msgstr "E-Mail-Konto erfolgreich erstellt"
#: frontend/src/components/Settings/EmailEdit.vue:208
msgid "Email account updated successfully"
-msgstr ""
+msgstr "E-Mail-Konto erfolgreich aktualisiert"
#: frontend/src/components/Settings/EmailAccountList.vue:7
msgid "Email accounts"
-msgstr ""
+msgstr "E-Mail-Konten"
#: frontend/src/components/Layouts/AppSidebar.vue:573
msgid "Email communication"
-msgstr ""
+msgstr "E-Mail-Kommunikation"
#: frontend/src/components/EmailEditor.vue:206
msgid "Email from Lead"
@@ -1899,11 +1899,11 @@ msgstr ""
#: frontend/src/components/Layouts/AppSidebar.vue:552
msgid "Email template"
-msgstr ""
+msgstr "E-Mail-Vorlage"
#: frontend/src/components/Settings/EmailTemplate/EmailTemplates.vue:7
msgid "Email templates"
-msgstr ""
+msgstr "E-Mail-Vorlagen"
#: frontend/src/pages/Deal.vue:545 frontend/src/pages/Lead.vue:411
#: frontend/src/pages/MobileDeal.vue:437 frontend/src/pages/MobileLead.vue:344
@@ -1929,7 +1929,7 @@ msgstr "ermöglichen"
#. Label of the enable_forecasting (Check) field in DocType 'FCRM Settings'
#: crm/fcrm/doctype/fcrm_settings/fcrm_settings.json
msgid "Enable Forecasting"
-msgstr ""
+msgstr "Vorhersage aktivieren"
#: frontend/src/components/Settings/emailConfig.js:28
msgid "Enable Incoming"
@@ -1941,7 +1941,7 @@ msgstr "Ausgehend aktivieren"
#: frontend/src/components/Settings/General/GeneralSettings.vue:19
msgid "Enable forecasting"
-msgstr ""
+msgstr "Vorhersage aktivieren"
#. Label of the enabled (Check) field in DocType 'CRM Exotel Settings'
#. Label of the enabled (Check) field in DocType 'CRM Form Script'
@@ -2185,7 +2185,7 @@ msgstr ""
#: crm/fcrm/doctype/fcrm_settings/fcrm_settings.json
#: frontend/src/components/Settings/General/BrandSettings.vue:81
msgid "Favicon"
-msgstr ""
+msgstr "Favicon"
#: frontend/src/components/Modals/EditValueModal.vue:5
msgid "Field"
@@ -2485,7 +2485,7 @@ msgstr ""
#: frontend/src/components/Settings/emailConfig.js:47
msgid "If enabled, all replies to your company (eg: replies@yourcomany.com) will come to this account. Note: Only one account can be default incoming."
-msgstr ""
+msgstr "Falls aktiviert, werden alle Antworten an Ihr Unternehmen (z.B. replies@yourcomany.com) an dieses Konto gesendet. Hinweis: Es kann nur ein Konto als Standard-Eingang festgelegt werden."
#: frontend/src/components/Settings/emailConfig.js:39
msgid "If enabled, outgoing emails can be sent from this account."
@@ -3299,7 +3299,7 @@ msgstr "Nächste Woche"
#: frontend/src/components/Filter.vue:672
msgid "Next Year"
-msgstr ""
+msgstr "Nächstes Jahr"
#: frontend/src/components/Controls/Grid.vue:27
msgid "No"
diff --git a/crm/locale/fa.po b/crm/locale/fa.po
index 2a15c1c7..7ba04f47 100644
--- a/crm/locale/fa.po
+++ b/crm/locale/fa.po
@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: frappe\n"
"Report-Msgid-Bugs-To: shariq@frappe.io\n"
"POT-Creation-Date: 2025-08-03 09:38+0000\n"
-"PO-Revision-Date: 2025-08-04 08:34\n"
+"PO-Revision-Date: 2025-08-12 11:22\n"
"Last-Translator: shariq@frappe.io\n"
"Language-Team: Persian\n"
"MIME-Version: 1.0\n"
@@ -166,7 +166,7 @@ msgstr ""
#: crm/fcrm/doctype/crm_invitation/crm_invitation.js:7
msgid "Accept Invitation"
-msgstr ""
+msgstr "پذیرش دعوت نامه"
#. Option for the 'Status' (Select) field in DocType 'CRM Invitation'
#: crm/fcrm/doctype/crm_invitation/crm_invitation.json
@@ -176,7 +176,7 @@ msgstr "پذیرفته شده"
#. Label of the accepted_at (Datetime) field in DocType 'CRM Invitation'
#: crm/fcrm/doctype/crm_invitation/crm_invitation.json
msgid "Accepted At"
-msgstr ""
+msgstr "پذیرفته شده در"
#. Label of the access_key (Data) field in DocType 'FCRM Settings'
#: crm/fcrm/doctype/fcrm_settings/fcrm_settings.json
@@ -189,7 +189,7 @@ msgstr "کلید دسترسی برای ارائهدهنده خدمات لاز
#: frontend/src/components/Settings/General/CurrencySettings.vue:97
msgid "Access key"
-msgstr ""
+msgstr "کلید دسترسی"
#: frontend/src/components/Settings/General/CurrencySettings.vue:101
msgid "Access key for Exchangerate Host. Required for fetching exchange rates."
@@ -245,7 +245,7 @@ msgstr ""
#: frontend/src/components/Kanban/KanbanSettings.vue:84
#: frontend/src/components/SidePanelLayoutEditor.vue:98
msgid "Add Field"
-msgstr ""
+msgstr "افزودن فیلد"
#: frontend/src/components/Filter.vue:138
msgid "Add Filter"
@@ -258,15 +258,15 @@ msgstr "افزودن ردیف"
#: frontend/src/components/FieldLayoutEditor.vue:200
#: frontend/src/components/SidePanelLayoutEditor.vue:130
msgid "Add Section"
-msgstr ""
+msgstr "افزودن بخش"
#: frontend/src/components/SortBy.vue:148
msgid "Add Sort"
-msgstr ""
+msgstr "افزودن مرتبسازی"
#: frontend/src/components/FieldLayoutEditor.vue:62
msgid "Add Tab"
-msgstr ""
+msgstr "افزودن تب"
#. Label of the add_weekly_holidays_section (Section Break) field in DocType
#. 'CRM Holiday List'
@@ -405,7 +405,7 @@ msgstr "درآمد سالانه"
#: frontend/src/components/Modals/DealModal.vue:201
#: frontend/src/components/Modals/LeadModal.vue:142
msgid "Annual Revenue should be a number"
-msgstr ""
+msgstr "درآمد سالانه باید یک عدد باشد"
#: frontend/src/components/Settings/General/BrandSettings.vue:69
msgid "Appears in the left sidebar. Recommended size is 32x32 px in PNG or SVG"
@@ -1033,12 +1033,12 @@ msgstr "ستون ها"
#: frontend/src/components/CommunicationArea.vue:19
#: frontend/src/components/Layouts/AppSidebar.vue:574
msgid "Comment"
-msgstr "اظهار نظر"
+msgstr "دیدگاه"
#: frontend/src/pages/Deal.vue:550 frontend/src/pages/Lead.vue:416
#: frontend/src/pages/MobileDeal.vue:442 frontend/src/pages/MobileLead.vue:349
msgid "Comments"
-msgstr "نظرات"
+msgstr "دیدگاهها"
#: crm/api/dashboard.py:884
msgid "Common reasons for losing deals"
@@ -1142,7 +1142,7 @@ msgstr "مخاطب قبلاً اضافه شده است"
#: crm/fcrm/doctype/crm_lead/crm_lead.py:211
msgid "Contact already exists with {0}"
-msgstr ""
+msgstr "مخاطب از قبل با {0} وجود دارد"
#: frontend/src/pages/Contact.vue:282 frontend/src/pages/MobileContact.vue:255
msgid "Contact image updated"
@@ -2565,7 +2565,7 @@ msgstr ""
#: frontend/src/components/Layouts/AppSidebar.vue:593
msgid "Integration"
-msgstr ""
+msgstr "یکپارچه سازی"
#: crm/integrations/exotel/handler.py:73
msgid "Integration Not Enabled"
@@ -4194,7 +4194,7 @@ msgstr ""
#: crm/fcrm/doctype/crm_deal/crm_deal.json
#: crm/fcrm/doctype/crm_lead/crm_lead.json
msgid "SLA Status"
-msgstr ""
+msgstr "وضعیت SLA"
#: frontend/src/components/EmailEditor.vue:82
msgid "SUBJECT"
@@ -4498,7 +4498,7 @@ msgstr ""
#: frontend/src/components/FieldLayoutEditor.vue:355
msgid "Show label"
-msgstr ""
+msgstr "نمایش برچسب"
#: frontend/src/components/Controls/GridRowFieldsModal.vue:20
#: frontend/src/components/Modals/DataFieldsModal.vue:20
@@ -4648,7 +4648,7 @@ msgstr ""
#: frontend/src/components/FilesUploader/FilesUploader.vue:49
msgid "Switch camera"
-msgstr ""
+msgstr "تغییر دوربین"
#: frontend/src/pages/Welcome.vue:32
msgid "Sync your contacts,email and calenders"
@@ -4678,7 +4678,7 @@ msgstr ""
#: frontend/src/components/Telephony/ExotelCallUI.vue:151
msgid "Take a note..."
-msgstr ""
+msgstr "یادداشت کنید..."
#. Option for the 'Type' (Select) field in DocType 'CRM Notification'
#: crm/fcrm/doctype/crm_notification/crm_notification.json
@@ -4762,7 +4762,7 @@ msgstr "نام منطقه"
#: crm/fcrm/doctype/crm_service_level_agreement/crm_service_level_agreement.py:46
msgid "The Condition '{0}' is invalid: {1}"
-msgstr ""
+msgstr "شرط '{0}' نامعتبر است: {1}"
#. Description of the 'Exchange Rate' (Float) field in DocType 'CRM Deal'
#: crm/fcrm/doctype/crm_deal/crm_deal.json
@@ -4939,7 +4939,7 @@ msgstr "سهشنبه"
#. Label of the twiml_sid (Data) field in DocType 'CRM Twilio Settings'
#: crm/fcrm/doctype/crm_twilio_settings/crm_twilio_settings.json
msgid "TwiML SID"
-msgstr ""
+msgstr "TwiML SID"
#. Option for the 'Telephony Medium' (Select) field in DocType 'CRM Call Log'
#. Label of the twilio (Check) field in DocType 'CRM Telephony Agent'
@@ -4951,7 +4951,7 @@ msgstr ""
#: frontend/src/components/Settings/TelephonySettings.vue:40
#: frontend/src/components/Settings/TelephonySettings.vue:50
msgid "Twilio"
-msgstr ""
+msgstr "Twilio"
#: crm/fcrm/doctype/crm_twilio_settings/crm_twilio_settings.py:59
#: crm/fcrm/doctype/crm_twilio_settings/crm_twilio_settings.py:60
@@ -4965,7 +4965,7 @@ msgstr ""
#: frontend/src/components/Settings/TelephonySettings.vue:289
msgid "Twilio is not enabled"
-msgstr ""
+msgstr "Twilio فعال نیست"
#: frontend/src/components/Settings/TelephonySettings.vue:125
msgid "Twilio settings updated successfully"
@@ -5377,7 +5377,7 @@ msgstr "group_by"
#: frontend/src/components/Activities/CallArea.vue:16
msgid "has made a call"
-msgstr ""
+msgstr "تماس گرفته است"
#: frontend/src/components/Activities/CallArea.vue:15
msgid "has reached out"
diff --git a/crm/locale/it.po b/crm/locale/it.po
index e2df9406..aa3f95fc 100644
--- a/crm/locale/it.po
+++ b/crm/locale/it.po
@@ -3,7 +3,7 @@ msgstr ""
"Project-Id-Version: frappe\n"
"Report-Msgid-Bugs-To: shariq@frappe.io\n"
"POT-Creation-Date: 2025-08-03 09:38+0000\n"
-"PO-Revision-Date: 2025-08-08 10:07\n"
+"PO-Revision-Date: 2025-08-11 10:38\n"
"Last-Translator: shariq@frappe.io\n"
"Language-Team: Italian\n"
"MIME-Version: 1.0\n"
@@ -208,7 +208,7 @@ msgstr "SID dell'Account"
#: frontend/src/components/Settings/emailConfig.js:165
msgid "Account name is required"
-msgstr "Il nome dell'account è obbligatorio"
+msgstr "Il nome dell'Account è obbligatorio"
#: frontend/src/components/CustomActions.vue:73
#: frontend/src/components/ViewControls.vue:683
@@ -377,7 +377,7 @@ msgstr ""
#: frontend/src/data/document.js:63
msgid "An error occurred while updating the document"
-msgstr ""
+msgstr "Si è verificato un errore durante l'aggiornamento del documento"
#. Description of the 'Favicon' (Attach) field in DocType 'FCRM Settings'
#: crm/fcrm/doctype/fcrm_settings/fcrm_settings.json
@@ -472,7 +472,7 @@ msgstr ""
#: crm/fcrm/doctype/fcrm_settings/fcrm_settings.py:193
msgid "Ask your manager to set up the Exchange Rate Provider, as default provider does not support currency conversion for {0} to {1}."
-msgstr ""
+msgstr "Chiedi al tuo manager di configurare un fornitore di tassi di cambio, poiché quello predefinito non supporta la conversione da {0} a {1}."
#: frontend/src/components/ListBulkActions.vue:184
#: frontend/src/components/Modals/AssignmentModal.vue:5
@@ -726,7 +726,7 @@ msgstr ""
#. Name of a DocType
#: crm/fcrm/doctype/crm_lead/crm_lead.json
msgid "CRM Lead"
-msgstr ""
+msgstr "Offerta CRM"
#. Name of a DocType
#: crm/fcrm/doctype/crm_lead_source/crm_lead_source.json
@@ -791,7 +791,7 @@ msgstr ""
#. Name of a DocType
#: crm/fcrm/doctype/crm_task/crm_task.json
msgid "CRM Task"
-msgstr ""
+msgstr "Attività CRM"
#. Name of a DocType
#: crm/fcrm/doctype/crm_telephony_agent/crm_telephony_agent.json
@@ -824,7 +824,7 @@ msgstr ""
#: frontend/src/components/ViewControls.vue:272
msgid "CSV"
-msgstr ""
+msgstr "CSV"
#: frontend/src/components/Modals/CallLogDetailModal.vue:8
msgid "Call Details"
@@ -966,7 +966,7 @@ msgstr ""
#: frontend/src/components/Controls/Link.vue:62
msgid "Clear"
-msgstr ""
+msgstr "Pulisci"
#: frontend/src/components/ListBulkActions.vue:134
#: frontend/src/components/ListBulkActions.vue:142
@@ -1086,7 +1086,7 @@ msgstr ""
#: frontend/src/components/Settings/General/CurrencySettings.vue:70
msgid "Configure the exchange rate provider for your CRM"
-msgstr ""
+msgstr "Configura un exchange rate provider per il tuo CRM"
#: frontend/src/composables/frappecloud.js:29
msgid "Confirm"
@@ -1099,7 +1099,7 @@ msgstr ""
#: frontend/src/components/Modals/ChangePasswordModal.vue:18
msgid "Confirm Password"
-msgstr "Conferma Password"
+msgstr "Ripeti Password"
#: frontend/src/components/Settings/Users.vue:225
#: frontend/src/components/Settings/Users.vue:228
@@ -1118,7 +1118,7 @@ msgstr ""
#: frontend/src/components/Modals/ConvertToDealModal.vue:65
#: frontend/src/pages/MobileLead.vue:147
msgid "Contact"
-msgstr ""
+msgstr "Contatto"
#: crm/fcrm/doctype/crm_lead/crm_lead.py:212
msgid "Contact Already Exists"
@@ -1228,7 +1228,7 @@ msgstr "Copiato negli appunti"
#: crm/api/dashboard.py:607 crm/api/dashboard.py:736 crm/api/dashboard.py:794
#: crm/api/dashboard.py:891
msgid "Count"
-msgstr ""
+msgstr "Q.tà"
#: frontend/src/components/Modals/AddressModal.vue:99
#: frontend/src/components/Modals/CallLogModal.vue:102
@@ -1667,7 +1667,7 @@ msgstr ""
#: crm/fcrm/doctype/crm_global_settings/crm_global_settings.json
#: crm/fcrm/doctype/crm_view_settings/crm_view_settings.json
msgid "DocType"
-msgstr "Tipo di documento"
+msgstr "Tipo Documento"
#. Label of the dt (Link) field in DocType 'CRM Fields Layout'
#: crm/fcrm/doctype/crm_fields_layout/crm_fields_layout.json
@@ -1676,7 +1676,7 @@ msgstr "Tipo Documento"
#: frontend/src/data/document.js:28
msgid "Document does not exist"
-msgstr ""
+msgstr "Il Documento non esiste"
#: crm/api/activities.py:19
msgid "Document not found"
@@ -1749,7 +1749,7 @@ msgstr ""
#: frontend/src/components/Layouts/AppSidebar.vue:599
#: frontend/src/components/Settings/Settings.vue:135
msgid "ERPNext"
-msgstr ""
+msgstr "ERPNext"
#. Name of a DocType
#: crm/fcrm/doctype/erpnext_crm_settings/erpnext_crm_settings.json
@@ -1791,7 +1791,7 @@ msgstr ""
#: frontend/src/components/ViewControls.vue:1131
#: frontend/src/pages/Dashboard.vue:19
msgid "Edit"
-msgstr ""
+msgstr "Modifica"
#: frontend/src/components/Modals/CallLogModal.vue:98
msgid "Edit Call Log"
@@ -1973,7 +1973,7 @@ msgstr ""
#: frontend/src/components/Settings/General/CurrencySettings.vue:122
msgid "Enter access key"
-msgstr ""
+msgstr "Inserisci la chiave di accesso"
#: frontend/src/components/FieldLayout/Field.vue:334
msgid "Enter {0}"
@@ -1996,7 +1996,7 @@ msgstr ""
#: frontend/src/pages/Deal.vue:739 frontend/src/pages/Lead.vue:486
#: frontend/src/pages/MobileDeal.vue:614 frontend/src/pages/MobileLead.vue:415
msgid "Error updating field"
-msgstr ""
+msgstr "Aggiornamento campo non riuscito"
#: crm/fcrm/doctype/erpnext_crm_settings/erpnext_crm_settings.py:261
msgid "Error while creating customer in ERPNext, check error log for more details"
@@ -2080,7 +2080,7 @@ msgstr ""
#: crm/fcrm/doctype/crm_deal/crm_deal.py:161
msgid "Expected Closure Date is required."
-msgstr ""
+msgstr "Data Chiusura Prevista obbligatoria."
#. Label of the expected_deal_value (Currency) field in DocType 'CRM Deal'
#: crm/fcrm/doctype/crm_deal/crm_deal.json
@@ -2099,7 +2099,7 @@ msgstr ""
#: frontend/src/components/ViewControls.vue:203
#: frontend/src/components/ViewControls.vue:251
msgid "Export"
-msgstr "Esportare"
+msgstr "Esporta"
#: frontend/src/components/ViewControls.vue:282
msgid "Export All {0} Record(s)"
@@ -2150,7 +2150,7 @@ msgstr ""
#: crm/fcrm/doctype/fcrm_settings/fcrm_settings.py:205
msgid "Failed to fetch exchange rate from {0} to {1} on {2}. Please check your internet connection or try again later."
-msgstr ""
+msgstr "Impossibile recuperare il tasso di cambio da {0} a {1} in data {2}. Controlla la tua connessione internet o riprova più tardi."
#: frontend/src/data/script.js:106
msgid "Failed to load form controller: {0}"
@@ -2227,7 +2227,7 @@ msgstr "Filtri"
#: frontend/src/components/SortBy.vue:6 frontend/src/components/SortBy.vue:106
#: frontend/src/components/SortBy.vue:140
msgid "First Name"
-msgstr "Nome di battesimo"
+msgstr "Nome"
#: frontend/src/components/Modals/LeadModal.vue:135
msgid "First Name is mandatory"
@@ -2296,7 +2296,7 @@ msgstr ""
#. Name of a Workspace
#: crm/fcrm/workspace/frappe_crm/frappe_crm.json
msgid "Frappe CRM"
-msgstr ""
+msgstr "CRM Frappe"
#: frontend/src/components/Layouts/AppSidebar.vue:603
msgid "Frappe CRM mobile"
@@ -2359,7 +2359,7 @@ msgstr ""
#: crm/fcrm/doctype/crm_deal/crm_deal.json
#: crm/fcrm/doctype/crm_lead/crm_lead.json
msgid "Gender"
-msgstr ""
+msgstr "Genere"
#: frontend/src/components/Settings/General/GeneralSettings.vue:5
#: frontend/src/components/Settings/Settings.vue:89
@@ -2414,7 +2414,7 @@ msgstr "Nascosto"
#: frontend/src/components/Activities/Activities.vue:230
msgid "Hide"
-msgstr ""
+msgstr "Nascosto"
#: frontend/src/components/Controls/Password.vue:19
msgid "Hide Password"
@@ -2652,7 +2652,7 @@ msgstr ""
#. Label of the is_default (Check) field in DocType 'CRM View Settings'
#: crm/fcrm/doctype/crm_view_settings/crm_view_settings.json
msgid "Is Default"
-msgstr "È predefinito"
+msgstr "È Predefinito"
#. Label of the is_erpnext_in_different_site (Check) field in DocType 'ERPNext
#. CRM Settings'
@@ -2690,7 +2690,7 @@ msgstr ""
#. Label of the json (JSON) field in DocType 'CRM Global Settings'
#: crm/fcrm/doctype/crm_global_settings/crm_global_settings.json
msgid "JSON"
-msgstr ""
+msgstr "JSON"
#. Label of the job_title (Data) field in DocType 'CRM Deal'
#. Label of the job_title (Data) field in DocType 'CRM Lead'
@@ -2711,7 +2711,7 @@ msgstr ""
#: frontend/src/components/ViewControls.vue:384
#: frontend/src/components/ViewControls.vue:600 frontend/src/utils/view.js:20
msgid "Kanban"
-msgstr ""
+msgstr "Kanban"
#. Label of the kanban_columns (Code) field in DocType 'CRM View Settings'
#: crm/fcrm/doctype/crm_view_settings/crm_view_settings.json
@@ -2859,7 +2859,7 @@ msgstr ""
#: frontend/src/components/FilesUploader/FilesUploaderArea.vue:43
msgid "Library"
-msgstr ""
+msgstr "Libreria"
#: frontend/src/components/Filter.vue:274
#: frontend/src/components/Filter.vue:285
@@ -2974,7 +2974,7 @@ msgstr ""
#. Option for the 'Priority' (Select) field in DocType 'CRM Task'
#: crm/fcrm/doctype/crm_task/crm_task.json
msgid "Low"
-msgstr ""
+msgstr "Bassa"
#: frontend/src/pages/Contact.vue:94 frontend/src/pages/MobileContact.vue:73
msgid "Make Call"
@@ -3091,7 +3091,7 @@ msgstr ""
#: crm/fcrm/doctype/crm_contacts/crm_contacts.json
#: crm/fcrm/doctype/crm_lead/crm_lead.json
msgid "Mobile No"
-msgstr ""
+msgstr "Cellulare"
#: frontend/src/components/Modals/DealModal.vue:209
#: frontend/src/components/Modals/LeadModal.vue:150
@@ -3119,7 +3119,7 @@ msgstr ""
#: frontend/src/pages/MobileOrganization.vue:470
#: frontend/src/pages/Organization.vue:479
msgid "Mobile no"
-msgstr ""
+msgstr "Cellulare"
#. Option for the 'Weekly Off' (Select) field in DocType 'CRM Holiday List'
#. Option for the 'Workday' (Select) field in DocType 'CRM Service Day'
@@ -3218,7 +3218,7 @@ msgstr ""
#: frontend/src/components/Activities/ActivityHeader.vue:17
#: frontend/src/components/Activities/ActivityHeader.vue:127
msgid "New Email"
-msgstr ""
+msgstr "Nuova E-mail"
#: frontend/src/components/Activities/ActivityHeader.vue:73
msgid "New Message"
@@ -3236,7 +3236,7 @@ msgstr ""
#: frontend/src/components/Modals/ChangePasswordModal.vue:6
msgid "New Password"
-msgstr ""
+msgstr "Nuova Password"
#: frontend/src/components/FieldLayoutEditor.vue:203
#: frontend/src/components/SidePanelLayoutEditor.vue:133
@@ -3675,7 +3675,7 @@ msgstr ""
#: frontend/src/components/Settings/emailConfig.js:64
msgid "Password"
-msgstr ""
+msgstr "Password"
#: crm/api/demo.py:21 crm/api/demo.py:29
msgid "Password cannot be reset by Demo User {}"
@@ -3729,7 +3729,7 @@ msgstr ""
#: frontend/src/pages/MobileOrganization.vue:498
#: frontend/src/pages/Organization.vue:507
msgid "Phone"
-msgstr ""
+msgstr "Telefono"
#. Label of the phone_nos (Table) field in DocType 'CRM Telephony Agent'
#: crm/fcrm/doctype/crm_telephony_agent/crm_telephony_agent.json
@@ -4002,7 +4002,7 @@ msgstr "Nome di Riferimento"
#: frontend/src/components/ViewControls.vue:160
#: frontend/src/pages/Dashboard.vue:10
msgid "Refresh"
-msgstr ""
+msgstr "Ricarica"
#: frontend/src/components/Telephony/TwilioCallUI.vue:104
msgid "Reject"
@@ -4228,7 +4228,7 @@ msgstr ""
#: crm/fcrm/doctype/fcrm_note/fcrm_note.json
#: crm/fcrm/doctype/fcrm_settings/fcrm_settings.json
msgid "Sales Manager"
-msgstr ""
+msgstr "Responsabile Vendite"
#. Name of a role
#. Option for the 'Role' (Select) field in DocType 'CRM Invitation'
@@ -4302,7 +4302,7 @@ msgstr ""
#: frontend/src/components/ViewControls.vue:123
#: frontend/src/pages/Dashboard.vue:45
msgid "Save"
-msgstr ""
+msgstr "Salva"
#: frontend/src/components/Modals/ViewModal.vue:13
#: frontend/src/components/ViewControls.vue:57
@@ -4486,7 +4486,7 @@ msgstr ""
#: frontend/src/components/Activities/Activities.vue:230
msgid "Show"
-msgstr ""
+msgstr "Mostra"
#: frontend/src/components/Controls/Password.vue:19
msgid "Show Password"
@@ -4515,7 +4515,7 @@ msgstr ""
#. Option for the 'Type' (Select) field in DocType 'CRM Global Settings'
#: crm/fcrm/doctype/crm_global_settings/crm_global_settings.json
msgid "Sidebar Items"
-msgstr ""
+msgstr "Elementi della Barra Laterale"
#. Description of the 'Condition' (Code) field in DocType 'CRM Service Level
#. Agreement'
@@ -4534,7 +4534,7 @@ msgstr ""
#: crm/fcrm/doctype/crm_lead/crm_lead.json
#: frontend/src/components/Modals/EditValueModal.vue:10
msgid "Source"
-msgstr ""
+msgstr "Sorgente"
#. Label of the source_name (Data) field in DocType 'CRM Lead Source'
#: crm/fcrm/doctype/crm_lead_source/crm_lead_source.json
@@ -4670,7 +4670,7 @@ msgstr ""
#: crm/fcrm/doctype/erpnext_crm_settings/erpnext_crm_settings.json
#: crm/fcrm/doctype/fcrm_settings/fcrm_settings.json
msgid "System Manager"
-msgstr ""
+msgstr "Amministratore di Sistema"
#: frontend/src/components/EmailEditor.vue:22
msgid "TO"
@@ -5564,7 +5564,7 @@ msgstr ""
#: frontend/src/utils/index.js:130
msgid "{0} M"
-msgstr ""
+msgstr "{0} mesi"
#: crm/api/todo.py:50
msgid "{0} assigned a {1} {2} to you"
@@ -5572,7 +5572,7 @@ msgstr ""
#: frontend/src/utils/index.js:126
msgid "{0} d"
-msgstr ""
+msgstr "{0} giorni"
#: frontend/src/utils/index.js:181
msgid "{0} days ago"
@@ -5616,7 +5616,7 @@ msgstr ""
#: frontend/src/utils/index.js:128
msgid "{0} w"
-msgstr ""
+msgstr "{0} settimane"
#: frontend/src/utils/index.js:185
msgid "{0} weeks ago"
@@ -5624,7 +5624,7 @@ msgstr ""
#: frontend/src/utils/index.js:132
msgid "{0} y"
-msgstr ""
+msgstr "{0} anni"
#: frontend/src/utils/index.js:193
msgid "{0} years ago"
diff --git a/crm/locale/main.pot b/crm/locale/main.pot
index 573b1c77..35d0cdf1 100644
--- a/crm/locale/main.pot
+++ b/crm/locale/main.pot
@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: Frappe CRM VERSION\n"
"Report-Msgid-Bugs-To: shariq@frappe.io\n"
-"POT-Creation-Date: 2025-08-10 09:37+0000\n"
-"PO-Revision-Date: 2025-08-10 09:37+0000\n"
+"POT-Creation-Date: 2025-08-17 09:36+0000\n"
+"PO-Revision-Date: 2025-08-17 09:36+0000\n"
"Last-Translator: shariq@frappe.io\n"
"Language-Team: shariq@frappe.io\n"
"MIME-Version: 1.0\n"
diff --git a/crm/templates/emails/helpdesk_invitation.html b/crm/templates/emails/helpdesk_invitation.html
new file mode 100644
index 00000000..77fb852a
--- /dev/null
+++ b/crm/templates/emails/helpdesk_invitation.html
@@ -0,0 +1,24 @@
+
+ {{_("Hello")}} {{ first_name }}{% if last_name %} {{ last_name}}{% endif %},
+
+{% set site_link = "" + site_url + "" %}
+{{_("A new account has been created for you at {0}").format(site_link)}}.
+{{_("Your login id is")}}: {{ user }}
+
{{_("Click on the link below to complete your registration and set a new password")}}.
+
+
+ {{ _("Complete Registration") }}
+
+
+{% if created_by != "Administrator" %}
+
+
+ {{_("Thanks")}},
+ {{ created_by }}
+
+{% endif %}
+
+
+ {{_("You can also copy-paste following link in your browser")}}
+ {{ link }}
+
diff --git a/frontend/components.d.ts b/frontend/components.d.ts
index 8b1b706a..094bac87 100644
--- a/frontend/components.d.ts
+++ b/frontend/components.d.ts
@@ -142,6 +142,8 @@ declare module 'vue' {
GroupBy: typeof import('./src/components/GroupBy.vue')['default']
GroupByIcon: typeof import('./src/components/Icons/GroupByIcon.vue')['default']
HeartIcon: typeof import('./src/components/Icons/HeartIcon.vue')['default']
+ HelpdeskIcon: typeof import('./src/components/Icons/HelpdeskIcon.vue')['default']
+ HelpdeskSettings: typeof import('./src/components/Settings/HelpdeskSettings.vue')['default']
HelpIcon: typeof import('./src/components/Icons/HelpIcon.vue')['default']
HomeActions: typeof import('./src/components/Settings/General/HomeActions.vue')['default']
Icon: typeof import('./src/components/Icon.vue')['default']
@@ -171,9 +173,6 @@ declare module 'vue' {
LostReasonModal: typeof import('./src/components/Modals/LostReasonModal.vue')['default']
LucideCalendar: typeof import('~icons/lucide/calendar')['default']
LucideChevronRight: typeof import('~icons/lucide/chevron-right')['default']
- LucidePenLine: typeof import('~icons/lucide/pen-line')['default']
- LucideRefreshCcw: typeof import('~icons/lucide/refresh-ccw')['default']
- LucideX: typeof import('~icons/lucide/x')['default']
MarkAsDoneIcon: typeof import('./src/components/Icons/MarkAsDoneIcon.vue')['default']
MaximizeIcon: typeof import('./src/components/Icons/MaximizeIcon.vue')['default']
MenuIcon: typeof import('./src/components/Icons/MenuIcon.vue')['default']
@@ -188,7 +187,6 @@ declare module 'vue' {
MultiSelectEmailInput: typeof import('./src/components/Controls/MultiSelectEmailInput.vue')['default']
MultiSelectUserInput: typeof import('./src/components/Controls/MultiSelectUserInput.vue')['default']
MuteIcon: typeof import('./src/components/Icons/MuteIcon.vue')['default']
- NestedPopover: typeof import('./src/components/NestedPopover.vue')['default']
NewEmailTemplate: typeof import('./src/components/Settings/EmailTemplate/NewEmailTemplate.vue')['default']
NoteArea: typeof import('./src/components/Activities/NoteArea.vue')['default']
NoteIcon: typeof import('./src/components/Icons/NoteIcon.vue')['default']
diff --git a/frontend/package.json b/frontend/package.json
index ec932138..b6e12e74 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -13,7 +13,7 @@
"@tiptap/extension-paragraph": "^2.12.0",
"@twilio/voice-sdk": "^2.10.2",
"@vueuse/integrations": "^10.3.0",
- "frappe-ui": "^0.1.171",
+ "frappe-ui": "^0.1.189",
"gemoji": "^8.1.0",
"lodash": "^4.17.21",
"mime": "^4.0.1",
diff --git a/frontend/src/components/Activities/Activities.vue b/frontend/src/components/Activities/Activities.vue
index 2c8d0341..05c0e317 100644
--- a/frontend/src/components/Activities/Activities.vue
+++ b/frontend/src/components/Activities/Activities.vue
@@ -238,12 +238,9 @@
+ />
-
-
-
-
{{ __('New Email') }}
-
+ />
+ />
-
-
-
- {{ __('New Note') }}
-
+ />
+ />
+ />
-
+
-
+
diff --git a/frontend/src/components/Activities/AttachmentArea.vue b/frontend/src/components/Activities/AttachmentArea.vue
index 7627b5e2..d5ada2aa 100644
--- a/frontend/src/components/Activities/AttachmentArea.vue
+++ b/frontend/src/components/Activities/AttachmentArea.vue
@@ -38,42 +38,31 @@
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
diff --git a/frontend/src/components/Activities/AudioPlayer.vue b/frontend/src/components/Activities/AudioPlayer.vue
index 71b28b1c..ebb62b94 100644
--- a/frontend/src/components/Activities/AudioPlayer.vue
+++ b/frontend/src/components/Activities/AudioPlayer.vue
@@ -1,12 +1,12 @@
-
+
-
+
diff --git a/frontend/src/components/Activities/DataFields.vue b/frontend/src/components/Activities/DataFields.vue
index 5b864ef1..bbe8e16c 100644
--- a/frontend/src/components/Activities/DataFields.vue
+++ b/frontend/src/components/Activities/DataFields.vue
@@ -14,12 +14,10 @@
+ />
-
-
-
-
-
+
diff --git a/frontend/src/components/Settings/General/CurrencySettings.vue b/frontend/src/components/Settings/General/CurrencySettings.vue
index 69d6ec88..841d2d33 100644
--- a/frontend/src/components/Settings/General/CurrencySettings.vue
+++ b/frontend/src/components/Settings/General/CurrencySettings.vue
@@ -131,7 +131,7 @@
\ No newline at end of file
diff --git a/frontend/src/components/Settings/InviteUserPage.vue b/frontend/src/components/Settings/InviteUserPage.vue
index 6402f416..3881cb60 100644
--- a/frontend/src/components/Settings/InviteUserPage.vue
+++ b/frontend/src/components/Settings/InviteUserPage.vue
@@ -80,19 +80,16 @@
diff --git a/frontend/src/components/Settings/Settings.vue b/frontend/src/components/Settings/Settings.vue
index ed5d4a15..4b1f9b90 100644
--- a/frontend/src/components/Settings/Settings.vue
+++ b/frontend/src/components/Settings/Settings.vue
@@ -43,6 +43,7 @@