Merge branch 'master' of github.com:webnotes/erpnext
diff --git a/accounts/DocType Mapper/Project-Sales Invoice/Project-Sales Invoice.txt b/accounts/DocType Mapper/Project-Sales Invoice/Project-Sales Invoice.txt
deleted file mode 100644
index dd5705d..0000000
--- a/accounts/DocType Mapper/Project-Sales Invoice/Project-Sales Invoice.txt
+++ /dev/null
@@ -1,49 +0,0 @@
-[
- {
-  "owner": "ashwini@webnotestech.com", 
-  "docstatus": 0, 
-  "creation": "2010-09-01 15:47:59", 
-  "modified_by": "Administrator", 
-  "modified": "2012-04-03 12:49:50"
- }, 
- {
-  "match_id": 0, 
-  "parent": "Project-Sales Invoice", 
-  "name": "__common__", 
-  "doctype": "Table Mapper Detail", 
-  "parenttype": "DocType Mapper", 
-  "from_table": "Project", 
-  "to_table": "Sales Invoice", 
-  "validation_logic": "name is not null", 
-  "parentfield": "table_mapper_details"
- }, 
- {
-  "map": "Yes", 
-  "match_id": 0, 
-  "parent": "Project-Sales Invoice", 
-  "name": "__common__", 
-  "to_field": "customer", 
-  "doctype": "Field Mapper Detail", 
-  "parenttype": "DocType Mapper", 
-  "checking_operator": "=", 
-  "from_field": "customer", 
-  "parentfield": "field_mapper_details"
- }, 
- {
-  "name": "__common__", 
-  "to_doctype": "Sales Invoice", 
-  "module": "Accounts", 
-  "doctype": "DocType Mapper", 
-  "from_doctype": "Project"
- }, 
- {
-  "name": "Project-Sales Invoice", 
-  "doctype": "DocType Mapper"
- }, 
- {
-  "doctype": "Field Mapper Detail"
- }, 
- {
-  "doctype": "Table Mapper Detail"
- }
-]
\ No newline at end of file
diff --git a/accounts/doctype/purchase_invoice/purchase_invoice.py b/accounts/doctype/purchase_invoice/purchase_invoice.py
index 7d858a9..dc17071 100644
--- a/accounts/doctype/purchase_invoice/purchase_invoice.py
+++ b/accounts/doctype/purchase_invoice/purchase_invoice.py
@@ -482,6 +482,9 @@
 
 
 	def on_submit(self):
+		purchase_controller = webnotes.get_obj("Purchase Common")
+		purchase_controller.is_item_table_empty(self)
+
 		self.check_prev_docstatus()
 		
 		# Check for Approving Authority
@@ -492,8 +495,7 @@
 		self.make_gl_entries()
 				
 		self.update_against_document_in_jv()
-		
-		get_obj(dt = 'Purchase Common').update_prevdoc_detail(self, is_submit = 1)
+		purchase_controller.update_prevdoc_detail(self, is_submit = 1)
 
 
 	def make_gl_entries(self, is_cancel = 0):
diff --git a/accounts/doctype/sales_invoice/sales_invoice.js b/accounts/doctype/sales_invoice/sales_invoice.js
index 7c9b477..86dc3a5 100644
--- a/accounts/doctype/sales_invoice/sales_invoice.js
+++ b/accounts/doctype/sales_invoice/sales_invoice.js
@@ -264,13 +264,6 @@
 }
 
 
