KFSH/asset_lite/supplier_score_criteria_override.py
2025-12-11 13:37:26 +05:30

33 lines
1.2 KiB
Python

import re
import frappe
from frappe import _
from frappe.model.document import Document
from erpnext.buying.doctype.supplier_scorecard_criteria.supplier_scorecard_criteria import SupplierScorecardCriteria
class CustomSupplierScorecardCriteria(SupplierScorecardCriteria):
def validate_formula(self):
# Evaluate the formula with 0's to ensure it is valid
test_formula = self.formula.replace("\r", "").replace("\n", "")
# Find and replace all placeholders with 0
regex = r"\{(.*?)\}"
mylist = re.finditer(regex, test_formula, re.MULTILINE | re.DOTALL)
for match in mylist:
test_formula = test_formula.replace("{" + match.group(1) + "}", "0")
try:
# Use safe_eval with a custom safe division function
frappe.safe_eval(
test_formula,
None,
{
"max": max,
"min": min,
"safe_div": lambda x, y: x / y if y != 0 else 0, # Safe division logic
},
)
except Exception as e:
# Throw an error if formula evaluation fails
frappe.throw(_("Error evaluating the criteria formula: {0}").format(str(e)))