[Delivery Note] Moved prevdoc to Sales Order and Sales Invoice so links will work webnotes/erpnext#868
diff --git a/accounts/doctype/sales_invoice/sales_invoice.py b/accounts/doctype/sales_invoice/sales_invoice.py
index 2eb9ae8..1dca77b 100644
--- a/accounts/doctype/sales_invoice/sales_invoice.py
+++ b/accounts/doctype/sales_invoice/sales_invoice.py
@@ -965,8 +965,7 @@
 			"doctype": "Delivery Note Item", 
 			"field_map": {
 				"name": "prevdoc_detail_docname", 
-				"parent": "prevdoc_docname", 
-				"parenttype": "prevdoc_doctype",
+				"parent": "against_sales_invoice", 
 				"serial_no": "serial_no"
 			},
 			"postprocess": update_item
diff --git a/patches/october_2013/p01_update_delivery_note_prevdocs.py b/patches/october_2013/p01_update_delivery_note_prevdocs.py
new file mode 100644
index 0000000..b1a16c2
--- /dev/null
+++ b/patches/october_2013/p01_update_delivery_note_prevdocs.py
@@ -0,0 +1,12 @@
+# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd.
+# License: GNU General Public License v3. See license.txt
+
+from __future__ import unicode_literals
+import webnotes
+
+def execute():
+	webnotes.conn.sql("""update `tabDelivery Note Item` set against_sales_order=prevdoc_docname
+		where prevdoc_doctype='Sales Order' """)
+		
+	webnotes.conn.sql("""update `tabDelivery Note Item` set against_sales_invoice=prevdoc_docname
+		where prevdoc_doctype='Sales Invoice' """)
\ No newline at end of file
diff --git a/patches/patch_list.py b/patches/patch_list.py
index f228acf..e19afda 100644
--- a/patches/patch_list.py
+++ b/patches/patch_list.py
@@ -220,4 +220,5 @@
 	"patches.september_2013.p04_unsubmit_serial_nos",
 	"patches.september_2013.p05_fix_customer_in_pos",
 	"patches.october_2013.fix_is_cancelled_in_sle",
+	"patches.october_2013.p01_update_delivery_note_prevdocs",
 ]
\ No newline at end of file
diff --git a/selling/doctype/sales_common/sales_common.py b/selling/doctype/sales_common/sales_common.py
index 8271c82..df7f151 100644
--- a/selling/doctype/sales_common/sales_common.py
+++ b/selling/doctype/sales_common/sales_common.py
@@ -123,12 +123,12 @@
 				if flt(d.qty) > flt(d.delivered_qty):
 					reserved_qty_for_main_item = flt(d.qty) - flt(d.delivered_qty)
 				
-			if obj.doc.doctype == "Delivery Note" and d.prevdoc_doctype == 'Sales Order':
+			if obj.doc.doctype == "Delivery Note" and d.against_sales_order:
 				# if SO qty is 10 and there is tolerance of 20%, then it will allow DN of 12.
 				# But in this case reserved qty should only be reduced by 10 and not 12
 				
 				already_delivered_qty = self.get_already_delivered_qty(obj.doc.name, 
-					d.prevdoc_docname, d.prevdoc_detail_docname)
+					d.against_sales_order, d.prevdoc_detail_docname)
 				so_qty, reserved_warehouse = self.get_so_qty_and_warehouse(d.prevdoc_detail_docname)
 				
 				if already_delivered_qty + d.qty > so_qty:
@@ -168,7 +168,7 @@
 	def get_already_delivered_qty(self, dn, so, so_detail):
 		qty = webnotes.conn.sql("""select sum(qty) from `tabDelivery Note Item` 
 			where prevdoc_detail_docname = %s and docstatus = 1 
-			and prevdoc_doctype = 'Sales Order' and prevdoc_docname = %s 
+			and against_sales_order = %s 
 			and parent != %s""", (so_detail, so, dn))
 		return qty and flt(qty[0][0]) or 0.0
 
@@ -218,7 +218,6 @@
 		pi.qty = flt(qty)
 		pi.actual_qty = bin and flt(bin['actual_qty']) or 0
 		pi.projected_qty = bin and flt(bin['projected_qty']) or 0
-		pi.prevdoc_doctype = line.prevdoc_doctype
 		if not pi.warehouse:
 			pi.warehouse = warehouse
 		if not pi.batch_no:
