Merge pull request #3909 from nabinhait/testcase1

Testcase and Patch Fix
diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py
index d12b2d7..0b74948 100644
--- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py
+++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py
@@ -232,45 +232,24 @@
 		test_recurring_document(self, test_records)
 
 	def test_total_purchase_cost_for_project(self):
-		purchase_invoice = frappe.new_doc('Purchase Invoice')
-		purchase_invoice.update({
-			"credit_to": "_Test Payable - _TC",
-			"supplier": "_Test Supplier",
-			"company": "_Test Company",
-			"items": [
-				{
-					"rate": 500,
-					"qty": 1,
-					"project_name": "_Test Project",
-					"item_code": "_Test Item Home Desktop 100",
-					"expense_account": "_Test Account Cost for Goods Sold - _TC",
-					"cost_center": "_Test Cost Center - _TC"
-				},
-				{
-					"rate": 1500,
-					"qty": 1,
-					"project_name": "_Test Project",
-					"item_code": "_Test Item Home Desktop 200",
-					"expense_account": "_Test Account Cost for Goods Sold - _TC",
-					"cost_center": "_Test Cost Center - _TC"
-				}
-			]
-		})
-		purchase_invoice.save()
-		purchase_invoice.submit()
-		self.assertEqual(frappe.db.get_value("Project", "_Test Project", "total_purchase_cost"), 2000)
+		existing_purchase_cost = frappe.db.sql("""select sum(ifnull(base_net_amount, 0))
+			from `tabPurchase Invoice Item` where project_name = '_Test Project' and docstatus=1""")
+		existing_purchase_cost = existing_purchase_cost and existing_purchase_cost[0][0] or 0
+		
+		pi = make_purchase_invoice(currency="USD", conversion_rate=60, project_name="_Test Project")
+		self.assertEqual(frappe.db.get_value("Project", "_Test Project", "total_purchase_cost"), 
+			existing_purchase_cost + 15000)
 
-		purchase_invoice1 = frappe.copy_doc(purchase_invoice)
-		purchase_invoice1.save()
-		purchase_invoice1.submit()
+		pi1 = make_purchase_invoice(qty=10, project_name="_Test Project")
+		self.assertEqual(frappe.db.get_value("Project", "_Test Project", "total_purchase_cost"), 
+			existing_purchase_cost + 15500)
 
-		self.assertEqual(frappe.db.get_value("Project", "_Test Project", "total_purchase_cost"), 4000)
+		pi1.cancel()
+		self.assertEqual(frappe.db.get_value("Project", "_Test Project", "total_purchase_cost"), 
+			existing_purchase_cost + 15000)
 
-		purchase_invoice1.cancel()
-		self.assertEqual(frappe.db.get_value("Project", "_Test Project", "total_purchase_cost"), 2000)
-
-		purchase_invoice.cancel()
-		self.assertEqual(frappe.db.get_value("Project", "_Test Project", "total_purchase_cost"), 0)
+		pi.cancel()
+		self.assertEqual(frappe.db.get_value("Project", "_Test Project", "total_purchase_cost"), existing_purchase_cost)
 
 	def test_return_purchase_invoice(self):
 		set_perpetual_inventory()
@@ -308,6 +287,7 @@
 	pi.company = args.company or "_Test Company"
 	pi.supplier = args.supplier or "_Test Supplier"
 	pi.currency = args.currency or "INR"
+	pi.conversion_rate = args.conversion_rate or 1
 	pi.is_return = args.is_return
 	pi.return_against = args.return_against
 
@@ -318,7 +298,9 @@
 		"rate": args.rate or 50,
 		"conversion_factor": 1.0,
 		"serial_no": args.serial_no,
-		"stock_uom": "_Test UOM"
+		"stock_uom": "_Test UOM",
+		"cost_center": "_Test Cost Center - _TC",
+		"project_name": args.project_name
 	})
 	if not args.do_not_save:
 		pi.insert()
diff --git a/erpnext/patches/v5_4/update_purchase_cost_against_project.py b/erpnext/patches/v5_4/update_purchase_cost_against_project.py
index 7e54738..3a02eb7 100644
--- a/erpnext/patches/v5_4/update_purchase_cost_against_project.py
+++ b/erpnext/patches/v5_4/update_purchase_cost_against_project.py
@@ -6,6 +6,8 @@
 
 def execute():
 	for p in frappe.get_all("Project"):
-		project = frappe.get_doc("Project", p.name)
-		project.update_purchase_costing()
-		project.save()
\ No newline at end of file
+		purchase_cost = frappe.db.sql("""select sum(ifnull(base_net_amount, 0))
+			from `tabPurchase Invoice Item` where project_name = %s and docstatus=1""", p.name)
+		purchase_cost = purchase_cost and purchase_cost[0][0] or 0
+		
+		frappe.db.set_value("Project", p.name, "total_purchase_cost", purchase_cost)
\ No newline at end of file