Test Cases
diff --git a/erpnext/projects/doctype/activity_cost/activity_cost.py b/erpnext/projects/doctype/activity_cost/activity_cost.py
index efba0f6..03aff28 100644
--- a/erpnext/projects/doctype/activity_cost/activity_cost.py
+++ b/erpnext/projects/doctype/activity_cost/activity_cost.py
@@ -3,12 +3,19 @@
 # For license information, please see license.txt
 
 from __future__ import unicode_literals
+import frappe
 from frappe import _
 from frappe.model.document import Document
 
 class ActivityCost(Document):
 	def validate(self):
 		self.set_title()
+		self.check_unique()
 		
 	def set_title(self):
 		self.title = _("{0} for {1}").format(self.employee_name, self.activity_type)
+		
+	def check_unique(self):
+		if frappe.db.exists({ "doctype": "Activity Cost", "employee": self.employee, "activity_type": self.activity_type }):
+			frappe.throw(_("Activity Cost exists for Employee {0} against Activity Type {1}")
+				.format(self.employee, self.activity_type))
diff --git a/erpnext/projects/doctype/activity_cost/test_activity_cost.py b/erpnext/projects/doctype/activity_cost/test_activity_cost.py
index 6f483de..e9ec0b3 100644
--- a/erpnext/projects/doctype/activity_cost/test_activity_cost.py
+++ b/erpnext/projects/doctype/activity_cost/test_activity_cost.py
@@ -6,7 +6,7 @@
 import frappe
 import unittest
 
-# test_records = frappe.get_test_records('Activity Cost')
+test_records = frappe.get_test_records('Activity Cost')
 
 class TestActivityCost(unittest.TestCase):
 	pass
diff --git a/erpnext/projects/doctype/activity_cost/test_records.json b/erpnext/projects/doctype/activity_cost/test_records.json
new file mode 100644
index 0000000..30c9c9e
--- /dev/null
+++ b/erpnext/projects/doctype/activity_cost/test_records.json
@@ -0,0 +1,9 @@
+[
+ {
+  "employee": "_T-Employee-0001",
+  "employee_name": "_Test Employee",
+  "activity_type": "_Test Activity Type",
+  "billing_rate": 100,
+  "costing_rate": 50
+ }
+]
\ No newline at end of file
diff --git a/erpnext/projects/doctype/project/test_project.py b/erpnext/projects/doctype/project/test_project.py
index 744d6b4..f69ce80 100644
--- a/erpnext/projects/doctype/project/test_project.py
+++ b/erpnext/projects/doctype/project/test_project.py
@@ -5,4 +5,3 @@
 
 import frappe
 test_records = frappe.get_test_records('Project')
-test_ignore = ["Task"]
diff --git a/erpnext/projects/doctype/project/test_records.json b/erpnext/projects/doctype/project/test_records.json
index 69226f0..9379c22 100644
--- a/erpnext/projects/doctype/project/test_records.json
+++ b/erpnext/projects/doctype/project/test_records.json
@@ -1,10 +1,12 @@
 [
  {
-  "project_name": "_Test Project", 
-  "status": "Open"
- }, 
- {
-  "project_name": "_Test Project 1", 
-  "status": "Open"
+  "project_name": "_Test Project",
+  "status": "Open",
+  "tasks":[ 
+   {
+	  "title": "_Test Task",
+	  "status": "Open"
+   }
+  ]
  }
 ]