-//---- get customer details ----------------------------
-cur_frm.cscript.project_name = function(doc,cdt,cdn){
-	$c_obj(make_doclist(doc.doctype, doc.name),'pull_project_customer','', function(r,rt){
-		refresh_many(['customer', 'customer_name','customer_address', 'territory']);
-	});
-}
-
 //Set debit and credit to zero on adding new row
 //----------------------------------------------
 cur_frm.fields_dict['entries'].grid.onrowadd = function(doc, cdt, cdn){
diff --git a/accounts/doctype/sales_invoice/sales_invoice.py b/accounts/doctype/sales_invoice/sales_invoice.py
index 486bc0a..5042f53 100644
--- a/accounts/doctype/sales_invoice/sales_invoice.py
+++ b/accounts/doctype/sales_invoice/sales_invoice.py
@@ -320,13 +320,6 @@
 	def get_advances(self):
 		self.doclist = get_obj('GL Control').get_advances(self, self.doc.debit_to, 'Sales Invoice Advance', 'advance_adjustment_details', 'credit')
 
-	
-	def pull_project_customer(self):
-		res = webnotes.conn.sql("select customer from `tabProject` where name = '%s'" %
-		 	self.doc.project_name)
-		if res and res[0][0]:
-			get_obj('DocType Mapper', 'Project-Sales Invoice').dt_map('Project', 'Sales Invoice', self.doc.project_name, self.doc, self.doclist, "[['Project', 'Sales Invoice']]")
-
 	def get_company_abbr(self):
 		return webnotes.conn.sql("select abbr from tabCompany where name=%s", self.doc.company)[0][0]
 		
diff --git a/buying/doctype/purchase_common/purchase_common.js b/buying/doctype/purchase_common/purchase_common.js
index f4cfc29..519905a 100644
--- a/buying/doctype/purchase_common/purchase_common.js
+++ b/buying/doctype/purchase_common/purchase_common.js
@@ -280,21 +280,8 @@
 	cur_frm.cscript.calc_amount(doc, 5);
 }
 
-//==================== check if item table is blank ==============================================
-var is_item_table = function(doc,cdt,cdn) {
-	// Step 1 :=>Get all childrens/ rows from Detail Table
-	var cl = getchildren(tname, doc.name, fname);
-	// Step 2 :=> If there are no rows then set validated = false, this will stop further execution of code.
-	if (cl.length == 0) {
-		alert("There is no item in table"); validated = false;
-	}
-}
-
 //==================== Validate ====================================================================
 cur_frm.cscript.validate = function(doc, cdt, cdn) {
-	// Step 1:=> check if item table is blank
-	is_item_table(doc,cdt,cdn);
-	// Step 2:=> Calculate Amount
 	cur_frm.cscript.calc_amount(doc, 1);
 
 	// calculate advances if pv
diff --git a/buying/doctype/purchase_common/purchase_common.py b/buying/doctype/purchase_common/purchase_common.py
index e8b725e..bb34228 100644
--- a/buying/doctype/purchase_common/purchase_common.py
+++ b/buying/doctype/purchase_common/purchase_common.py
@@ -22,14 +22,14 @@
 from webnotes.model.doc import Document, addchild
 from webnotes.model.wrapper import getlist, copy_doclist
 from webnotes.model.code import get_obj
-from webnotes import form, msgprint
+from webnotes import form, msgprint, _
 
 sql = webnotes.conn.sql
 	
 from utilities.transaction_base import TransactionBase
 
 class DocType(TransactionBase):
-	def __init__(self, doc, doclist=[]):
+	def __init__(self, doc, doclist=None):
 		self.doc = doc
 		self.doclist = doclist
 
@@ -64,6 +64,11 @@
 
 		self.msg = []
 
+	def is_item_table_empty(self, obj):
+		if not len(obj.doclist.get({"parentfield": obj.fname})):
+			msgprint(_("Hey there! You need to put at least one item in \
+				the item table."), raise_exception=True)
+
 
 	def get_default_schedule_date( self, obj):
 		for d in getlist( obj.doclist, obj.fname):
diff --git a/buying/doctype/purchase_order/purchase_order.py b/buying/doctype/purchase_order/purchase_order.py
index 812f59c..85a11ed 100644
--- a/buying/doctype/purchase_order/purchase_order.py
+++ b/buying/doctype/purchase_order/purchase_order.py
@@ -220,10 +220,11 @@
 
 	# On Submit
 	def on_submit(self):
-		pc_obj = get_obj(dt ='Purchase Common')
+		purchase_controller = webnotes.get_obj("Purchase Common")
+		purchase_controller.is_item_table_empty(self)
 		
 		# Step 1 :=> Update Previous Doc i.e. update pending_qty and Status accordingly
-		pc_obj.update_prevdoc_detail(self, is_submit = 1)
+		purchase_controller.update_prevdoc_detail(self, is_submit = 1)
 
 		# Step 2 :=> Update Bin 
 		self.update_bin(is_submit = 1, is_stopped = 0)
@@ -236,7 +237,7 @@
 			"last_purchase_order", self.doc.name)
 
 		# Step 5 :=> Update last purchase rate