@@ -283,8 +282,8 @@
 	def check_stop_sales_order(self,obj):
 		for d in getlist(obj.doclist,obj.fname):
 			ref_doc_name = ''
-			if d.fields.has_key('prevdoc_docname') and d.prevdoc_docname and d.prevdoc_doctype == 'Sales Order':
-				ref_doc_name = d.prevdoc_docname
+			if d.fields.has_key('against_sales_order') and d.against_sales_order:
+				ref_doc_name = d.against_sales_order
 			elif d.fields.has_key('sales_order') and d.sales_order and not d.delivery_note:
 				ref_doc_name = d.sales_order
 			if ref_doc_name:
@@ -321,14 +320,22 @@
 
 	def get_prevdoc_date(self, obj):
 		for d in getlist(obj.doclist, obj.fname):
-			if d.prevdoc_doctype and d.prevdoc_docname:
-				if d.prevdoc_doctype in ["Sales Invoice", "Delivery Note"]:
+			date_field = None
+
+			pdoctype, pname = d.prevdoc_doctype, d.prevdoc_docname
+
+			if d.against_sales_invoice:
+				pdoctype, pname = "Sales Invoice", d.against_sales_invoice
+			elif d.against_sales_order:
+				pdoctype, pname = "Sales Order", d.against_sales_order
+
+			if pdoctype and pname:
+				if pdoctype in ["Sales Invoice", "Delivery Note"]:
 					date_field = "posting_date"
 				else:
 					date_field = "transaction_date"
-					
-				d.prevdoc_date = webnotes.conn.get_value(d.prevdoc_doctype, 
-					d.prevdoc_docname, date_field)
+
+				d.prevdoc_date = webnotes.conn.get_value(pdoctype, pname, date_field)
 
 def get_batch_no(doctype, txt, searchfield, start, page_len, filters):
 	from controllers.queries import get_match_cond
diff --git a/selling/doctype/sales_order/sales_order.py b/selling/doctype/sales_order/sales_order.py
index 4056742..8fc728f 100644
--- a/selling/doctype/sales_order/sales_order.py
+++ b/selling/doctype/sales_order/sales_order.py
@@ -341,8 +341,7 @@
 			"field_map": {
 				"export_rate": "export_rate", 
 				"name": "prevdoc_detail_docname", 
-				"parent": "prevdoc_docname", 
-				"parenttype": "prevdoc_doctype", 
+				"parent": "against_sales_order", 
 				"reserved_warehouse": "warehouse"
 			},
 			"postprocess": update_item,
diff --git a/selling/doctype/sales_order/test_sales_order.py b/selling/doctype/sales_order/test_sales_order.py
index 7b72271..8bd759a 100644
--- a/selling/doctype/sales_order/test_sales_order.py
+++ b/selling/doctype/sales_order/test_sales_order.py
@@ -74,8 +74,7 @@
 		from stock.doctype.delivery_note.test_delivery_note import test_records as dn_test_records
 		dn = webnotes.bean(webnotes.copy_doclist(dn_test_records[0]))
 		dn.doclist[1].item_code = so.doclist[1].item_code
-		dn.doclist[1].prevdoc_doctype = "Sales Order"
-		dn.doclist[1].prevdoc_docname = so.doc.name
+		dn.doclist[1].against_sales_order = so.doc.name
 		dn.doclist[1].prevdoc_detail_docname = so.doclist[1].name
 		if delivered_qty:
 			dn.doclist[1].qty = delivered_qty
diff --git a/stock/doctype/delivery_note/delivery_note.js b/stock/doctype/delivery_note/delivery_note.js
index 84e65da..edfd6ff 100644
--- a/stock/doctype/delivery_note/delivery_note.js
+++ b/stock/doctype/delivery_note/delivery_note.js
@@ -22,7 +22,7 @@
 			var from_sales_invoice = false;
 			from_sales_invoice = cur_frm.get_doclist({parentfield: "delivery_note_details"})
 				.some(function(item) { 
-					return item.prevdoc_doctype==="Sales Invoice" ? true : false; 
+					return item.against_sales_invoice ? true : false; 
 				});
 			
 			if(!from_sales_invoice)
