Merge branch 'develop'
diff --git a/erpnext/__version__.py b/erpnext/__version__.py
index dc8b23e..8288178 100644
--- a/erpnext/__version__.py
+++ b/erpnext/__version__.py
@@ -1,2 +1,2 @@
 from __future__ import unicode_literals
-__version__ = '5.0.19'
+__version__ = '5.0.20'
diff --git a/erpnext/hooks.py b/erpnext/hooks.py
index 7985680..98e3a3b 100644
--- a/erpnext/hooks.py
+++ b/erpnext/hooks.py
@@ -5,7 +5,7 @@
 app_description = "Open Source Enterprise Resource Planning for Small and Midsized Organizations"
 app_icon = "icon-th"
 app_color = "#e74c3c"
-app_version = "5.0.19"
+app_version = "5.0.20"
 
 error_report_email = "support@erpnext.com"
 
diff --git a/erpnext/projects/doctype/task/task.py b/erpnext/projects/doctype/task/task.py
index 456c40a..42717fd 100644
--- a/erpnext/projects/doctype/task/task.py
+++ b/erpnext/projects/doctype/task/task.py
@@ -28,7 +28,11 @@
 
 	def validate(self):
 		self.validate_dates()
-		
+
+		if self.status!=self.get_db_value("status") and self.status == "Closed":
+			from frappe.desk.form.assign_to import clear
+			clear(self.doctype, self.name)
+
 	def validate_dates(self):
 		if self.exp_start_date and self.exp_end_date and getdate(self.exp_start_date) > getdate(self.exp_end_date):
 			frappe.throw(_("'Expected Start Date' can not be greater than 'Expected End Date'"))
@@ -41,17 +45,17 @@
 		self.reschedule_dependent_tasks()
 		self.update_percentage()
 		self.update_project()
-			
+
 	def update_percentage(self):
 		"""update percent complete in project"""
 		if self.project and not self.flags.from_project:
 			project = frappe.get_doc("Project", self.project)
 			project.run_method("update_percent_complete")
-			
+
 	def update_total_expense_claim(self):
-		self.total_expense_claim = frappe.db.sql("""select sum(total_sanctioned_amount) from `tabExpense Claim` 
+		self.total_expense_claim = frappe.db.sql("""select sum(total_sanctioned_amount) from `tabExpense Claim`
 			where project = %s and task = %s and approval_status = "Approved" and docstatus=1""",(self.project, self.name))
-			
+
 	def update_time_and_costing(self):
 		tl = frappe.db.sql("""select min(from_time) as start_date, max(to_time) as end_date,
 			 sum(billing_amount) as total_billing_amount, sum(costing_amount) as total_costing_amount,
@@ -64,14 +68,14 @@
 		self.actual_time= tl.time
 		self.act_start_date= tl.start_date
 		self.act_end_date= tl.end_date
-			
+
 	def update_project(self):
 		if self.project and frappe.db.exists("Project", self.project):
 			project = frappe.get_doc("Project", self.project)
 			project.flags.dont_sync_tasks = True
 			project.update_costing()
 			project.save()
-			
+
 	def check_recursion(self):
 		if self.flags.ignore_recursion_check: return
 		check_list = [['task', 'parent'], ['parent', 'task']]
@@ -88,7 +92,7 @@
 						task_list.append(b[0])
 				if count == 15:
 					break
-			
+
 	def reschedule_dependent_tasks(self):
 		end_date = self.exp_end_date or self.act_end_date
 		if end_date:
diff --git a/erpnext/projects/doctype/task/test_task.py b/erpnext/projects/doctype/task/test_task.py
index 8880763..fced0a4 100644
--- a/erpnext/projects/doctype/task/test_task.py
+++ b/erpnext/projects/doctype/task/test_task.py
@@ -11,19 +11,19 @@
 
 class TestTask(unittest.TestCase):
 	def test_circular_reference(self):
-		
+
 		task1 =  frappe.new_doc('Task')
 		task1.update({
-			"status": "Open", 
+			"status": "Open",
 			"subject": "_Test Task 1",
 			"exp_start_date": "2015-1-1",
 			"exp_end_date": "2015-1-10"
 		})
 		task1.save()
-		
+
 		task2 =  frappe.new_doc('Task')
 		task2.update({
-			"status": "Open", 
+			"status": "Open",
 			"subject": "_Test Task 2",
 			"exp_start_date": "2015-1-11",
 			"exp_end_date": "2015-1-15",
@@ -34,10 +34,10 @@
 			]
 		})
 		task2.save()
-		
+
 		task3 =  frappe.new_doc('Task')
 		task3.update({
-			"status": "Open", 
+			"status": "Open",
 			"subject": "_Test Task 2",
 			"exp_start_date": "2015-1-11",
 			"exp_end_date": "2015-1-15",
@@ -53,13 +53,13 @@
 			"task": task3.name
 		})
 		self.assertRaises(CircularReferenceError, task1.save)