-		pc_obj.update_last_purchase_rate(self, is_submit = 1)
+		purchase_controller.update_last_purchase_rate(self, is_submit = 1)
 
 		# Step 6 :=> Set Status
 		webnotes.conn.set(self.doc,'status','Submitted')
diff --git a/buying/doctype/purchase_request/purchase_request.js b/buying/doctype/purchase_request/purchase_request.js
index 510762a..f46518f 100644
--- a/buying/doctype/purchase_request/purchase_request.js
+++ b/buying/doctype/purchase_request/purchase_request.js
@@ -50,22 +50,19 @@
 	erpnext.hide_naming_series();
 
 	if(doc.docstatus == 1 && doc.status != 'Stopped'){
+		cur_frm.add_custom_button("Make Supplier Quotation", cur_frm.cscript.make_supplier_quotation);
 		if(flt(doc.per_ordered, 2) < 100) {
 			cur_frm.add_custom_button('Make Purchase Order', cur_frm.cscript['Make Purchase Order']);
 			cur_frm.add_custom_button('Stop Purchase Request', cur_frm.cscript['Stop Purchase Request']);
 		}
 		cur_frm.add_custom_button('Send SMS', cur_frm.cscript.send_sms);
-		cur_frm.add_custom_button("Make Supplier Quotation", cur_frm.cscript.make_supplier_quotation);
+		
 	}
  
 	if(doc.docstatus == 1 && doc.status == 'Stopped')
 		cur_frm.add_custom_button('Unstop Purchase Request', cur_frm.cscript['Unstop Purchase Request'])
 }
 
-//======================= validation ===================================
-cur_frm.cscript.validate = function(doc,cdt,cdn){
-	is_item_table(doc,cdt,cdn);
-}
 //======================= transaction date =============================
 cur_frm.cscript.transaction_date = function(doc,cdt,cdn){
 	if(doc.__islocal){ 
diff --git a/buying/doctype/purchase_request/purchase_request.py b/buying/doctype/purchase_request/purchase_request.py
index 7d0e08e..3f7f932 100644
--- a/buying/doctype/purchase_request/purchase_request.py
+++ b/buying/doctype/purchase_request/purchase_request.py
@@ -178,6 +178,9 @@
 				get_obj('Warehouse', d.warehouse).update_bin(args)		
 		
 	def on_submit(self):
+		purchase_controller = webnotes.get_obj("Purchase Common")
+		purchase_controller.is_item_table_empty(self)
+		
 		webnotes.conn.set(self.doc,'status','Submitted')
 		self.update_bin(is_submit = 1, is_stopped = 0)
 	
diff --git a/buying/doctype/supplier_quotation/supplier_quotation.py b/buying/doctype/supplier_quotation/supplier_quotation.py
index e5861e5..cac4bab 100644
--- a/buying/doctype/supplier_quotation/supplier_quotation.py
+++ b/buying/doctype/supplier_quotation/supplier_quotation.py
@@ -36,6 +36,9 @@
 		self.doc.status = "Draft"
 
 	def on_submit(self):
+		purchase_controller = webnotes.get_obj("Purchase Common")
+		purchase_controller.is_item_table_empty(self)
+		
 		webnotes.conn.set(self.doc, "status", "Submitted")
 
 	def on_cancel(self):
diff --git a/patches/december_2012/remove_project_mapper.py b/patches/december_2012/remove_project_mapper.py
new file mode 100644
index 0000000..39aae6b
--- /dev/null
+++ b/patches/december_2012/remove_project_mapper.py
@@ -0,0 +1,6 @@
+import webnotes
+
+def execute():
+	from webnotes.model import delete_doc
+	for d in ["Project-Sales Order", "Project-Delivery Note", "Project-Sales Invoice"]:
+		delete_doc("DocType Mapper", d)
\ No newline at end of file
diff --git a/patches/patch_list.py b/patches/patch_list.py
index 17334d9..7ff4611 100644
--- a/patches/patch_list.py
+++ b/patches/patch_list.py
@@ -566,4 +566,8 @@
 		'patch_file': 'delete_form16_print_format',
 >>>>>>> a85b2e4ee349c544acb7a1949351e9a7c70f7b7c
 	},
+	{
+		'patch_module': 'patches.december_2012',
+		'patch_file': 'remove_project_mapper',
+	},
 ]
