Merge pull request #1061 from frappe/mergify/bp/main-hotfix/pr-1059

fixes (backport #1059)
This commit is contained in:
Shariq Ansari 2025-07-23 13:38:02 +05:30 committed by GitHub
commit b8dde8c41c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 37 additions and 28 deletions

View File

@ -139,12 +139,12 @@ class CRMDeal(Document):
if sla: if sla:
sla.apply(self) 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: if self.status == "Won" and not self.closed_date:
self.close_date = frappe.utils.nowdate() self.closed_date = frappe.utils.nowdate()
def update_default_probability(self): 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 self.probability = frappe.db.get_value("CRM Deal Status", self.status, "probability") or 0
def validate_forcasting_fields(self): def validate_forcasting_fields(self):
self.update_close_date() self.update_closed_date()
self.update_default_probability() self.update_default_probability()
if frappe.db.get_single_value("FCRM Settings", "enable_forecasting"): if frappe.db.get_single_value("FCRM Settings", "enable_forecasting"):
if not self.deal_value or self.deal_value == 0: if not self.expected_deal_value or self.expected_deal_value == 0:
frappe.throw(_("Deal Value is required."), frappe.MandatoryError) frappe.throw(_("Expected Deal Value is required."), frappe.MandatoryError)
if not self.close_date: if not self.expected_closure_date:
frappe.throw(_("Close Date is required."), frappe.MandatoryError) frappe.throw(_("Expected Closure Date is required."), frappe.MandatoryError)
def validate_lost_reason(self): def validate_lost_reason(self):
""" """

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}" 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: frappe.log_error(
data = response.json() f"Failed to fetch exchange rate from {from_currency} to {to_currency} on {date}",
rate = data["rates"].get(to_currency) title="Exchange Rate Fetch Error",
return rate )
else: return 1.0 # Default exchange rate if API call fails or no rate found
frappe.throw(_("Failed to fetch historical exchange rate from external API. Please try again later."))
return None

View File

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