\ No newline at end of file
diff --git a/erpnext/projects/doctype/project_task/project_task.json b/erpnext/projects/doctype/project_task/project_task.json
index 00e97f6..11d5b55 100644
--- a/erpnext/projects/doctype/project_task/project_task.json
+++ b/erpnext/projects/doctype/project_task/project_task.json
@@ -128,7 +128,7 @@
   {
    "fieldname": "task_id", 
    "fieldtype": "Link", 
-   "hidden": 1, 
+   "hidden": 0, 
    "label": "Task ID", 
    "no_copy": 1, 
    "options": "Task", 
@@ -143,7 +143,7 @@
  "is_submittable": 0, 
  "issingle": 0, 
  "istable": 1, 
- "modified": "2015-03-26 04:55:36.680900", 
+ "modified": "2015-04-06 09:41:50.911955", 
  "modified_by": "Administrator", 
  "module": "Projects", 
  "name": "Project Task", 
diff --git a/erpnext/projects/doctype/task/task.py b/erpnext/projects/doctype/task/task.py
index c921d02..6748ead 100644
--- a/erpnext/projects/doctype/task/task.py
+++ b/erpnext/projects/doctype/task/task.py
@@ -46,13 +46,14 @@
 			project.run_method("update_percent_complete")
 			
 	def update_project(self):
-		total_activity_cost = frappe.db.sql("""select sum(actual_cost) from `tabTask` 
-			where project = %s""",self.project)
-		frappe.db.set_value("Project", self.project, "total_activity_cost", total_activity_cost)
-		
-		total_expense_claim = frappe.db.sql("""select sum(total_expense_claim) from `tabTask` 
-			where project = %s""",self.project)
-		frappe.db.set_value("Project", self.project, "total_expense_claim", total_expense_claim)
+		if self.project:
+			total_activity_cost = frappe.db.sql("""select sum(actual_cost) from `tabTask` 
+				where project = %s""",self.project)
+			frappe.db.set_value("Project", self.project, "total_activity_cost", total_activity_cost)
+	
+			total_expense_claim = frappe.db.sql("""select sum(total_expense_claim) from `tabTask` 
+				where project = %s""",self.project)
+			frappe.db.set_value("Project", self.project, "total_expense_claim", total_expense_claim)
 
 @frappe.whitelist()
 def get_events(start, end, filters=None):
diff --git a/erpnext/projects/doctype/task/test_records.json b/erpnext/projects/doctype/task/test_records.json
index 1f98172..42ca0e7 100644
--- a/erpnext/projects/doctype/task/test_records.json
+++ b/erpnext/projects/doctype/task/test_records.json
@@ -1,8 +1,8 @@
 [
  {
-  "project": "_Test Project", 
   "status": "Open", 
-  "subject": "_Test Task"
+  "subject": "_Test Task",
+  "name": "task001"
  }, 
  {
   "status": "Open", 
diff --git a/erpnext/projects/doctype/task/test_task.py b/erpnext/projects/doctype/task/test_task.py
index 6f75e0d..62e560f 100644
--- a/erpnext/projects/doctype/task/test_task.py
+++ b/erpnext/projects/doctype/task/test_task.py
@@ -5,5 +5,3 @@
 
 import frappe
 test_records = frappe.get_test_records('Task')
-test_dependencies = ["Project"]
-test_ignore = ["Customer"]
diff --git a/erpnext/projects/doctype/time_log/test_records.json b/erpnext/projects/doctype/time_log/test_records.json
index d9e67e9..568c012 100644
--- a/erpnext/projects/doctype/time_log/test_records.json
+++ b/erpnext/projects/doctype/time_log/test_records.json
@@ -5,7 +5,6 @@
   "doctype": "Time Log",
   "from_time": "2013-01-01 10:00:00.000000",
   "note": "_Test Note",
-  "to_time": "2013-01-01 11:00:00.000000",
-  "project": "_Test Project"
+  "to_time": "2013-01-01 11:00:00.000000"
  }
 ]
diff --git a/erpnext/projects/doctype/time_log/test_time_log.py b/erpnext/projects/doctype/time_log/test_time_log.py
index 8f8e31d..630962d 100644
--- a/erpnext/projects/doctype/time_log/test_time_log.py
+++ b/erpnext/projects/doctype/time_log/test_time_log.py
@@ -10,7 +10,6 @@
 from erpnext.projects.doctype.time_log.time_log import NotSubmittedError
 from erpnext.manufacturing.doctype.workstation.workstation import WorkstationHolidayError
 from erpnext.manufacturing.doctype.workstation.workstation import NotInWorkingHoursError
-from erpnext.projects.doctype.time_log_batch.test_time_log_batch import *
 from erpnext.manufacturing.doctype.production_order.test_production_order import make_prod_order_test_record
 
 
@@ -85,6 +84,61 @@
 		test_time_log.to_time = "2013-01-01 10:00:00.000000"
 		self.assertRaises(frappe.ValidationError, test_time_log.save)
 		frappe.db.sql("delete from `tabTime Log`")
-
+		
+	def test_time_log_costing(self):
+		frappe.db.sql("delete from `tabTask`")
+		frappe.db.sql("delete from `tabProject`")
+		
+		frappe.get_doc({
+			"project_name": "_Test Project 1",
+			"doctype": "Project",
+			"tasks" :
+				[{ "title": "_Test Project Task 1", "status": "Open" }]
+		}).save()
+		
+		task_name = frappe.db.get_value("Task",{"project": "_Test Project 1"})
+		
+		time_log = frappe.get_doc({
+			 "activity_type": "_Test Activity Type",
+			 "docstatus": 1,
+			 "doctype": "Time Log",
+			 "from_time": "2013-02-02 09:00:00.000000",
+			 "to_time": "2013-02-02 11:00:00.000000",
+			 "employee": "_T-Employee-0001",
+			 "project": "_Test Project 1",
+			 "task": task_name,
+			 "billable": 1
+		})
+		time_log.save()
+		self.assertEqual(time_log.costing_rate, 50)
+		self.assertEqual(time_log.costing_amount, 100)
+		self.assertEqual(time_log.billing_rate, 100)
+		self.assertEqual(time_log.billing_amount, 200)
+		time_log.submit()
+		
+		self.assertEqual(frappe.db.get_value("Task", task_name, "actual_cost"), 200)
+		self.assertEqual(frappe.db.get_value("Project", "_Test Project 1", "total_activity_cost"), 200)
+		
+		time_log2 = frappe.get_doc({
+			 "activity_type": "_Test Activity Type",
+			 "docstatus": 1,
+			 "doctype": "Time Log",
+			 "from_time": "2013-02-03 09:00:00.000000",
+			 "to_time": "2013-02-03 11:00:00.000000",
+			 "employee": "_T-Employee-0001",
+			 "project": "_Test Project 1",
+			 "task": task_name,
+			 "billable": 1
+		})
+		time_log2.save()
+		
+		self.assertEqual(frappe.db.get_value("Task", task_name, "actual_cost"), 400)
+		self.assertEqual(frappe.db.get_value("Project", "_Test Project 1", "total_activity_cost"), 400)
+		
+		time_log2.cancel()
+		
+		self.assertEqual(frappe.db.get_value("Task", task_name, "actual_cost"), 200)
+		self.assertEqual(frappe.db.get_value("Project", "_Test Project 1", "total_activity_cost"), 200)
+		
 test_records = frappe.get_test_records('Time Log')
 test_ignore = ["Time Log Batch", "Sales Invoice"]