\ No newline at end of file
diff --git a/selling/DocType Mapper/Project-Sales Order/Project-Sales Order.txt b/selling/DocType Mapper/Project-Sales Order/Project-Sales Order.txt
deleted file mode 100644
index 0d4a5a3..0000000
--- a/selling/DocType Mapper/Project-Sales Order/Project-Sales Order.txt
+++ /dev/null
@@ -1,49 +0,0 @@
-[
- {
-  "owner": "ashwini@webnotestech.com", 
-  "docstatus": 0, 
-  "creation": "2010-09-01 15:47:59", 
-  "modified_by": "Administrator", 
-  "modified": "2011-09-15 15:04:43"
- }, 
- {
-  "match_id": 0, 
-  "parent": "Project-Sales Order", 
-  "name": "__common__", 
-  "doctype": "Table Mapper Detail", 
-  "parenttype": "DocType Mapper", 
-  "from_table": "Project", 
-  "to_table": "Sales Order", 
-  "validation_logic": "name is not null", 
-  "parentfield": "table_mapper_details"
- }, 
- {
-  "map": "Yes", 
-  "match_id": 0, 
-  "parent": "Project-Sales Order", 
-  "name": "__common__", 
-  "to_field": "customer", 
-  "doctype": "Field Mapper Detail", 
-  "parenttype": "DocType Mapper", 
-  "checking_operator": "=", 
-  "from_field": "customer", 
-  "parentfield": "field_mapper_details"
- }, 
- {
-  "name": "__common__", 
-  "to_doctype": "Sales Order", 
-  "module": "Selling", 
-  "doctype": "DocType Mapper", 
-  "from_doctype": "Project"
- }, 
- {
-  "name": "Project-Sales Order", 
-  "doctype": "DocType Mapper"
- }, 
- {
-  "doctype": "Field Mapper Detail"
- }, 
- {
-  "doctype": "Table Mapper Detail"
- }
-]
\ No newline at end of file
diff --git a/selling/doctype/lead/lead_list.js b/selling/doctype/lead/lead_list.js
index 21f0ffd..cfbfc36 100644
--- a/selling/doctype/lead/lead_list.js
+++ b/selling/doctype/lead/lead_list.js
@@ -20,7 +20,8 @@
 			data.label_type = 'info'
 		}
 		data.status_html = repl('<span class="label label-%(label_type)s">%(status)s</span>', data);
-		data.lead_name = repl("<a href=\"#!Form/Lead/%(name)s\">%(name)s: %(lead_name)s</a>",
+		data.lead_name = repl("<a href=\"#!Form/Lead/%(name)s\" \
+			title=\"%(name)s: %(lead_name)s\">%(name)s: %(lead_name)s</a>",
 			data);
 		data.lead_status = (data.rating ? ('['+data.rating+'] ') : '') + '['+data.source+']';
 	},
