Merge pull request #1062 from frappe/main-hotfix

This commit is contained in:
Shariq Ansari 2025-07-23 13:42:20 +05:30 committed by GitHub
commit f0b58ba28a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
29 changed files with 80054 additions and 10855 deletions

View File

@ -139,12 +139,12 @@ class CRMDeal(Document):
if sla:
sla.apply(self)
def update_close_date(self):
def update_closed_date(self):
"""
Update the close date based on the "Won" status.
Update the closed date based on the "Won" status.
"""
if self.status == "Won" and not self.close_date:
self.close_date = frappe.utils.nowdate()
if self.status == "Won" and not self.closed_date:
self.closed_date = frappe.utils.nowdate()
def update_default_probability(self):
"""
@ -154,13 +154,13 @@ class CRMDeal(Document):
self.probability = frappe.db.get_value("CRM Deal Status", self.status, "probability") or 0
def validate_forcasting_fields(self):
self.update_close_date()
self.update_closed_date()
self.update_default_probability()
if frappe.db.get_single_value("FCRM Settings", "enable_forecasting"):
if not self.deal_value or self.deal_value == 0:
frappe.throw(_("Deal Value is required."), frappe.MandatoryError)
if not self.close_date:
frappe.throw(_("Close Date is required."), frappe.MandatoryError)
if not self.expected_deal_value or self.expected_deal_value == 0:
frappe.throw(_("Expected Deal Value is required."), frappe.MandatoryError)
if not self.expected_closure_date:
frappe.throw(_("Expected Closure Date is required."), frappe.MandatoryError)
def validate_lost_reason(self):
"""

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

5586
crm/locale/cs.po Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

5586
crm/locale/id.po Normal file

File diff suppressed because it is too large Load Diff

5586
crm/locale/it.po Normal file

File diff suppressed because it is too large Load Diff

View File