@@ -181,12 +181,12 @@
 	if(cl.length){
 		prevdoc_list = new Array();
 		for(var i=0;i<cl.length;i++){
-			if(cl[i].prevdoc_doctype == 'Sales Order' && cl[i].prevdoc_docname && prevdoc_list.indexOf(cl[i].prevdoc_docname) == -1) {
-				prevdoc_list.push(cl[i].prevdoc_docname);
+			if(cl[i].against_sales_order && prevdoc_list.indexOf(cl[i].against_sales_order) == -1) {
+				prevdoc_list.push(cl[i].against_sales_order);
 				if(prevdoc_list.length ==1)
-					out += make_row(cl[i].prevdoc_doctype, cl[i].prevdoc_docname, cl[i].prevdoc_date,0);
+					out += make_row("Sales Order", cl[i].against_sales_order, cl[i].prevdoc_date, 0);
 				else
-					out += make_row('', cl[i].prevdoc_docname, cl[i].prevdoc_date,0);
+					out += make_row('', cl[i].against_sales_order, cl[i].prevdoc_date,0);
 			}
 		}
 	}
diff --git a/stock/doctype/delivery_note/delivery_note.py b/stock/doctype/delivery_note/delivery_note.py
index e5e412e..b27d034 100644
--- a/stock/doctype/delivery_note/delivery_note.py
+++ b/stock/doctype/delivery_note/delivery_note.py
@@ -28,7 +28,7 @@
 			'target_parent_field': 'per_delivered',
 			'target_ref_field': 'qty',
 			'source_field': 'qty',
-			'percent_join_field': 'prevdoc_docname',
+			'percent_join_field': 'against_sales_order',
 			'status_field': 'delivery_status',
 			'keyword': 'Delivered'
 		}]
@@ -73,7 +73,7 @@
 		"""check in manage account if sales order required or not"""
 		if webnotes.conn.get_value("Selling Settings", None, 'so_required') == 'Yes':
 			 for d in getlist(self.doclist,'delivery_note_details'):
-				 if not d.prevdoc_docname:
+				 if not d.against_sales_order:
 					 msgprint("Sales Order No. required against item %s"%d.item_code)
 					 raise Exception
 
@@ -106,26 +106,27 @@
 		if not self.doc.installation_status: self.doc.installation_status = 'Not Installed'	
 		
 	def validate_with_previous_doc(self):
-		prev_doctype = [d.prevdoc_doctype for d in self.doclist.get({
-			"parentfield": "delivery_note_details"}) if cstr(d.prevdoc_doctype) != ""]
-			
-		if prev_doctype:
-			super(DocType, self).validate_with_previous_doc(self.tname, {
-				prev_doctype[0]: {
-					"ref_dn_field": "prevdoc_docname",
-					"compare_fields": [["customer", "="], ["company", "="], ["project_name", "="],
-						["currency", "="]],
-				},
-			})
-			if cint(webnotes.defaults.get_global_default('maintain_same_sales_rate')):
+		items = self.doclist.get({"parentfield": "delivery_note_details"})
+		
+		for fn in (("Sales Order", "against_sales_order"), ("Sales Invoice", "against_sales_invoice")):
+			if items.get_distinct_values(fn[1]):
 				super(DocType, self).validate_with_previous_doc(self.tname, {
-					prev_doctype[0] + " Item": {
-						"ref_dn_field": "prevdoc_detail_docname",
-						"compare_fields": [["export_rate", "="]],
-						"is_child_table": True
-					}
+					fn[0]: {
+						"ref_dn_field": fn[1],
+						"compare_fields": [["customer", "="], ["company", "="], ["project_name", "="],
+							["currency", "="]],
+					},
 				})
-			
+
+				if cint(webnotes.defaults.get_global_default('maintain_same_sales_rate')):
+					super(DocType, self).validate_with_previous_doc(self.tname, {
+						fn[0] + " Item": {
+							"ref_dn_field": "prevdoc_detail_docname",
+							"compare_fields": [["export_rate", "="]],
+							"is_child_table": True
+						}
+					})
+						
 	def validate_proj_cust(self):
 		"""check for does customer belong to same project as entered.."""
 		if self.doc.project_name and self.doc.customer:
@@ -137,8 +138,8 @@
 	def validate_for_items(self):
 		check_list, chk_dupl_itm = [], []
 		for d in getlist(self.doclist,'delivery_note_details'):
-			e = [d.item_code, d.description, d.warehouse, d.prevdoc_docname or '', d.batch_no or '']
-			f = [d.item_code, d.description, d.prevdoc_docname or '']
+			e = [d.item_code, d.description, d.warehouse, d.against_sales_order or d.against_sales_invoice, d.batch_no or '']
+			f = [d.item_code, d.description, d.against_sales_order or d.against_sales_invoice]
 
 			if webnotes.conn.get_value("Item", d.item_code, "is_stock_item") == 'Yes':
 				if e in check_list:
