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 &gt; 0.2 and reading_1 &lt; 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 &gt; 0.2 and reading_1 &lt; 0.5</b><br>\nNumeric eg. 2: <b>mean &gt; 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 &gt; 0.2 and reading_1 &lt; 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 &gt; 0.2 and reading_1 &lt; 0.5</b><br>\nNumeric eg. 2: <b>mean &gt; 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