@@ -28,10 +29,11 @@
 	columns: [
 		{width: '3%', content: 'check'},
 		{width: '5%', content:'avatar_modified'},
-		{width: '30%', content:'lead_name'},
-		{width: '12%', content:'status_html'},
-		{width: '15%', content:'lead_status+tags', css: {color:'#222'}},
-		{width: '23%', content: 'company_name'},
+		{width: '30%', content:'lead_name', title: "Lead Name"},
+		{width: '12%', content:'status_html', title: "Status"},
+		{width: '25%', content: 'company_name', title: "Company"},
+		{width: '13%', content:'lead_status+tags', css: {color:'#222'},
+			title: "More Info"},
 		{width: '12%', content:'modified', css: {'text-align': 'right', 'color':'#777'}}
 	]
 })
diff --git a/selling/doctype/sales_order/sales_order.js b/selling/doctype/sales_order/sales_order.js
index 17c8d09..a3b71b4 100644
--- a/selling/doctype/sales_order/sales_order.js
+++ b/selling/doctype/sales_order/sales_order.js
@@ -178,19 +178,11 @@
 	var cond = '';
 	if(doc.customer) cond = '(`tabProject`.customer = "'+doc.customer+'" OR IFNULL(`tabProject`.customer,"")="") AND';
 	return repl('SELECT `tabProject`.name FROM `tabProject` \
-	WHERE `tabProject`.status not in ("Completed", "Cancelled") \
-	AND %(cond)s `tabProject`.name LIKE "%s" ORDER BY `tabProject`.name ASC LIMIT 50', {cond:cond});
+		WHERE `tabProject`.status not in ("Completed", "Cancelled") \
+		AND %(cond)s `tabProject`.name LIKE "%s" \
+		ORDER BY `tabProject`.name ASC LIMIT 50', {cond:cond});
 }
 