@@ -323,7 +324,7 @@
 		"""check credit limit of items in DN Detail which are not fetched from sales order"""
 		amount, total = 0, 0
 		for d in getlist(self.doclist, 'delivery_note_details'):
-			if not d.prevdoc_docname:
+			if not (d.against_sales_order or d.against_sales_invoice):
 				amount += d.amount
 		if amount != 0:
 			total = (amount/self.doc.net_total)*self.doc.grand_total
@@ -375,7 +376,7 @@
 				"name": "dn_detail", 
 				"parent": "delivery_note", 
 				"prevdoc_detail_docname": "so_detail", 
-				"prevdoc_docname": "sales_order", 
+				"against_sales_order": "sales_order", 
 				"serial_no": "serial_no"
 			},
 			"postprocess": update_item
diff --git a/stock/doctype/delivery_note_item/delivery_note_item.txt b/stock/doctype/delivery_note_item/delivery_note_item.txt
index b74c33a..4162187 100644
--- a/stock/doctype/delivery_note_item/delivery_note_item.txt
+++ b/stock/doctype/delivery_note_item/delivery_note_item.txt
@@ -2,7 +2,7 @@
  {
   "creation": "2013-04-22 13:15:44", 
   "docstatus": 0, 
-  "modified": "2013-08-29 16:58:16", 
+  "modified": "2013-10-03 11:09:48", 
   "modified_by": "Administrator", 
   "owner": "Administrator"
  }, 
@@ -350,35 +350,17 @@
  }, 
  {
   "doctype": "DocField", 
-  "fieldname": "prevdoc_doctype", 
-  "fieldtype": "Data", 
-  "hidden": 1, 
-  "in_filter": 1, 
-  "label": "Document Type", 
-  "no_copy": 1, 
-  "oldfieldname": "prevdoc_doctype", 
-  "oldfieldtype": "Data", 
-  "print_hide": 1, 
-  "print_width": "150px", 
-  "read_only": 1, 
-  "search_index": 1, 
-  "width": "150px"
+  "fieldname": "against_sales_order", 
+  "fieldtype": "Link", 
+  "label": "Against Sales Order", 
+  "options": "Sales Order"
  }, 
  {
   "doctype": "DocField", 
-  "fieldname": "prevdoc_docname", 
-  "fieldtype": "Data", 
-  "hidden": 0, 
-  "in_filter": 1, 
-  "label": "Against Document No", 
-  "no_copy": 1, 
-  "oldfieldname": "prevdoc_docname", 
-  "oldfieldtype": "Data", 
-  "print_hide": 1, 
-  "print_width": "150px", 
-  "read_only": 1, 
-  "search_index": 1, 
-  "width": "150px"
+  "fieldname": "against_sales_invoice", 
+  "fieldtype": "Link", 
+  "label": "Against Sales Invoice", 
+  "options": "Sales Invoice"
  }, 
  {
   "doctype": "DocField", 
@@ -421,6 +403,17 @@
   "read_only": 1
  }, 
  {
+  "doctype": "DocField", 
+  "fieldname": "buying_amount", 
+  "fieldtype": "Currency", 
+  "hidden": 1, 
+  "label": "Buying Amount", 
+  "no_copy": 1, 
+  "options": "Company:company:default_currency", 
+  "print_hide": 1, 
+  "read_only": 1
+ }, 
+ {
   "allow_on_submit": 1, 
   "doctype": "DocField", 
   "fieldname": "page_break", 
diff --git a/stock/doctype/stock_entry/stock_entry.py b/stock/doctype/stock_entry/stock_entry.py
index de5636f..535d4c8 100644
--- a/stock/doctype/stock_entry/stock_entry.py
+++ b/stock/doctype/stock_entry/stock_entry.py
@@ -895,8 +895,7 @@
 		ref.doclist[0].name)
 	
 	if not invoices_against_delivery:
-		sales_orders_against_delivery = [d.prevdoc_docname for d in 
-			ref.doclist.get({"prevdoc_doctype": "Sales Order"}) if d.prevdoc_docname]
+		sales_orders_against_delivery = [d.against_sales_order for d in ref.doclist if d.against_sales_order]
 		
 		if sales_orders_against_delivery:
 			invoices_against_delivery = get_invoice_list("Sales Invoice Item", "sales_order",