-		
+
 		task1.set("depends_on", [])
 		task1.save()
-		
+
 		task4 =  frappe.new_doc('Task')
 		task4.update({
-			"status": "Open", 
+			"status": "Open",
 			"subject": "_Test Task 1",
 			"exp_start_date": "2015-1-1",
 			"exp_end_date": "2015-1-15",
@@ -74,20 +74,20 @@
 		task3.append("depends_on", {
 			"task": task4.name
 		})
-		
+
 	def test_reschedule_dependent_task(self):
 		task1 =  frappe.new_doc('Task')
 		task1.update({
-			"status": "Open", 
+			"status": "Open",
 			"subject": "_Test Task 1",
 			"exp_start_date": "2015-1-1",
 			"exp_end_date": "2015-1-10"
 		})
 		task1.save()
-		
+
 		task2 =  frappe.new_doc('Task')
 		task2.update({
-			"status": "Open", 
+			"status": "Open",
 			"subject": "_Test Task 2",
 			"exp_start_date": "2015-1-11",
 			"exp_end_date": "2015-1-15",
@@ -98,10 +98,10 @@
 			]
 		})
 		task2.save()
-		
+
 		task3 =  frappe.new_doc('Task')
 		task3.update({
-			"status": "Open", 
+			"status": "Open",
 			"subject": "_Test Task 3",
 			"exp_start_date": "2015-1-16",
 			"exp_end_date": "2015-1-18",
@@ -112,18 +112,18 @@
 			]
 		})
 		task3.save()
-		
+
 		task1.update({
 			"exp_end_date": "2015-1-20"
 		})
 		task1.save()
-		
+
 		self.assertEqual(frappe.db.get_value("Task", task2.name, "exp_start_date"), getdate('2015-1-21'))
 		self.assertEqual(frappe.db.get_value("Task", task2.name, "exp_end_date"), getdate('2015-1-25'))
 
 		self.assertEqual(frappe.db.get_value("Task", task3.name, "exp_start_date"), getdate('2015-1-26'))
 		self.assertEqual(frappe.db.get_value("Task", task3.name, "exp_end_date"), getdate('2015-1-28'))
-		
+
 		time_log = frappe.new_doc('Time Log')
 		time_log.update({
 			"from_time": "2015-1-1",
@@ -131,18 +131,49 @@
 			"task": task1.name
 		})
 		time_log.submit()
-		
+
 		self.assertEqual(frappe.db.get_value("Task", task2.name, "exp_start_date"), getdate('2015-1-21'))
 		self.assertEqual(frappe.db.get_value("Task", task2.name, "exp_end_date"), getdate('2015-1-25'))
 
 		self.assertEqual(frappe.db.get_value("Task", task3.name, "exp_start_date"), getdate('2015-1-26'))
 		self.assertEqual(frappe.db.get_value("Task", task3.name, "exp_end_date"), getdate('2015-1-28'))
-		
+
 		time_log.cancel()
-		
+
 		self.assertEqual(frappe.db.get_value("Task", task2.name, "exp_start_date"), getdate('2015-1-21'))
 		self.assertEqual(frappe.db.get_value("Task", task2.name, "exp_end_date"), getdate('2015-1-25'))
 
 		self.assertEqual(frappe.db.get_value("Task", task3.name, "exp_start_date"), getdate('2015-1-26'))
 		self.assertEqual(frappe.db.get_value("Task", task3.name, "exp_end_date"), getdate('2015-1-28'))
-		
\ No newline at end of file
+
+
+	def test_close_assignment(self):
+		task = frappe.new_doc("Task")
+		task.subject = "Test Close Assignment"
+		task.insert()
+
+		def assign():
+			from frappe.desk.form import assign_to
+			assign_to.add({
+				"assign_to": "test@example.com",
+				"doctype": task.doctype,
+				"name": task.name,
+				"description": "Close this task"
+			})
+
+		def get_owner_and_status():
+			return frappe.db.get_value("ToDo", filters={"reference_type": task.doctype, "reference_name": task.name,
+					"description": "Close this task"}, fieldname=("owner", "status"), as_dict=True)
+
+		assign()
+		todo = get_owner_and_status()
+		self.assertEquals(todo.owner, "test@example.com")
+		self.assertEquals(todo.status, "Open")
+
+		# assignment should be
+		task.load_from_db()
+		task.status = "Closed"
+		task.save()
+		todo = get_owner_and_status()
+		self.assertEquals(todo.owner, "test@example.com")
+		self.assertEquals(todo.status, "Closed")
diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js
index e05245e..ca0a6cb 100644
--- a/erpnext/public/js/controllers/transaction.js
+++ b/erpnext/public/js/controllers/transaction.js
@@ -105,6 +105,15 @@
 		}
 	},
 