@ -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-07-13 09:38+0000\n"
"PO-Revision-Date: 2025-07-13 09:38+0000\n"
"POT-Creation-Date: 2025-07-20 09:37+0000\n"
"PO-Revision-Date: 2025-07-20 09:37+0000\n"
"Last-Translator: shariq@frappe.io\n"
"Language-Team: shariq@frappe.io\n"
"MIME-Version: 1.0\n"
@ -202,6 +202,7 @@ msgstr ""
msgid "Activity"
msgstr ""
#: frontend/src/components/Dashboard/AddChartModal.vue:41
#: frontend/src/components/Modals/AddExistingUserModal.vue:53
msgid "Add"
msgstr ""
@ -254,6 +255,10 @@ msgstr ""
msgid "Add Weekly Holidays"
msgstr ""
#: frontend/src/components/Dashboard/AddChartModal.vue:4
msgid "Add chart"
msgstr ""
#: frontend/src/components/FieldLayoutEditor.vue:426
msgid "Add column"
msgstr ""
@ -497,20 +502,69 @@ msgstr ""
msgid "Auth Token"
msgstr ""
#: crm/api/dashboard.py:257
#: crm/api/dashboard.py:238
msgid "Average deal value of non won/lost deals"
msgstr ""
#: crm/api/dashboard.py:411
msgid "Average deal value of ongoing & won deals"
msgstr ""
#: crm/api/dashboard.py:311
#: crm/api/dashboard.py:354
msgid "Average deal value of won deals"
msgstr ""
#: crm/api/dashboard.py:518
msgid "Average time taken from deal creation to deal closure"
msgstr ""
#: crm/api/dashboard.py:464
msgid "Average time taken from lead creation to deal closure"
msgstr ""
#: crm/api/dashboard.py:255
msgid "Avg Deal Value"
#: frontend/src/components/Dashboard/AddChartModal.vue:81
msgid "Avg deal value"
msgstr ""
#: crm/api/dashboard.py:309
msgid "Avg Time to Close"
#: frontend/src/components/Dashboard/AddChartModal.vue:78
msgid "Avg ongoing deal value"
msgstr ""
#: frontend/src/components/Dashboard/AddChartModal.vue:87
msgid "Avg time to close a deal"
msgstr ""
#: frontend/src/components/Dashboard/AddChartModal.vue:83
msgid "Avg time to close a lead"
msgstr ""
#: frontend/src/components/Dashboard/AddChartModal.vue:80
msgid "Avg won deal value"
msgstr ""
#: crm/api/dashboard.py:410
msgid "Avg. deal value"
msgstr ""
#: crm/api/dashboard.py:237
msgid "Avg. ongoing deal value"
msgstr ""
#: crm/api/dashboard.py:517
msgid "Avg. time to close a deal"
msgstr ""
#: crm/api/dashboard.py:463
msgid "Avg. time to close a lead"
msgstr ""
#: crm/api/dashboard.py:353
msgid "Avg. won deal value"
msgstr ""
#: frontend/src/components/Dashboard/AddChartModal.vue:26
#: frontend/src/components/Dashboard/AddChartModal.vue:70
msgid "Axis chart"
msgstr ""
#: frontend/src/components/Activities/EmailArea.vue:72
@ -581,7 +635,9 @@ msgstr ""
msgid "CRM Contacts"
msgstr ""
#: frontend/src/pages/Dashboard.vue:511
#. Name of a DocType
#: crm/fcrm/doctype/crm_dashboard/crm_dashboard.json
#: frontend/src/pages/Dashboard.vue:318
msgid "CRM Dashboard"
msgstr ""
@ -795,12 +851,14 @@ msgstr ""
#: frontend/src/components/BulkDeleteLinkedDocModal.vue:81
#: frontend/src/components/ColumnSettings.vue:132
#: frontend/src/components/Dashboard/AddChartModal.vue:40
#: frontend/src/components/DeleteLinkedDocModal.vue:114
#: frontend/src/components/Modals/AssignmentModal.vue:9
#: frontend/src/components/Modals/LostReasonModal.vue:43
#: frontend/src/components/Telephony/TwilioCallUI.vue:77
#: frontend/src/components/ViewControls.vue:56
#: frontend/src/components/ViewControls.vue:156
#: frontend/src/pages/Dashboard.vue:41
msgid "Cancel"
msgstr ""
@ -853,6 +911,14 @@ msgstr ""
msgid "Change image"
msgstr ""
#: frontend/src/pages/Dashboard.vue:28
msgid "Chart"
msgstr ""
#: frontend/src/components/Dashboard/AddChartModal.vue:12
msgid "Chart Type"
msgstr ""
#: frontend/src/components/Modals/ConvertToDealModal.vue:43
#: frontend/src/components/Modals/ConvertToDealModal.vue:69
#: frontend/src/pages/MobileLead.vue:125 frontend/src/pages/MobileLead.vue:152
@ -898,18 +964,13 @@ msgstr ""
msgid "Close"
msgstr ""
#. Label of the close_date (Date) field in DocType 'CRM Deal'
#: crm/fcrm/doctype/crm_deal/crm_deal.json
msgid "Close Date"
msgstr ""
#: crm/fcrm/doctype/crm_deal/crm_deal.py:163
msgid "Close Date is required."
msgstr ""
#. Label of the closed_on (Datetime) field in DocType 'CRM Deal'
#. Label of the closed_date (Date) field in DocType 'CRM Deal'
#: crm/fcrm/doctype/crm_deal/crm_deal.json
msgid "Closed On"
msgid "Closed Date"
msgstr ""
#: frontend/src/components/Layouts/AppSidebar.vue:107
@ -956,7 +1017,7 @@ msgstr ""
msgid "Comments"
msgstr ""
#: frontend/src/pages/Dashboard.vue:422
#: crm/api/dashboard.py:884
msgid "Common reasons for losing deals"
msgstr ""
@ -1137,8 +1198,8 @@ msgstr ""
msgid "Copied to clipboard"
msgstr ""
#: frontend/src/pages/Dashboard.vue:278 frontend/src/pages/Dashboard.vue:311
#: frontend/src/pages/Dashboard.vue:429
#: crm/api/dashboard.py:607 crm/api/dashboard.py:736 crm/api/dashboard.py:794
#: crm/api/dashboard.py:891
msgid "Count"
msgstr ""
@ -1233,16 +1294,11 @@ msgstr ""
msgid "Currency"
msgstr ""
#. Label of the currency_exchange (Link) field in DocType 'CRM Organization'
#: crm/fcrm/doctype/crm_organization/crm_organization.json
msgid "Currency Exchange"
msgstr ""
#: frontend/src/components/Settings/General/GeneralSettings.vue:151
msgid "Currency set as {0} successfully"
msgstr ""
#: frontend/src/pages/Dashboard.vue:481
#: crm/api/dashboard.py:839
msgid "Current pipeline distribution"
msgstr ""
@ -1278,7 +1334,7 @@ msgstr ""
msgid "Customize quick filters"
msgstr ""
#: frontend/src/pages/Dashboard.vue:270
#: crm/api/dashboard.py:599
msgid "Daily performance of leads, deals, and wins"
msgstr ""
@ -1295,8 +1351,7 @@ msgid "Data Fields"
msgstr ""
#. Label of the date (Date) field in DocType 'CRM Holiday'
#: crm/fcrm/doctype/crm_holiday/crm_holiday.json
#: frontend/src/pages/Dashboard.vue:272
#: crm/api/dashboard.py:601 crm/fcrm/doctype/crm_holiday/crm_holiday.json
msgid "Date"
msgstr ""
@ -1327,8 +1382,7 @@ msgid "Deal Statuses"
msgstr ""
#. Label of the deal_value (Currency) field in DocType 'CRM Deal'
#: crm/fcrm/doctype/crm_deal/crm_deal.json frontend/src/pages/Dashboard.vue:352
#: frontend/src/pages/Dashboard.vue:392
#: crm/fcrm/doctype/crm_deal/crm_deal.json
msgid "Deal Value"
msgstr ""
@ -1336,6 +1390,10 @@ msgstr ""
msgid "Deal Value is required."
msgstr ""
#: crm/api/dashboard.py:977
msgid "Deal generation channel analysis"
msgstr ""
#: frontend/src/pages/Contact.vue:533 frontend/src/pages/MobileContact.vue:531
#: frontend/src/pages/MobileOrganization.vue:475
#: frontend/src/pages/Organization.vue:484
@ -1346,6 +1404,10 @@ msgstr ""
msgid "Deal updated"
msgstr ""
#: crm/api/dashboard.py:1030 crm/api/dashboard.py:1087
msgid "Deal value"
msgstr ""
#. Label of a shortcut in the Frappe CRM Workspace
#: crm/fcrm/workspace/frappe_crm/frappe_crm.json
#: frontend/src/pages/Deal.vue:532 frontend/src/pages/MobileContact.vue:291
@ -1354,16 +1416,29 @@ msgstr ""
msgid "Deals"
msgstr ""
#: frontend/src/pages/Dashboard.vue:341
msgid "Deals by Salesperson"
#: crm/api/dashboard.py:788
#: frontend/src/components/Dashboard/AddChartModal.vue:97
msgid "Deals by ongoing & won stage"
msgstr ""
#: frontend/src/pages/Dashboard.vue:480
msgid "Deals by Stage"
#: crm/api/dashboard.py:1076
#: frontend/src/components/Dashboard/AddChartModal.vue:100
msgid "Deals by salesperson"
msgstr ""
#: frontend/src/pages/Dashboard.vue:381
msgid "Deals by Territory"
#: crm/api/dashboard.py:976
#: frontend/src/components/Dashboard/AddChartModal.vue:107
msgid "Deals by source"
msgstr ""
#: crm/api/dashboard.py:838
#: frontend/src/components/Dashboard/AddChartModal.vue:105
msgid "Deals by stage"
msgstr ""
#: crm/api/dashboard.py:1019
#: frontend/src/components/Dashboard/AddChartModal.vue:99
msgid "Deals by territory"
msgstr ""
#: frontend/src/components/Settings/EmailTemplate/EditEmailTemplate.vue:115
@ -1598,6 +1673,11 @@ msgstr ""
msgid "Done"
msgstr ""
#: frontend/src/components/Dashboard/AddChartModal.vue:33
#: frontend/src/components/Dashboard/AddChartModal.vue:71
msgid "Donut chart"
msgstr ""
#: frontend/src/components/Activities/AudioPlayer.vue:166
#: frontend/src/components/ViewControls.vue:254
msgid "Download"
@ -1687,6 +1767,7 @@ msgstr ""
#: frontend/src/components/FieldLayoutEditor.vue:345
#: frontend/src/components/ListBulkActions.vue:170
#: frontend/src/components/ViewControls.vue:1131
#: frontend/src/pages/Dashboard.vue:19
msgid "Edit"
msgstr ""
@ -1920,7 +2001,9 @@ msgid "Excel"
msgstr ""
#. Label of the exchange_rate (Float) field in DocType 'CRM Deal'
#. Label of the exchange_rate (Float) field in DocType 'CRM Organization'
#: crm/fcrm/doctype/crm_deal/crm_deal.json
#: crm/fcrm/doctype/crm_organization/crm_organization.json
msgid "Exchange Rate"
msgstr ""
@ -1965,6 +2048,16 @@ msgstr ""
msgid "Expand"
msgstr ""
#. Label of the expected_closure_date (Date) field in DocType 'CRM Deal'
#: crm/fcrm/doctype/crm_deal/crm_deal.json
msgid "Expected Closure Date"
msgstr ""
#. Label of the expected_deal_value (Currency) field in DocType 'CRM Deal'
#: crm/fcrm/doctype/crm_deal/crm_deal.json
msgid "Expected Deal Value"
msgstr ""
#. Option for the 'Status' (Select) field in DocType 'CRM Invitation'
#: crm/fcrm/doctype/crm_invitation/crm_invitation.json
msgid "Expired"
@ -2145,6 +2238,11 @@ msgstr ""
msgid "For"
msgstr ""
#: crm/api/dashboard.py:666
#: frontend/src/components/Dashboard/AddChartModal.vue:95
msgid "Forecasted revenue"
msgstr ""
#: frontend/src/components/Settings/General/GeneralSettings.vue:128
msgid "Forecasting disabled successfully"
msgstr ""
@ -2192,6 +2290,11 @@ msgstr ""
msgid "From Date"
msgstr ""
#. Label of the from_type (Data) field in DocType 'CRM Status Change Log'
#: crm/fcrm/doctype/crm_status_change_log/crm_status_change_log.json
msgid "From Type"
msgstr ""
#. Label of the from_user (Link) field in DocType 'CRM Notification'
#: crm/fcrm/doctype/crm_notification/crm_notification.json
msgid "From User"
@ -2211,8 +2314,9 @@ msgstr ""
msgid "Full Name"
msgstr ""
#: frontend/src/pages/Dashboard.vue:303
msgid "Funnel Conversion"
#: crm/api/dashboard.py:728
#: frontend/src/components/Dashboard/AddChartModal.vue:96
msgid "Funnel conversion"
msgstr ""
#. Label of the gender (Link) field in DocType 'CRM Contacts'
@ -2229,7 +2333,7 @@ msgstr ""
msgid "General"
msgstr ""
#: frontend/src/pages/Dashboard.vue:382
#: crm/api/dashboard.py:1020
msgid "Geographic distribution of deals and revenue"
msgstr ""
@ -2457,6 +2561,10 @@ msgstr ""
msgid "Invalid Exotel Number"
msgstr ""
#: crm/api/dashboard.py:73
msgid "Invalid chart name"
msgstr ""
#: crm/fcrm/doctype/crm_exotel_settings/crm_exotel_settings.py:25
msgid "Invalid credentials"
msgstr ""
@ -2543,7 +2651,7 @@ msgstr ""
#. Description of the 'Enable Forecasting' (Check) field in DocType 'FCRM
#. Settings'
#: crm/fcrm/doctype/fcrm_settings/fcrm_settings.json
msgid "It will make deal's \"Close Date\" & \"Deal Value\" mandatory to get accurate forecasting insights"
msgid "It will make deal's \"Expected Closure Date\" & \"Expected Deal Value\" mandatory to get accurate forecasting insights"
msgstr ""
#. Label of the json (JSON) field in DocType 'CRM Global Settings'
@ -2645,7 +2753,9 @@ msgstr ""
msgid "Last name"
msgstr ""
#. Label of the layout (Code) field in DocType 'CRM Dashboard'
#. Label of the layout (Code) field in DocType 'CRM Fields Layout'
#: crm/fcrm/doctype/crm_dashboard/crm_dashboard.json
#: crm/fcrm/doctype/crm_fields_layout/crm_fields_layout.json
msgid "Layout"
msgstr ""
@ -2690,11 +2800,11 @@ msgstr ""
msgid "Lead Statuses"
msgstr ""
#: frontend/src/pages/Dashboard.vue:503
#: crm/api/dashboard.py:935
msgid "Lead generation channel analysis"
msgstr ""
#: frontend/src/pages/Dashboard.vue:304
#: crm/api/dashboard.py:729
msgid "Lead to deal conversion pipeline"
msgstr ""
@ -2708,8 +2818,9 @@ msgstr ""
msgid "Leads"
msgstr ""
#: frontend/src/pages/Dashboard.vue:502
msgid "Leads by Source"
#: crm/api/dashboard.py:934
#: frontend/src/components/Dashboard/AddChartModal.vue:106
msgid "Leads by source"
msgstr ""
#. Label of the lft (Int) field in DocType 'CRM Territory'
@ -2786,8 +2897,9 @@ msgstr ""
msgid "Logo"
msgstr ""
#: frontend/src/pages/Dashboard.vue:421
msgid "Lost Deal Reasons"
#. Option for the 'Type' (Select) field in DocType 'CRM Deal Status'
#: crm/fcrm/doctype/crm_deal_status/crm_deal_status.json
msgid "Lost"
msgstr ""
#. Label of the lost_notes (Text) field in DocType 'CRM Deal'
@ -2802,6 +2914,11 @@ msgstr ""
msgid "Lost Reason"
msgstr ""
#: crm/api/dashboard.py:883
#: frontend/src/components/Dashboard/AddChartModal.vue:98
msgid "Lost deal reasons"
msgstr ""
#: frontend/src/components/Modals/LostReasonModal.vue:27
msgid "Lost notes"
msgstr ""
@ -2976,7 +3093,7 @@ msgstr ""
msgid "Monday"
msgstr ""
#: frontend/src/pages/Dashboard.vue:450
#: crm/api/dashboard.py:669
msgid "Month"
msgstr ""
@ -3000,8 +3117,10 @@ msgstr ""
msgid "My Open Deals"
msgstr ""
#. Label of the title (Data) field in DocType 'CRM Dashboard'
#. Label of the name1 (Data) field in DocType 'CRM Dropdown Item'
#. Label of the brand_name (Data) field in DocType 'FCRM Settings'
#: crm/fcrm/doctype/crm_dashboard/crm_dashboard.json
#: crm/fcrm/doctype/crm_dropdown_item/crm_dropdown_item.json
#: crm/fcrm/doctype/fcrm_settings/fcrm_settings.json
#: frontend/src/components/Settings/EmailTemplate/EditEmailTemplate.vue:42
@ -3361,8 +3480,17 @@ msgstr ""
msgid "Number"
msgstr ""
#: frontend/src/pages/Dashboard.vue:349 frontend/src/pages/Dashboard.vue:389
msgid "Number of Deals"
#: frontend/src/components/Dashboard/AddChartModal.vue:19
#: frontend/src/components/Dashboard/AddChartModal.vue:69
msgid "Number chart"
msgstr ""
#: crm/api/dashboard.py:1027 crm/api/dashboard.py:1084
msgid "Number of deals"
msgstr ""
#: crm/api/dashboard.py:1077
msgid "Number of deals and total value per salesperson"
msgstr ""
#. Label of the old_parent (Link) field in DocType 'CRM Territory'
@ -3370,6 +3498,21 @@ msgstr ""
msgid "Old Parent"
msgstr ""
#. Option for the 'Type' (Select) field in DocType 'CRM Deal Status'
#: crm/fcrm/doctype/crm_deal_status/crm_deal_status.json
msgid "On Hold"
msgstr ""
#. Option for the 'Type' (Select) field in DocType 'CRM Deal Status'
#: crm/fcrm/doctype/crm_deal_status/crm_deal_status.json
msgid "Ongoing"
msgstr ""
#: crm/api/dashboard.py:181
#: frontend/src/components/Dashboard/AddChartModal.vue:77
msgid "Ongoing deals"
msgstr ""
#: frontend/src/utils/index.js:451
msgid "Only image files are allowed"
msgstr ""
@ -3379,6 +3522,11 @@ msgstr ""
msgid "Only one {0} can be set as primary."
msgstr ""
#. Option for the 'Type' (Select) field in DocType 'CRM Deal Status'
#: crm/fcrm/doctype/crm_deal_status/crm_deal_status.json
msgid "Open"
msgstr ""
#: frontend/src/components/Modals/NoteModal.vue:18
#: frontend/src/components/Modals/TaskModal.vue:25
msgid "Open Deal"
@ -3529,7 +3677,7 @@ msgstr ""
msgid "Pending Invites"
msgstr ""
#: frontend/src/pages/Dashboard.vue:35
#: frontend/src/pages/Dashboard.vue:79
msgid "Period"
msgstr ""
@ -3658,6 +3806,8 @@ msgstr ""
msgid "Priority"
msgstr ""
#. Label of the private (Check) field in DocType 'CRM Dashboard'
#: crm/fcrm/doctype/crm_dashboard/crm_dashboard.json
#: frontend/src/components/FilesUploader/FilesUploaderArea.vue:89
msgid "Private"
msgstr ""
@ -3704,7 +3854,7 @@ msgstr ""
msgid "Profile updated successfully"
msgstr ""
#: frontend/src/pages/Dashboard.vue:448
#: crm/api/dashboard.py:667
msgid "Projected vs actual revenue based on deal probability"
msgstr ""
@ -3759,7 +3909,7 @@ msgstr ""
msgid "Read"
msgstr ""
#: frontend/src/pages/Dashboard.vue:424
#: crm/api/dashboard.py:886
msgid "Reason"
msgstr ""
@ -3810,6 +3960,7 @@ msgstr ""
#: frontend/src/components/ViewControls.vue:25
#: frontend/src/components/ViewControls.vue:160
#: frontend/src/pages/Dashboard.vue:10
msgid "Refresh"
msgstr ""
@ -3889,6 +4040,10 @@ msgstr ""
msgid "Reset to Default"
msgstr ""
#: frontend/src/pages/Dashboard.vue:34
msgid "Reset to default"
msgstr ""
#. Label of the response_by (Datetime) field in DocType 'CRM Deal'
#. Label of the response_by (Datetime) field in DocType 'CRM Lead'
#: crm/fcrm/doctype/crm_deal/crm_deal.json
@ -3925,14 +4080,10 @@ msgstr ""
msgid "Retake"
msgstr ""
#: frontend/src/pages/Dashboard.vue:456
#: crm/api/dashboard.py:675
msgid "Revenue"
msgstr ""
#: frontend/src/pages/Dashboard.vue:447
msgid "Revenue Forecast"
msgstr ""
#: frontend/src/components/Settings/EmailTemplate/EditEmailTemplate.vue:84
#: frontend/src/components/Settings/EmailTemplate/NewEmailTemplate.vue:84
msgid "Rich Text"
@ -4013,6 +4164,7 @@ msgstr ""
#. Option for the 'Role' (Select) field in DocType 'CRM Invitation'
#: crm/fcrm/doctype/crm_call_log/crm_call_log.json
#: crm/fcrm/doctype/crm_communication_status/crm_communication_status.json
#: crm/fcrm/doctype/crm_dashboard/crm_dashboard.json
#: crm/fcrm/doctype/crm_deal/crm_deal.json
#: crm/fcrm/doctype/crm_deal_status/crm_deal_status.json
#: crm/fcrm/doctype/crm_exotel_settings/crm_exotel_settings.json
@ -4038,14 +4190,11 @@ msgstr ""
msgid "Sales Manager"
msgstr ""
#: frontend/src/pages/Dashboard.vue:269
msgid "Sales Trend"
msgstr ""
#. Name of a role
#. Option for the 'Role' (Select) field in DocType 'CRM Invitation'
#: crm/fcrm/doctype/crm_call_log/crm_call_log.json
#: crm/fcrm/doctype/crm_communication_status/crm_communication_status.json
#: crm/fcrm/doctype/crm_dashboard/crm_dashboard.json
#: crm/fcrm/doctype/crm_deal/crm_deal.json
#: crm/fcrm/doctype/crm_deal_status/crm_deal_status.json
#: crm/fcrm/doctype/crm_global_settings/crm_global_settings.json
@ -4069,11 +4218,19 @@ msgstr ""
#: frontend/src/components/Settings/Users.vue:186
#: frontend/src/components/Settings/Users.vue:268
#: frontend/src/components/Settings/Users.vue:271
#: frontend/src/pages/Dashboard.vue:62
msgid "Sales User"
msgstr ""
#: frontend/src/pages/Dashboard.vue:344
#: crm/api/dashboard.py:598
#: frontend/src/components/Dashboard/AddChartModal.vue:94
msgid "Sales trend"
msgstr ""
#: frontend/src/pages/Dashboard.vue:106
msgid "Sales user"
msgstr ""
#: crm/api/dashboard.py:1079
msgid "Salesperson"
msgstr ""
@ -4103,6 +4260,7 @@ msgstr ""
#: frontend/src/components/Settings/General/GeneralSettings.vue:145
#: frontend/src/components/Telephony/ExotelCallUI.vue:231
#: frontend/src/components/ViewControls.vue:123
#: frontend/src/pages/Dashboard.vue:45
msgid "Save"
msgstr ""
@ -4141,7 +4299,7 @@ msgstr ""
msgid "Section"
msgstr ""
#: frontend/src/pages/Dashboard.vue:15
#: frontend/src/pages/Dashboard.vue:59
msgid "Select Range"
msgstr ""
@ -4336,7 +4494,12 @@ msgstr ""
msgid "Source Name"
msgstr ""
#: frontend/src/pages/Dashboard.vue:306
#: frontend/src/components/Dashboard/AddChartModal.vue:68
#: frontend/src/components/Dashboard/DashboardItem.vue:16
msgid "Spacer"
msgstr ""
#: crm/api/dashboard.py:731 crm/api/dashboard.py:790
msgid "Stage"
msgstr ""
@ -4446,6 +4609,7 @@ msgstr ""
#. Name of a role
#. Option for the 'Role' (Select) field in DocType 'CRM Invitation'
#: crm/fcrm/doctype/crm_dashboard/crm_dashboard.json
#: crm/fcrm/doctype/crm_exotel_settings/crm_exotel_settings.json
#: crm/fcrm/doctype/crm_fields_layout/crm_fields_layout.json
#: crm/fcrm/doctype/crm_global_settings/crm_global_settings.json
@ -4533,10 +4697,9 @@ msgstr ""
#. Label of the territory (Link) field in DocType 'CRM Deal'
#. Label of the territory (Link) field in DocType 'CRM Lead'
#. Label of the territory (Link) field in DocType 'CRM Organization'
#: crm/fcrm/doctype/crm_deal/crm_deal.json
#: crm/api/dashboard.py:1022 crm/fcrm/doctype/crm_deal/crm_deal.json
#: crm/fcrm/doctype/crm_lead/crm_lead.json
#: crm/fcrm/doctype/crm_organization/crm_organization.json
#: frontend/src/pages/Dashboard.vue:384
msgid "Territory"
msgstr ""
@ -4559,6 +4722,12 @@ msgstr ""
msgid "The rate used to convert the deals currency to your crm's base currency (set in CRM Settings). It is set once when the currency is first added and doesn't change automatically."
msgstr ""
#. Description of the 'Exchange Rate' (Float) field in DocType 'CRM
#. Organization'
#: crm/fcrm/doctype/crm_organization/crm_organization.json
msgid "The rate used to convert the organizations currency to your crm's base currency (set in CRM Settings). It is set once when the currency is first added and doesn't change automatically."
msgstr ""
#: crm/fcrm/doctype/crm_service_level_agreement/crm_service_level_agreement.js:14
msgid "There can only be one default priority in Priorities table"
msgstr ""
@ -4641,6 +4810,11 @@ msgstr ""
msgid "To Date"
msgstr ""
#. Label of the to_type (Data) field in DocType 'CRM Status Change Log'
#: crm/fcrm/doctype/crm_status_change_log/crm_status_change_log.json
msgid "To Type"
msgstr ""
#. Label of the to_user (Link) field in DocType 'CRM Notification'
#: crm/fcrm/doctype/crm_notification/crm_notification.json
msgid "To User"
@ -4679,19 +4853,11 @@ msgstr ""
msgid "Total"
msgstr ""
#: crm/api/dashboard.py:144
msgid "Total Deals"
msgstr ""
#. Label of the total_holidays (Int) field in DocType 'CRM Holiday List'
#: crm/fcrm/doctype/crm_holiday_list/crm_holiday_list.json
msgid "Total Holidays"
msgstr ""
#: crm/api/dashboard.py:86
msgid "Total Leads"
msgstr ""
#. Description of the 'Net Total' (Currency) field in DocType 'CRM Deal'
#. Description of the 'Net Total' (Currency) field in DocType 'CRM Lead'
#: crm/fcrm/doctype/crm_deal/crm_deal.json
@ -4699,16 +4865,21 @@ msgstr ""
msgid "Total after discount"
msgstr ""
#: crm/api/dashboard.py:149
msgid "Total number of deals"
#: crm/api/dashboard.py:123
#: frontend/src/components/Dashboard/AddChartModal.vue:76
msgid "Total leads"
msgstr ""
#: crm/api/dashboard.py:91
#: crm/api/dashboard.py:124
msgid "Total number of leads"
msgstr ""
#: crm/api/dashboard.py:207
msgid "Total number of won deals"
#: crm/api/dashboard.py:182
msgid "Total number of non won/lost deals"
msgstr ""
#: crm/api/dashboard.py:297
msgid "Total number of won deals based on its closure date"
msgstr ""
#. Option for the 'Weekly Off' (Select) field in DocType 'CRM Holiday List'
@ -4754,12 +4925,14 @@ msgid "Twilio settings updated successfully"
msgstr ""
#. Label of the type (Select) field in DocType 'CRM Call Log'
#. Label of the type (Select) field in DocType 'CRM Deal Status'
#. Label of the type (Select) field in DocType 'CRM Dropdown Item'
#. Label of the type (Select) field in DocType 'CRM Fields Layout'
#. Label of the type (Select) field in DocType 'CRM Global Settings'
#. Label of the type (Select) field in DocType 'CRM Notification'
#. Label of the type (Select) field in DocType 'CRM View Settings'
#: crm/fcrm/doctype/crm_call_log/crm_call_log.json
#: crm/fcrm/doctype/crm_deal_status/crm_deal_status.json
#: crm/fcrm/doctype/crm_dropdown_item/crm_dropdown_item.json
#: crm/fcrm/doctype/crm_fields_layout/crm_fields_layout.json
#: crm/fcrm/doctype/crm_global_settings/crm_global_settings.json
@ -4885,8 +5058,10 @@ msgstr ""
msgid "Upload image"
msgstr ""
#. Label of the user (Link) field in DocType 'CRM Dashboard'
#. Label of the user (Link) field in DocType 'CRM Telephony Agent'
#. Label of the user (Link) field in DocType 'CRM View Settings'
#: crm/fcrm/doctype/crm_dashboard/crm_dashboard.json
#: crm/fcrm/doctype/crm_telephony_agent/crm_telephony_agent.json
#: crm/fcrm/doctype/crm_view_settings/crm_view_settings.json
msgid "User"
@ -4996,8 +5171,14 @@ msgstr ""
msgid "Width can be in number, pixel or rem (eg. 3, 30px, 10rem)"
msgstr ""
#: crm/api/dashboard.py:202
msgid "Won Deals"
#. Option for the 'Type' (Select) field in DocType 'CRM Deal Status'
#: crm/fcrm/doctype/crm_deal_status/crm_deal_status.json
msgid "Won"
msgstr ""
#: crm/api/dashboard.py:296
#: frontend/src/components/Dashboard/AddChartModal.vue:79
msgid "Won deals"
msgstr ""
#. Label of the workday (Select) field in DocType 'CRM Service Day'

