fix!: Parse float as per number format in quality inspection (#34259)
fix: Parse float as per number format in quality inspection
This commit is contained in:
parent
6a89cb98ce
commit
330ae419be
@ -6,7 +6,7 @@ import frappe
|
||||
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 @@ class QualityInspection(Document):
|
||||
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 @@ class QualityInspection(Document):
|
||||
# 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 @@ class QualityInspection(Document):
|
||||
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 @@ def make_quality_inspection(source_name, target_doc=None):
|
||||
)
|
||||
|
||||
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)
|
||||
|
@ -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 @@ class TestQualityInspection(FrappeTestCase):
|
||||
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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user