+	barcode: function(doc, cdt, cdn) {
+		var d = locals[cdt][cdn];
+		if(d.barcode=="" || d.barcode==null) {
+			// barcode cleared, remove item
+			d.item_code = "";
+		}
+		this.item_code(doc, cdt, cdn);
+	},
+
 	item_code: function(doc, cdt, cdn) {
 		var me = this;
 		var item = frappe.get_doc(cdt, cdn);
diff --git a/erpnext/public/js/feature_setup.js b/erpnext/public/js/feature_setup.js
index 5ab04dd..664da66 100644
--- a/erpnext/public/js/feature_setup.js
+++ b/erpnext/public/js/feature_setup.js
@@ -81,7 +81,8 @@
 		'Item': {'fields': ['barcode']},
 		'Delivery Note': {'items': ['barcode']},
 		'Sales Invoice': {'items': ['barcode']},
-		'Stock Entry': {'items': ['barcode']}
+		'Stock Entry': {'items': ['barcode']},
+		'Purchase Receipt': {'items': ['barcode']}
 	},
 	'fs_item_group_in_details': {
 		'Delivery Note': {'items':['item_group']},
diff --git a/erpnext/selling/sales_common.js b/erpnext/selling/sales_common.js
index 3ef8525..775eb41 100644
--- a/erpnext/selling/sales_common.js
+++ b/erpnext/selling/sales_common.js
@@ -124,15 +124,6 @@
 		this.apply_pricing_rule();
 	},
 
-	barcode: function(doc, cdt, cdn) {
-		var d = locals[cdt][cdn];
-		if(d.barcode=="" || d.barcode==null) {
-			// barcode cleared, remove item
-			d.item_code = "";
-		}
-		this.item_code(doc, cdt, cdn);
-	},
-
 	selling_price_list: function() {
 		this.apply_price_list();
 	},
diff --git a/erpnext/stock/doctype/material_request/material_request.json b/erpnext/stock/doctype/material_request/material_request.json
index 894b9e1..a3026c4 100644
--- a/erpnext/stock/doctype/material_request/material_request.json
+++ b/erpnext/stock/doctype/material_request/material_request.json
@@ -221,7 +221,7 @@
  "icon": "icon-ticket", 
  "idx": 1, 
  "is_submittable": 1, 
- "modified": "2015-05-27 15:36:06.818491", 
+ "modified": "2015-06-09 05:47:05.934432", 
  "modified_by": "Administrator", 
  "module": "Stock", 
  "name": "Material Request", 
diff --git a/erpnext/stock/doctype/material_request/material_request_list.js b/erpnext/stock/doctype/material_request/material_request_list.js
index 293d960..390e222 100644
--- a/erpnext/stock/doctype/material_request/material_request_list.js
+++ b/erpnext/stock/doctype/material_request/material_request_list.js
@@ -6,7 +6,13 @@
 		} else if(doc.docstatus==1 && flt(doc.per_ordered) < 100) {
 			return [__("Pending"), "orange", "per_ordered,<,100"];
 		} else if(doc.docstatus==1 && flt(doc.per_ordered) == 100) {
-			return [__("Ordered"), "green", "per_ordered,=,100"];
+			if (doc.material_request_type == "Purchase") {
+				return [__("Ordered"), "green", "per_ordered,=,100"];
+			} else if (doc.material_request_type == "Material Transfer") {
+				return [__("Transfered"), "green", "per_ordered,=,100"];
+			} else if (doc.material_request_type == "Material Issue") {
+				return [__("Issued"), "green", "per_ordered,=,100"];
+			}
 		}
 	}
 };
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 c48aa2c..f53f508 100755
--- a/erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json
+++ b/erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json
@@ -5,6 +5,19 @@
  "doctype": "DocType", 
  "fields": [
   {
+   "fieldname": "barcode", 
+   "fieldtype": "Data", 
+   "label": "Barcode", 
+   "permlevel": 0, 
+   "precision": ""
+  }, 
+  {
+   "fieldname": "section_break_2", 
+   "fieldtype": "Section Break", 
+   "permlevel": 0, 
+   "precision": ""
+  }, 
+  {
    "fieldname": "item_code", 
    "fieldtype": "Link", 
    "in_filter": 1, 
@@ -642,7 +655,7 @@
  ], 
  "idx": 1, 
  "istable": 1, 
- "modified": "2015-06-02 14:19:13.528248", 
+ "modified": "2015-06-08 08:21:18.024324", 
  "modified_by": "Administrator", 
  "module": "Stock", 
  "name": "Purchase Receipt Item", 
diff --git a/setup.py b/setup.py
index f43a11c..01425c2 100644
--- a/setup.py
+++ b/setup.py
@@ -1,6 +1,6 @@
 from setuptools import setup, find_packages
 
-version = "5.0.19"
+version = "5.0.20"
 
 with open("requirements.txt", "r") as f:
 	install_requires = f.readlines()