fix!: Parse float as per number format in quality inspection (#34259)
fix: Parse float as per number format in quality inspection
diff --git a/erpnext/stock/doctype/quality_inspection/quality_inspection.py b/erpnext/stock/doctype/quality_inspection/quality_inspection.py
index 2a9f091..9673c81 100644
--- a/erpnext/stock/doctype/quality_inspection/quality_inspection.py
+++ b/erpnext/stock/doctype/quality_inspection/quality_inspection.py
@@ -6,7 +6,7 @@
from frappe import _
from frappe.model.document import Document
from frappe.model.mapper import get_mapped_doc
-from frappe.utils import cint, cstr, flt
+from frappe.utils import cint, cstr, flt, get_number_format_info
from erpnext.stock.doctype.quality_inspection_template.quality_inspection_template import (
get_template_details,
@@ -156,7 +156,9 @@
for i in range(1, 11):
reading_value = reading.get("reading_" + str(i))
if reading_value is not None and reading_value.strip():
- result = flt(reading.get("min_value")) <= flt(reading_value) <= flt(reading.get("max_value"))
+ result = (
+ flt(reading.get("min_value")) <= parse_float(reading_value) <= flt(reading.get("max_value"))
+ )
if not result:
return False
return True
@@ -196,7 +198,7 @@
# numeric readings
for i in range(1, 11):
field = "reading_" + str(i)
- data[field] = flt(reading.get(field))
+ data[field] = parse_float(reading.get(field))
data["mean"] = self.calculate_mean(reading)
return data
@@ -210,7 +212,7 @@
for i in range(1, 11):
reading_value = reading.get("reading_" + str(i))
if reading_value is not None and reading_value.strip():
- readings_list.append(flt(reading_value))
+ readings_list.append(parse_float(reading_value))
actual_mean = mean(readings_list) if readings_list else 0
return actual_mean
@@ -324,3 +326,19 @@
)
return doc
+
+
+def parse_float(num: str) -> float:
+ """Since reading_# fields are `Data` field they might contain number which
+ is representation in user's prefered number format instead of machine
+ readable format. This function converts them to machine readable format."""
+
+ number_format = frappe.db.get_default("number_format") or "#,###.##"
+ decimal_str, comma_str, _number_format_precision = get_number_format_info(number_format)
+
+ if decimal_str == "," and comma_str == ".":
+ num = num.replace(",", "#$")
+ num = num.replace(".", ",")
+ num = num.replace("#$", ".")
+
+ return flt(num)
diff --git a/erpnext/stock/doctype/quality_inspection/test_quality_inspection.py b/erpnext/stock/doctype/quality_inspection/test_quality_inspection.py
index 4f19643..9d2e139 100644
--- a/erpnext/stock/doctype/quality_inspection/test_quality_inspection.py
+++ b/erpnext/stock/doctype/quality_inspection/test_quality_inspection.py
@@ -2,7 +2,7 @@
# See license.txt
import frappe
-from frappe.tests.utils import FrappeTestCase
+from frappe.tests.utils import FrappeTestCase, change_settings
from frappe.utils import nowdate
from erpnext.controllers.stock_controller import (
@@ -216,6 +216,40 @@
qa.save()
self.assertEqual(qa.status, "Accepted")
+ @change_settings("System Settings", {"number_format": "#.###,##"})
+ def test_diff_number_format(self):
+ self.assertEqual(frappe.db.get_default("number_format"), "#.###,##") # sanity check
+
+ # Test QI based on acceptance values (Non formula)
+ dn = create_delivery_note(item_code="_Test Item with QA", do_not_submit=True)
+ readings = [
+ {
+ "specification": "Iron Content", # numeric reading
+ "min_value": 60,
+ "max_value": 100,
+ "reading_1": "70,000",
+ },
+ {
+ "specification": "Iron Content", # numeric reading
+ "min_value": 60,
+ "max_value": 100,
+ "reading_1": "1.100,00",
+ },
+ ]
+
+ qa = create_quality_inspection(
+ reference_type="Delivery Note", reference_name=dn.name, readings=readings, do_not_save=True
+ )
+
+ qa.save()
+
+ # status must be auto set as per formula
+ self.assertEqual(qa.readings[0].status, "Accepted")
+ self.assertEqual(qa.readings[1].status, "Rejected")
+
+ qa.delete()
+ dn.delete()
+
def create_quality_inspection(**args):
args = frappe._dict(args)