5586
crm/locale/nl.po Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

5586
crm/locale/pt_BR.po Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

5586
crm/locale/sr.po Normal file

File diff suppressed because it is too large Load Diff

5586
crm/locale/sr_CS.po Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

5586
crm/locale/vi.po Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -275,12 +275,16 @@ def get_exchange_rate(from_currency, to_currency, date=None):
url = f"https://api.frankfurter.app/{date}?from={from_currency}&to={to_currency}"
response = requests.get(url)
for _i in range(3):
response = requests.get(url)
if response.status_code == 200:
data = response.json()
rate = data["rates"].get(to_currency)
if rate:
return rate
if response.status_code == 200:
data = response.json()
rate = data["rates"].get(to_currency)
return rate
else:
frappe.throw(_("Failed to fetch historical exchange rate from external API. Please try again later."))
return None
frappe.log_error(
f"Failed to fetch exchange rate from {from_currency} to {to_currency} on {date}",
title="Exchange Rate Fetch Error",
)
return 1.0 # Default exchange rate if API call fails or no rate found

View File

@ -1,3 +1,8 @@
files:
- source: /crm/locale/main.pot
translation: /crm/locale/%two_letters_code%.po
pull_request_title: "chore: sync translations from crowdin"
pull_request_labels:
- translation
commit_message: "chore: %language% translations"
append_commit_message: false

