refactor: (ux) Accepted/Rejected/Received Qty UX
diff --git a/erpnext/controllers/buying_controller.py b/erpnext/controllers/buying_controller.py
index 9965c87..4ec4df8 100644
--- a/erpnext/controllers/buying_controller.py
+++ b/erpnext/controllers/buying_controller.py
@@ -360,17 +360,12 @@
 	def validate_accepted_rejected_qty(self):
 		for d in self.get("items"):
 			self.validate_negative_quantity(d, ["received_qty","qty", "rejected_qty"])
-			if not flt(d.received_qty) and flt(d.qty):
-				d.received_qty = flt(d.qty) - flt(d.rejected_qty)
 
-			elif not flt(d.qty) and flt(d.rejected_qty):
-				d.qty = flt(d.received_qty) - flt(d.rejected_qty)
+			if not flt(d.received_qty) and (flt(d.qty) or flt(d.rejected_qty)):
+				d.received_qty = flt(d.qty) + flt(d.rejected_qty)
 
-			elif not flt(d.rejected_qty):
-				d.rejected_qty = flt(d.received_qty) -  flt(d.qty)
-
-			val  = flt(d.qty) + flt(d.rejected_qty)
 			# Check Received Qty = Accepted Qty + Rejected Qty
+			val  = flt(d.qty) + flt(d.rejected_qty)
 			if (flt(val, d.precision("received_qty")) != flt(d.received_qty, d.precision("received_qty"))):
 				frappe.throw(_("Accepted + Rejected Qty must be equal to Received quantity for Item {0}").format(d.item_code))
 
diff --git a/erpnext/public/js/controllers/buying.js b/erpnext/public/js/controllers/buying.js
index 86dadd3..d696ef5 100644
--- a/erpnext/public/js/controllers/buying.js
+++ b/erpnext/public/js/controllers/buying.js
@@ -165,45 +165,33 @@
 	}
 
 	qty(doc, cdt, cdn) {
-		var item = frappe.get_doc(cdt, cdn);
 		if ((doc.doctype == "Purchase Receipt") || (doc.doctype == "Purchase Invoice" && (doc.update_stock || doc.is_return))) {
-			frappe.model.round_floats_in(item, ["qty", "received_qty"]);
-
-			if(!doc.is_return && this.validate_negative_quantity(cdt, cdn, item, ["qty", "received_qty"])){ return }
-
-			if(!item.rejected_qty && item.qty) {
-				item.received_qty = item.qty;
-			}
-
-			frappe.model.round_floats_in(item, ["qty", "received_qty"]);
-			item.rejected_qty = flt(item.received_qty - item.qty, precision("rejected_qty", item));
-			item.received_stock_qty = flt(item.conversion_factor, precision("conversion_factor", item)) * flt(item.received_qty);
+			this.calculate_received_qty(doc, cdt, cdn)
 		}
 		super.qty(doc, cdt, cdn);
 	}
 
+	rejected_qty(doc, cdt, cdn) {
+		this.calculate_received_qty(doc, cdt, cdn)
+	}
+
+	calculate_received_qty(doc, cdt, cdn){
+		var item = frappe.get_doc(cdt, cdn);
+		frappe.model.round_floats_in(item, ["qty", "rejected_qty"]);
+
+		if(!doc.is_return && this.validate_negative_quantity(cdt, cdn, item, ["qty", "rejected_qty"])){ return }
+
+		let received_qty = flt(item.qty + item.rejected_qty, precision("received_qty", item));
+		let received_stock_qty = flt(item.conversion_factor, precision("conversion_factor", item)) * flt(received_qty);
+
+		frappe.model.set_value(cdt, cdn, "received_qty", received_qty);
+		frappe.model.set_value(cdt, cdn, "received_stock_qty", received_stock_qty);
+	}
+
 	batch_no(doc, cdt, cdn) {
 		super.batch_no(doc, cdt, cdn);
 	}
 
-	received_qty(doc, cdt, cdn) {
-		this.calculate_accepted_qty(doc, cdt, cdn)
-	}
-
-	rejected_qty(doc, cdt, cdn) {
-		this.calculate_accepted_qty(doc, cdt, cdn)
-	}
-
-	calculate_accepted_qty(doc, cdt, cdn){
-		var item = frappe.get_doc(cdt, cdn);
-		frappe.model.round_floats_in(item, ["received_qty", "rejected_qty"]);
-
-		if(!doc.is_return && this.validate_negative_quantity(cdt, cdn, item, ["received_qty", "rejected_qty"])){ return }
-
-		item.qty = flt(item.received_qty - item.rejected_qty, precision("qty", item));
-		this.qty(doc, cdt, cdn);
-	}
-
 	validate_negative_quantity(cdt, cdn, item, fieldnames){
 		if(!item || !fieldnames) { return }
 
diff --git a/erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json b/erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json
index 3efa66e..3ddb635 100644
--- a/erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json
+++ b/erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json
@@ -197,6 +197,7 @@
   },
   {
    "bold": 1,
+   "default": "0",
    "fieldname": "received_qty",
    "fieldtype": "Float",
    "label": "Received Quantity",
@@ -204,6 +205,7 @@
    "oldfieldtype": "Currency",
    "print_hide": 1,
    "print_width": "100px",
+   "read_only": 1,
    "reqd": 1,
    "width": "100px"
   },
@@ -543,6 +545,7 @@
    "fieldname": "stock_qty",
    "fieldtype": "Float",
    "label": "Accepted Qty in Stock UOM",
+   "no_copy": 1,
    "oldfieldname": "stock_qty",
    "oldfieldtype": "Currency",
    "print_hide": 1,
@@ -882,7 +885,9 @@
    "fieldname": "received_stock_qty",
    "fieldtype": "Float",
    "label": "Received Qty in Stock UOM",
-   "print_hide": 1
+   "no_copy": 1,
+   "print_hide": 1,
+   "read_only": 1
   },
   {
    "depends_on": "eval: doc.uom != doc.stock_uom",
@@ -969,10 +974,11 @@
  "idx": 1,
  "istable": 1,
  "links": [],
- "modified": "2021-09-01 16:02:40.338597",
+ "modified": "2021-11-03 17:56:53.916921",
  "modified_by": "Administrator",
  "module": "Stock",
  "name": "Purchase Receipt Item",
+ "naming_rule": "Random",
  "owner": "Administrator",
  "permissions": [],
  "quick_entry": 1,