Add rejected serial nos in Purchase Receipt if auto-created based on series
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 e5ae516..0222e58 100755
--- a/erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json
+++ b/erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json
@@ -426,6 +426,7 @@
    "fieldname": "rejected_serial_no", 
    "fieldtype": "Text", 
    "label": "Rejected Serial No", 
+   "no_copy": 1, 
    "permlevel": 0, 
    "print_hide": 1, 
    "read_only": 0
@@ -508,6 +509,7 @@
    "label": "Landed Cost Voucher Amount", 
    "no_copy": 1, 
    "permlevel": 0, 
+   "print_hide": 1, 
    "read_only": 1
   }, 
   {
@@ -555,7 +557,7 @@
  ], 
  "idx": 1, 
  "istable": 1, 
- "modified": "2014-08-08 13:15:06.362562", 
+ "modified": "2014-08-11 12:48:13.509109", 
  "modified_by": "Administrator", 
  "module": "Stock", 
  "name": "Purchase Receipt Item", 
diff --git a/erpnext/stock/doctype/serial_no/serial_no.py b/erpnext/stock/doctype/serial_no/serial_no.py
index fe4af21..b07eab7 100644
--- a/erpnext/stock/doctype/serial_no/serial_no.py
+++ b/erpnext/stock/doctype/serial_no/serial_no.py
@@ -295,19 +295,30 @@
 	return sr.name
 
 def update_serial_nos_after_submit(controller, parentfield):
-	stock_ledger_entries = frappe.db.sql("""select voucher_detail_no, serial_no
+	stock_ledger_entries = frappe.db.sql("""select voucher_detail_no, serial_no, actual_qty, warehouse
 		from `tabStock Ledger Entry` where voucher_type=%s and voucher_no=%s""",
 		(controller.doctype, controller.name), as_dict=True)
 
 	if not stock_ledger_entries: return
 
 	for d in controller.get(parentfield):
-		serial_no = None
+		update_rejected_serial_nos = True if (controller.doctype=="Purchase Receipt" and d.rejected_qty) else False
+		accepted_serial_nos_updated = False
+		warehouse = d.t_warehouse if controller.doctype == "Stock Entry" else d.warehouse
+
 		for sle in stock_ledger_entries:
 			if sle.voucher_detail_no==d.name:
-				serial_no = sle.serial_no
-				break
-
-		if d.serial_no != serial_no:
-			d.serial_no = serial_no
-			frappe.db.set_value(d.doctype, d.name, "serial_no", serial_no)
+				if not accepted_serial_nos_updated and d.qty and abs(sle.actual_qty)==d.qty \
+					and sle.warehouse == warehouse and sle.serial_no != d.serial_no:
+						d.serial_no = sle.serial_no
+						frappe.db.set_value(d.doctype, d.name, "serial_no", sle.serial_no)
+						accepted_serial_nos_updated = True
+						if not update_rejected_serial_nos:
+							break
+				elif update_rejected_serial_nos and abs(sle.actual_qty)==d.rejected_qty \
+					and sle.warehouse == d.rejected_warehouse and sle.serial_no != d.rejected_serial_no:
+						d.rejected_serial_no = sle.serial_no
+						frappe.db.set_value(d.doctype, d.name, "rejected_serial_no", sle.serial_no)
+						update_rejected_serial_nos = False
+						if accepted_serial_nos_updated:
+							break