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:
Ankush Menat 2023-03-02 11:59:18 +05:30 committed by GitHub
parent 6a89cb98ce
commit 330ae419be
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 57 additions and 5 deletions

View File

@ -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)

View File

@ -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)