-//---- get customer details ----------------------------
-cur_frm.cscript.project_name = function(doc,cdt,cdn){
-	$c_obj(make_doclist(doc.doctype, doc.name),'pull_project_customer','', function(r,rt){
-		refresh_many(['customer','customer_name', 'customer_address', 'contact_person', 'territory', 'contact_no', 'email_id', 'customer_group']);
-	});
-	
-}
-
-
 
 // *************** Customized link query for QUOTATION ***************************** 
 cur_frm.fields_dict['quotation_no'].get_query = function(doc) {
diff --git a/selling/doctype/sales_order/sales_order.py b/selling/doctype/sales_order/sales_order.py
index f024efc..e0ac2ff 100644
--- a/selling/doctype/sales_order/sales_order.py
+++ b/selling/doctype/sales_order/sales_order.py
@@ -39,10 +39,6 @@
 		self.partner_tname = 'Partner Target Detail'
 		self.territory_tname = 'Territory Target Detail'
 		
-# DOCTYPE TRIGGER FUNCTIONS
-# =============================
-	# Pull Quotation Items
-	# -----------------------
 	def pull_quotation_details(self):
 		self.doclist = self.doc.clear_table(self.doclist, 'other_charges')
 		self.doclist = self.doc.clear_table(self.doclist, 'sales_order_details')
@@ -55,29 +51,12 @@
 
 		return cstr(self.doc.quotation_no)
 	
-	#pull project customer
-	#-------------------------
-	def pull_project_customer(self):
-		res = sql("select customer from `tabProject` where name = '%s'"%self.doc.project_name)
-		if res and res[0][0]:
-			get_obj('DocType Mapper', 'Project-Sales Order').dt_map('Project', 'Sales Order', self.doc.project_name, self.doc, self.doclist, "[['Project', 'Sales Order']]")
-			
-	
-	# Get contact person details based on customer selected
-	# ------------------------------------------------------
 	def get_contact_details(self):
 		get_obj('Sales Common').get_contact_details(self,0)
 
-	# Get Commission rate of Sales Partner
-	# -------------------------------------
 	def get_comm_rate(self, sales_partner):
 		return get_obj('Sales Common').get_comm_rate(sales_partner, self)
 
-
-# SALES ORDER DETAILS TRIGGER FUNCTIONS
-# ================================================================================
-	# Get Item Details
-	# ----------------
 	def get_item_details(self, args=None):
 		import json
 		args = args and json.loads(args) or {}
@@ -94,45 +73,24 @@
 						if not doc.fields.get(r):
 							doc.fields[r] = ret[r]					
 
-
-	# Re-calculates Basic Rate & amount based on Price List Selected
-	# --------------------------------------------------------------
 	def get_adj_percent(self, arg=''):
 		get_obj('Sales Common').get_adj_percent(self)
 
-
-
-	# Get projected qty of item based on warehouse selected
-	# -----------------------------------------------------
 	def get_available_qty(self,args):
 		return get_obj('Sales Common').get_available_qty(eval(args))
 	
-# OTHER CHARGES TRIGGER FUNCTIONS
-# ====================================================================================
-	
-	# Get Tax rate if account type is TAX
-	# ------------------------------------
 	def get_rate(self,arg):
 		return get_obj('Sales Common').get_rate(arg)
 
-	# Load Default Charges
-	# ----------------------------------------------------------
 	def load_default_taxes(self):
 		self.doclist = get_obj('Sales Common').load_default_taxes(self)
 
-	# Pull details from other charges master (Get Sales Taxes and Charges Master)
-	# ----------------------------------------------------------
 	def get_other_charges(self):
 		self.doclist = get_obj('Sales Common').get_other_charges(self)
  
- 
-# GET TERMS & CONDITIONS
-# =====================================================================================
 	def get_tc_details(self):
 		return get_obj('Sales Common').get_tc_details(self)
 
-#check if maintenance schedule already generated
-#============================================
 	def check_maintenance_schedule(self):
 		nm = sql("select t1.name from `tabMaintenance Schedule` t1, `tabMaintenance Schedule Item` t2 where t2.parent=t1.name and t2.prevdoc_docname=%s and t1.docstatus=1", self.doc.name)
 		nm = nm and nm[0][0] or ''
@@ -140,8 +98,6 @@
 		if not nm:
 			return 'No'
 
-#check if maintenance visit already generated
-#============================================
 	def check_maintenance_visit(self):
 		nm = sql("select t1.name from `tabMaintenance Visit` t1, `tabMaintenance Visit Purpose` t2 where t2.parent=t1.name and t2.prevdoc_docname=%s and t1.docstatus=1 and t1.completion_status='Fully Completed'", self.doc.name)
 		nm = nm and nm[0][0] or ''
@@ -149,20 +105,12 @@
 		if not nm:
 			return 'No'
 
-# VALIDATE
-# =====================================================================================
-	# Fiscal Year Validation
-	# ----------------------
 	def validate_fiscal_year(self):
 		get_obj('Sales Common').validate_fiscal_year(self.doc.fiscal_year,self.doc.transaction_date,'Sales Order Date')
 	
-	# Validate values with reference document
-	#----------------------------------------
 	def validate_reference_value(self):
 		get_obj('DocType Mapper', 'Quotation-Sales Order', with_children = 1).validate_reference_value(self, self.doc.name)
 
-	# Validate Mandatory
-	# -------------------
 	def validate_mandatory(self):
 		# validate transaction date v/s delivery date
 		if self.doc.delivery_date:
@@ -174,9 +122,6 @@
 			msgprint("Please Enter Amendment Date")
 			raise Exception
 	
-
-	# Validate P.O Date
-	# ------------------
 	def validate_po(self):
 		# validate p.o date v/s delivery date
 		if self.doc.po_date and self.doc.delivery_date and getdate(self.doc.po_date) > getdate(self.doc.delivery_date):
@@ -191,8 +136,6 @@
 				msgprint("""Another Sales Order (%s) exists against same PO No and Customer. 
 					Please be sure, you are not making duplicate entry.""" % so[0][0])
 	
-	# Validations of Details Table
-	# -----------------------------
 	def validate_for_items(self):
 		check_list, flag = [], 0
 		chk_dupl_itm = []
@@ -237,8 +180,6 @@
 		if getlist(self.doclist, 'sales_order_details') and self.doc.quotation_no and flag == 0:
 			msgprint("There are no items of the quotation selected", raise_exception=1)
 
-	# validate sales/ maintenance quotation against order type
-	#------------------------------------------------------------------
 	def validate_sales_mntc_quotation(self):
 		for d in getlist(self.doclist, 'sales_order_details'):
 			if d.prevdoc_docname:
@@ -255,18 +196,13 @@
 		
 		self.validate_sales_mntc_quotation()
 
-	#check for does customer belong to same project as entered..
-	#-------------------------------------------------------------------------------------------------
 	def validate_proj_cust(self):
 		if self.doc.project_name and self.doc.customer_name:
 			res = sql("select name from `tabProject` where name = '%s' and (customer = '%s' or ifnull(customer,'')='')"%(self.doc.project_name, self.doc.customer))
 			if not res:
 				msgprint("Customer - %s does not belong to project - %s. \n\nIf you want to use project for multiple customers then please make customer details blank in project - %s."%(self.doc.customer,self.doc.project_name,self.doc.project_name))
 				raise Exception
-			 
-
-	# Validate
-	# ---------
+	
 	def validate(self):
 		self.validate_fiscal_year()
 		self.validate_order_type()
@@ -295,11 +231,6 @@
 		if not self.doc.billing_status: self.doc.billing_status = 'Not Billed'
 		if not self.doc.delivery_status: self.doc.delivery_status = 'Not Delivered'
 		
-
-# ON SUBMIT
-# ===============================================================================================
-	# Checks Quotation Status
-	# ------------------------
 	def check_prev_docstatus(self):
 		for d in getlist(self.doclist, 'sales_order_details'):
 			cancel_quo = sql("select name from `tabQuotation` where docstatus = 2 and name = '%s'" % d.prevdoc_docname)
@@ -312,8 +243,6 @@
 		if enq:
 			sql("update `tabOpportunity` set status = %s where name=%s",(flag,enq[0][0]))
 
-	#update status of quotation, enquiry
-	#----------------------------------------
 	def update_prevdoc_status(self, flag):
 		for d in getlist(self.doclist, 'sales_order_details'):
 			if d.prevdoc_docname:
@@ -354,8 +283,6 @@
 		
 		webnotes.conn.set(self.doc, 'status', 'Cancelled')
 		
-	# does not allow to cancel document if DN or RV made against it is SUBMITTED 
-	# ----------------------------------------------------------------------------
 	def check_nextdoc_docstatus(self):
 		# Checks Delivery Note
 		submit_dn = sql("select t1.name from `tabDelivery Note` t1,`tabDelivery Note Item` t2 where t1.name = t2.parent and t2.prevdoc_docname = '%s' and t1.docstatus = 1" % (self.doc.name))
diff --git a/stock/DocType Mapper/Project-Delivery Note/Project-Delivery Note.txt b/stock/DocType Mapper/Project-Delivery Note/Project-Delivery Note.txt
deleted file mode 100644
index 6bc90f4..0000000
--- a/stock/DocType Mapper/Project-Delivery Note/Project-Delivery Note.txt
+++ /dev/null
@@ -1,49 +0,0 @@
-[
- {
-  "owner": "harshada@webnotestech.com", 
-  "docstatus": 0, 
-  "creation": "2010-09-01 15:47:59", 
-  "modified_by": "Administrator", 
-  "modified": "2011-09-15 15:04:43"
- }, 
- {
-  "match_id": 0, 
-  "parent": "Project-Delivery Note", 
-  "name": "__common__", 
-  "doctype": "Table Mapper Detail", 
-  "parenttype": "DocType Mapper", 
-  "from_table": "Project", 
-  "to_table": "Delivery Note", 
-  "validation_logic": "name is not null", 
-  "parentfield": "table_mapper_details"
- }, 
- {
-  "map": "Yes", 
-  "match_id": 0, 
-  "parent": "Project-Delivery Note", 
-  "name": "__common__", 
-  "to_field": "customer", 
-  "doctype": "Field Mapper Detail", 
-  "parenttype": "DocType Mapper", 
-  "checking_operator": "=", 
-  "from_field": "customer", 
-  "parentfield": "field_mapper_details"
- }, 
- {
-  "name": "__common__", 
-  "to_doctype": "Delivery Note", 
-  "module": "Stock", 
-  "doctype": "DocType Mapper", 
-  "from_doctype": "Project"
- }, 
- {
-  "name": "Project-Delivery Note", 
-  "doctype": "DocType Mapper"
- }, 
- {
-  "doctype": "Field Mapper Detail"
- }, 
- {
-  "doctype": "Table Mapper Detail"
- }
-]
\ No newline at end of file
diff --git a/stock/doctype/delivery_note/delivery_note.py b/stock/doctype/delivery_note/delivery_note.py
index ef22437..af4d91e 100644
--- a/stock/doctype/delivery_note/delivery_note.py
+++ b/stock/doctype/delivery_note/delivery_note.py
@@ -78,13 +78,6 @@
 	def get_tc_details(self):
 		return get_obj('Sales Common').get_tc_details(self)
 
-
-	def pull_project_customer(self):
-		res = sql("select customer from `tabProject` where name = '%s'" % self.doc.project_name)
-		if res and res[0][0]:
-			get_obj('DocType Mapper', 'Project-Delivery Note').dt_map('Project', 'Delivery Note', self.doc.project_name, self.doc, self.doclist, "[['Project', 'Delivery Note']]")
-
-
 	def get_item_details(self, args=None):
 		import json
 		args = args and json.loads(args) or {}
diff --git a/stock/doctype/purchase_receipt/purchase_receipt.py b/stock/doctype/purchase_receipt/purchase_receipt.py
index e5e1fe1..5e60753 100644
--- a/stock/doctype/purchase_receipt/purchase_receipt.py
+++ b/stock/doctype/purchase_receipt/purchase_receipt.py
@@ -284,15 +284,17 @@
 
 	# on submit
 	def on_submit(self):
+		purchase_controller = webnotes.get_obj("Purchase Common")
+		purchase_controller.is_item_table_empty(self)
+
 		# Check for Approving Authority
 		get_obj('Authorization Control').validate_approving_authority(self.doc.doctype, self.doc.company, self.doc.grand_total)
 
 		# Set status as Submitted
 		webnotes.conn.set(self.doc,'status', 'Submitted')
-		pc_obj = get_obj('Purchase Common')
 
 		# Update Previous Doc i.e. update pending_qty and Status accordingly
-		pc_obj.update_prevdoc_detail(self, is_submit = 1)
+		purchase_controller.update_prevdoc_detail(self, is_submit = 1)
 
 		# Update Serial Record
 		get_obj('Stock Ledger').update_serial_record(self, 'purchase_receipt_details', is_submit = 1, is_incoming = 1)
@@ -301,7 +303,7 @@
 		self.update_stock(is_submit = 1)
 
 		# Update last purchase rate
-		pc_obj.update_last_purchase_rate(self, 1)
+		purchase_controller.update_last_purchase_rate(self, 1)