View File

@ -5,6 +5,7 @@ import { reactive } from 'vue'
const documentsCache = {}
const controllersCache = {}
const assigneesCache = {}
export function useDocument(doctype, docname) {
const { setupScript } = getScript(doctype)
@ -46,16 +47,20 @@ export function useDocument(doctype, docname) {
}
}
const assignees = createResource({
url: 'crm.api.doc.get_assigned_users',
cache: `assignees:${doctype}:${docname}`,
auto: docname ? true : false,
params: {
doctype: doctype,
name: docname,
},
transform: (data) => parseAssignees(data),
})
assigneesCache[doctype] = assigneesCache[doctype] || {}
if (!assigneesCache[doctype][docname || '']) {
assigneesCache[doctype][docname || ''] = createResource({
url: 'crm.api.doc.get_assigned_users',
cache: `assignees:${doctype}:${docname}`,
auto: docname ? true : false,
params: {
doctype: doctype,
name: docname,
},
transform: (data) => parseAssignees(data),
})
}
async function setupFormScript() {
if (
@ -224,7 +229,7 @@ export function useDocument(doctype, docname) {
return {
document: documentsCache[doctype][docname || ''],
assignees,
assignees: assigneesCache[doctype][docname || ''],
getControllers,
triggerOnLoad,
triggerOnBeforeCreate,