chore: UX improvement
- Removed 'single reading' checkbox, unnecessary
- Removed 'Mean' field and added computed mean to formula data
- Changed 'Value Based' to 'Non-Numeric'
- Re-arranged fields
diff --git a/erpnext/stock/doctype/item_quality_inspection_parameter/item_quality_inspection_parameter.json b/erpnext/stock/doctype/item_quality_inspection_parameter/item_quality_inspection_parameter.json
index f450128..9b980a1 100644
--- a/erpnext/stock/doctype/item_quality_inspection_parameter/item_quality_inspection_parameter.json
+++ b/erpnext/stock/doctype/item_quality_inspection_parameter/item_quality_inspection_parameter.json
@@ -8,14 +8,12 @@
"field_order": [
"specification",
"value",
- "value_based",
- "single_reading",
+ "non_numeric",
"column_break_3",
- "formula_based_criteria",
- "acceptance_formula",
"min_value",
"max_value",
- "mean_value"
+ "formula_based_criteria",
+ "acceptance_formula"
],
"fields": [
{
@@ -27,10 +25,10 @@
"oldfieldtype": "Data",
"print_width": "200px",
"reqd": 1,
- "width": "200px"
+ "width": "100px"
},
{
- "depends_on": "eval:(!doc.formula_based_criteria && doc.value_based)",
+ "depends_on": "eval:(!doc.formula_based_criteria && doc.non_numeric)",
"fieldname": "value",
"fieldtype": "Data",
"in_list_view": 1,
@@ -44,10 +42,9 @@
},
{
"depends_on": "formula_based_criteria",
- "description": "Simple Python formula applied on Reading fields.<br> Numeric eg.: <b>reading_1 > 0.2 and reading_1 < 0.5</b><br>\nValue based eg.: <b>reading_value in (\"A\", \"B\", \"C)</b>",
+ "description": "Simple Python formula applied on Reading fields.<br> Numeric eg. 1: <b>reading_1 > 0.2 and reading_1 < 0.5</b><br>\nNumeric eg. 2: <b>mean > 3.5</b> (mean of populated fields)<br>\nValue based eg.: <b>reading_value in (\"A\", \"B\", \"C)</b>",
"fieldname": "acceptance_formula",
"fieldtype": "Code",
- "in_list_view": 1,
"label": "Acceptance Criteria Formula"
},
{
@@ -57,42 +54,32 @@
"label": "Formula Based Criteria"
},
{
- "default": "0",
- "depends_on": "eval:!doc.value_based",
- "fieldname": "single_reading",
- "fieldtype": "Check",
- "label": "Single Reading"
- },
- {
- "depends_on": "eval:(!doc.formula_based_criteria && !doc.single_reading && !doc.value_based)",
- "fieldname": "mean_value",
- "fieldtype": "Float",
- "label": "Mean Value"
- },
- {
- "depends_on": "eval:(!doc.formula_based_criteria && !doc.value_based)",
+ "depends_on": "eval:(!doc.formula_based_criteria && !doc.non_numeric)",
"fieldname": "min_value",
"fieldtype": "Float",
+ "in_list_view": 1,
"label": "Minimum Value"
},
{
- "depends_on": "eval:(!doc.formula_based_criteria && !doc.value_based)",
+ "depends_on": "eval:(!doc.formula_based_criteria && !doc.non_numeric)",
"fieldname": "max_value",
"fieldtype": "Float",
+ "in_list_view": 1,
"label": "Maximum Value"
},
{
"default": "0",
- "description": "Non-numeric Inspection.",
- "fieldname": "value_based",
+ "fieldname": "non_numeric",
"fieldtype": "Check",
- "label": "Value Based"
+ "in_list_view": 1,
+ "label": "Non-Numeric",
+ "width": "80px"
}
],
"idx": 1,
"istable": 1,
"links": [],
- "modified": "2020-12-18 21:03:29.828723",
+ "modified": "2020-12-21 11:37:55.387677",
"modified_by": "Administrator",
"module": "Stock",
"name": "Item Quality Inspection Parameter",
diff --git a/erpnext/stock/doctype/quality_inspection/quality_inspection.py b/erpnext/stock/doctype/quality_inspection/quality_inspection.py
index a7a023b..f582658 100644
--- a/erpnext/stock/doctype/quality_inspection/quality_inspection.py
+++ b/erpnext/stock/doctype/quality_inspection/quality_inspection.py
@@ -79,46 +79,27 @@
if reading.formula_based_criteria:
self.set_status_based_on_acceptance_formula(reading)
else:
+ # if not formula based check acceptance values set
self.set_status_based_on_acceptance_values(reading)
def set_status_based_on_acceptance_values(self, reading):
- if cint(reading.value_based):
+ if cint(reading.non_numeric):
result = reading.get("reading_value") == reading.get("value")
else:
# numeric readings
- if cint(reading.single_reading):
- reading_1 = flt(reading.get("reading_1"))
- result = flt(reading.get("min_value")) <= reading_1 <= flt(reading.get("max_value"))
- else:
- result = self.min_max_criteria_passed(reading) and self.mean_criteria_passed(reading)
+ result = self.min_max_criteria_passed(reading)
reading.status = "Accepted" if result else "Rejected"
def min_max_criteria_passed(self, reading):
"""Determine whether all readings fall in the acceptable range."""
for i in range(1, 11):
- reading_field = reading.get("reading_" + str(i))
- if reading_field is not None:
- result = flt(reading.get("min_value")) <= flt(reading_field) <= flt(reading.get("max_value"))
+ 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"))
if not result: return False
return True
- def mean_criteria_passed(self, reading):
- """Determine whether mean of all readings is acceptable."""
- if reading.get("mean_value"):
- from statistics import mean
- readings_list = []
-
- for i in range(1, 11):
- reading_value = reading.get("reading_" + str(i))
- if reading_value is not None:
- readings_list.append(flt(reading_value))
-
- actual_mean = mean(readings_list) if readings_list else 0
- return True if actual_mean == reading.get("mean_value") else False
-
- return True # no mean value, nothing to check
-
def set_status_based_on_acceptance_formula(self, reading):
if not reading.acceptance_formula:
frappe.throw(_("Row #{0}: Acceptance Criteria Formula is required.").format(reading.idx),
@@ -141,18 +122,30 @@
def get_formula_evaluation_data(self, reading):
data = {}
- if cint(reading.value_based):
+ if cint(reading.non_numeric):
data = {"reading_value": reading.get("reading_value")}
else:
# numeric readings
- data = {"reading_1": flt(reading.get("reading_1"))}
- if not cint(reading.single_reading):
- # if multiple numeric readings add all readings to data
- for i in range(2, 11):
- field = "reading_" + str(i)
- data[field] = flt(reading.get(field))
+ for i in range(1, 11):
+ field = "reading_" + str(i)
+ data[field] = flt(reading.get(field))
+ data["mean"] = self.calculate_mean(reading)
+
return data
+ def calculate_mean(self, reading):
+ """Calculate mean of all non-empty readings."""
+ from statistics import mean
+ readings_list = []
+
+ 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))
+
+ actual_mean = mean(readings_list) if readings_list else 0
+ return actual_mean
+
@frappe.whitelist()
@frappe.validate_and_sanitize_search_inputs
def item_query(doctype, txt, searchfield, start, page_len, filters):
diff --git a/erpnext/stock/doctype/quality_inspection_reading/quality_inspection_reading.json b/erpnext/stock/doctype/quality_inspection_reading/quality_inspection_reading.json
index db95fab..0792f26 100644
--- a/erpnext/stock/doctype/quality_inspection_reading/quality_inspection_reading.json
+++ b/erpnext/stock/doctype/quality_inspection_reading/quality_inspection_reading.json
@@ -9,18 +9,15 @@
"specification",
"status",
"value",
- "value_based",
+ "non_numeric",
"column_break_4",
- "formula_based_criteria",
- "acceptance_formula",
"min_value",
"max_value",
- "mean_value",
+ "formula_based_criteria",
+ "acceptance_formula",
"section_break_3",
"reading_value",
"section_break_14",
- "single_reading",
- "section_break_12",
"reading_1",
"reading_2",
"reading_3",
@@ -47,7 +44,7 @@
},
{
"columns": 2,
- "depends_on": "eval:(!doc.formula_based_criteria && doc.value_based)",
+ "depends_on": "eval:(!doc.formula_based_criteria && doc.non_numeric)",
"fieldname": "value",
"fieldtype": "Data",
"in_list_view": 1,
@@ -66,7 +63,6 @@
},
{
"columns": 1,
- "depends_on": "eval:!doc.single_reading",
"fieldname": "reading_2",
"fieldtype": "Data",
"in_list_view": 1,
@@ -76,7 +72,6 @@
},
{
"columns": 1,
- "depends_on": "eval:!doc.single_reading",
"fieldname": "reading_3",
"fieldtype": "Data",
"in_list_view": 1,
@@ -85,7 +80,6 @@
"oldfieldtype": "Data"
},
{
- "depends_on": "eval:!doc.single_reading",
"fieldname": "reading_4",
"fieldtype": "Data",
"label": "Reading 4",
@@ -93,7 +87,6 @@
"oldfieldtype": "Data"
},
{
- "depends_on": "eval:!doc.single_reading",
"fieldname": "reading_5",
"fieldtype": "Data",
"label": "Reading 5",
@@ -101,7 +94,6 @@
"oldfieldtype": "Data"
},
{
- "depends_on": "eval:!doc.single_reading",
"fieldname": "reading_6",
"fieldtype": "Data",
"label": "Reading 6",
@@ -109,7 +101,6 @@
"oldfieldtype": "Data"
},
{
- "depends_on": "eval:!doc.single_reading",
"fieldname": "reading_7",
"fieldtype": "Data",
"label": "Reading 7",
@@ -117,7 +108,6 @@
"oldfieldtype": "Data"
},
{
- "depends_on": "eval:!doc.single_reading",
"fieldname": "reading_8",
"fieldtype": "Data",
"label": "Reading 8",
@@ -125,7 +115,6 @@
"oldfieldtype": "Data"
},
{
- "depends_on": "eval:!doc.single_reading",
"fieldname": "reading_9",
"fieldtype": "Data",
"label": "Reading 9",
@@ -133,7 +122,6 @@
"oldfieldtype": "Data"
},
{
- "depends_on": "eval:!doc.single_reading",
"fieldname": "reading_10",
"fieldtype": "Data",
"label": "Reading 10",
@@ -152,7 +140,7 @@
"options": "Accepted\nRejected"
},
{
- "depends_on": "value_based",
+ "depends_on": "non_numeric",
"fieldname": "section_break_3",
"fieldtype": "Section Break",
"label": "Value Based Inspection"
@@ -163,7 +151,7 @@
},
{
"depends_on": "formula_based_criteria",
- "description": "Simple Python formula applied on Reading fields.<br> Numeric eg.: <b>reading_1 > 0.2 and reading_1 < 0.5</b><br>\nValue based eg.: <b>reading_value in (\"A\", \"B\", \"C)</b>",
+ "description": "Simple Python formula applied on Reading fields.<br> Numeric eg. 1: <b>reading_1 > 0.2 and reading_1 < 0.5</b><br>\nNumeric eg. 2: <b>mean > 3.5</b> (mean of populated fields)<br>\nValue based eg.: <b>reading_value in (\"A\", \"B\", \"C)</b>",
"fieldname": "acceptance_formula",
"fieldtype": "Code",
"label": "Acceptance Criteria Formula"
@@ -183,61 +171,42 @@
"label": "Formula Based Criteria"
},
{
- "depends_on": "eval:(!doc.formula_based_criteria && !doc.single_reading && !doc.value_based)",
- "fieldname": "mean_value",
- "fieldtype": "Float",
- "label": "Mean Value"
- },
- {
- "default": "0",
- "fieldname": "single_reading",
- "fieldtype": "Check",
- "label": "Single Reading"
- },
- {
- "depends_on": "eval:!doc.value_based",
- "fieldname": "section_break_12",
- "fieldtype": "Section Break",
- "hide_border": 1
- },
- {
- "depends_on": "eval:(!doc.formula_based_criteria && !doc.value_based)",
+ "depends_on": "eval:(!doc.formula_based_criteria && !doc.non_numeric)",
"description": "Applied on each reading.",
"fieldname": "min_value",
"fieldtype": "Float",
"label": "Minimum Value"
},
{
- "depends_on": "eval:(!doc.formula_based_criteria && !doc.value_based)",
+ "depends_on": "eval:(!doc.formula_based_criteria && !doc.non_numeric)",
"description": "Applied on each reading.",
"fieldname": "max_value",
"fieldtype": "Float",
"label": "Maximum Value"
},
{
- "default": "0",
- "description": "Non-numeric Inspection.",
- "fieldname": "value_based",
- "fieldtype": "Check",
- "label": "Value Based"
- },
- {
- "depends_on": "value_based",
+ "depends_on": "non_numeric",
"fieldname": "reading_value",
"fieldtype": "Data",
"label": "Reading Value"
},
{
- "depends_on": "eval:!doc.value_based",
+ "depends_on": "eval:!doc.non_numeric",
"fieldname": "section_break_14",
"fieldtype": "Section Break",
"label": "Numeric Inspection"
+ },
+ {
+ "default": "0",
+ "fieldname": "non_numeric",
+ "fieldtype": "Check",
+ "label": "Non-Numeric"
}
],
"idx": 1,
"istable": 1,
"links": [],
- "modified": "2020-12-18 21:02:04.865777",
+ "modified": "2020-12-21 11:36:24.885019",
"modified_by": "Administrator",
"module": "Stock",
"name": "Quality Inspection Reading",
diff --git a/erpnext/stock/doctype/quality_inspection_template/quality_inspection_template.py b/erpnext/stock/doctype/quality_inspection_template/quality_inspection_template.py
index 7dd0feb..c5a7974 100644
--- a/erpnext/stock/doctype/quality_inspection_template/quality_inspection_template.py
+++ b/erpnext/stock/doctype/quality_inspection_template/quality_inspection_template.py
@@ -14,7 +14,6 @@
return frappe.get_all('Item Quality Inspection Parameter',
fields=["specification", "value", "acceptance_formula",
- "value_based", "formula_based_criteria", "single_reading",
- "min_value", "max_value", "mean_value"],
+ "non_numeric", "formula_based_criteria", "min_value", "max_value"],
filters={'parenttype': 'Quality Inspection Template', 'parent': template},
order_by="idx")
\ No newline at end of file