Packing slip issues fixed and modified print format
diff --git a/erpnext/patches/packing_slip.py b/erpnext/patches/packing_slip.py
new file mode 100644
index 0000000..b6c94c0
--- /dev/null
+++ b/erpnext/patches/packing_slip.py
@@ -0,0 +1,7 @@
+def execute():
+	from webnotes.modules.module_manager import reload_doc
+	reload_doc('stock', 'doctype', 'delivery_note_detail')
+	reload_doc('stock', 'Print Format', 'Delivery Note Packing List Wise')
+	
+	webnotes.conn.sql("delete from `tabDocField` where fieldname in ('packed_by', 'packing_checked_by', 'pack_size') and parent = 'Delivery Note'")
+	
diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.py b/erpnext/stock/doctype/delivery_note/delivery_note.py
index b49f80c..ea8c648 100644
--- a/erpnext/stock/doctype/delivery_note/delivery_note.py
+++ b/erpnext/stock/doctype/delivery_note/delivery_note.py
@@ -443,33 +443,80 @@
 	# ==========================================
 	def update_pack_nett_weight(self):
 			for d in getlist(self.doclist, 'delivery_note_details'):
-				if d.item_code:
+				if d.item_code and not d.pack_nett_wt:
 					item_wt = sql("select nett_weight from `tabItem` where name = %s", (d.item_code))
 					d.pack_nett_wt = item_wt and flt(item_wt[0][0]) or 0
 
-	# ==========================================
-	def print_packing_slip(self):
-		prev_pack='0'
-		sno=0
-		html=''
-		tot_nett_wt,tot_gross_wt=0,0
-		for d in getlist(self.doclist, 'delivery_note_details'):
-			sno=sno+1
-			if sno!=1 and prev_pack!=d.pack_no:#Footer goes here
-				html+='</table><table style="page-break-after:always" width="100%"><tr><td>CASE NO</td><td>'+cstr(d.pack_no)+'</td><td>NETT WT</td><td>'+cstr(tot_nett_wt)+'</td><td>CHECKED BY</td><td></td></tr><tr><td>SIZE</td><td></td><td>GROSS WT</td><td>'+cstr(tot_gross_wt)+'</td><td>PACKED BY</td><td></td></tr></table></div>'
-			if prev_pack!=d.pack_no: #Prepare Header Here
-				#Header code goes here
-				html+='<div align="center">[HEADER GOES HERE]</div><div><center><h2>Packing Slip</h2></center></div> <table width="100%"><tr><td width="15%">Order No.</td><td width="35%">'+cstr(self.doc.sales_order_no)+'</td><td width="15%">Shipping Marks</td><td>'+cstr(d.shipping_mark)+'</td></tr></table>'
-				html+='<table class="cust_tbl" width="100%"><tr><td>S.NO.</td><td>QUANTITY</td><td>CS.NO.</td><td>DESCRIPTION</td><td>WEIGHT</td><tr>'
-				sno=0
-				tot_nett_wt,to_gross_wt=flt(d.pack_nett_wt),flt(d.pack_gross_wt)
-			#Body code goes here
-			html+='<tr><td>'+cstr(sno+1)+'</td><td>'+cstr(d.qty)+'</td><td>'+d.item_code+'</td><td>'+d.description+'</td><td>'+cstr(d.pack_nett_wt)+'</td></tr>'
-			prev_pack=d.pack_no
-			tot_nett_wt+=flt(d.pack_nett_wt)
-			tot_gross_wt+=flt(d.pack_gross_wt)
 
-		if html!='':
-			html+='</table><table style="page-break-after:always" width="100%"><tr><td>CASE NO</td><td>'+cstr(d.pack_no)+'</td><td>NETT WT</td><td>'+cstr(tot_nett_wt)+'</td><td>CHECKED BY</td><td>'+cstr(self.doc.packing_checked_by)+'</td></tr><tr><td>SIZE</td><td>'+cstr(self.doc.pack_size)+'</td><td>GROSS WT</td><td>'+cstr(tot_gross_wt)+'</td><td>PACKED BY</td><td>'+cstr(self.doc.packed_by)+'</td></tr></table></div>'
-			html+='</html>'
+	# ==========================================
+	def get_header(self, so_no, shipping_mark):
+		header = '''
+			<div align="center">[HEADER GOES HERE]</div>
+			<div><center><h2>Packing Slip</h2></center></div>
+			<table width="100%" class="large_font">
+				<tr>
+					<td width="20%">ORDER NO.</td>
+					<td width="30%">'''+cstr(so_no)+'''</td>
+					<td width="20%">SHIPPING MARKS</td>
+					<td width="30%">'''+cstr(shipping_mark)+'''</td>
+				</tr>
+			</table>''';
+			
+		return header
+		
+	def get_footer(self, row, tot_nett, tot_gross):
+		footer = '''
+			<table style="page-break-after:always" width="100%" class="large_font">
+				<tr>
+					<td>CASE NO</td><td>'''+cstr(row.pack_no)+'''</td>
+					<td>NETT WT</td><td>'''+cstr(tot_nett)+'''</td>
+					<td>CHECKED BY</td><td>'''+cstr(row.packing_checked_by)+'''</td>
+				</tr>
+				<tr>
+					<td>SIZE</td><td>'''+cstr(row.pack_size)+'''</td>
+					<td>GROSS WT</td><td>'''+cstr(tot_gross)+'''</td>
+					<td>PACKED BY</td><td>'''+cstr(row.packed_by)+'''</td>
+				</tr>
+			</table>'''
+	
+		return footer
+	
+	def print_packing_slip(self):
+		plist = {}
+		for d in getlist(self.doclist, 'delivery_note_details'):
+			if not plist.has_key(cstr(d.pack_no)):
+				plist[cstr(d.pack_no)] = [d]
+			else:
+				plist.get(cstr(d.pack_no)).append(d)
+
+		html=''
+		
+		for d in sorted(plist.keys()):
+			tot_nett_wt,tot_gross_wt=0,0
+			
+			# header
+			html += self.get_header(self.doc.sales_order_no, self.doc.shipping_mark)
+			
+			# item table header
+			html += '''
+				<table class="cust_tbl" width="100%">
+					<tr>
+						<td><b>SR.NO.</b></td><td><b>CS.NO.</b></td><td><b>DESCRIPTION</b></td>
+						<td><b>QUANTITY</b></td><td><b>WEIGHT</b></td>
+					</tr>'''
+					
+			# item table data
+			sr_no = 1
+			for r in plist.get(d):
+				html += '<tr><td>'+cstr(sr_no)+'</td><td>'+r.item_code+'</td><td>'+r.description+'</td><td>'+cstr(r.qty)+'</td><td>'+cstr(r.pack_nett_wt)+'</td></tr>'
+				
+				tot_nett_wt += flt(r.pack_nett_wt)
+				tot_gross_wt += flt(r.pack_gross_wt)
+				
+				sr_no += 1
+				
+			html += '</table>'
+
+			# footer
+			html += self.get_footer(r, tot_nett_wt, tot_gross_wt)
 		self.doc.print_packing_slip=html
diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.txt b/erpnext/stock/doctype/delivery_note/delivery_note.txt
index 9fe13e4..8109af5 100644
--- a/erpnext/stock/doctype/delivery_note/delivery_note.txt
+++ b/erpnext/stock/doctype/delivery_note/delivery_note.txt
@@ -5,7 +5,7 @@
 	{
 		'creation': '2011-04-18 15:58:20',
 		'docstatus': 0,
-		'modified': '2011-09-20 18:50:41',
+		'modified': '2011-10-18 13:57:23',
 		'modified_by': 'Administrator',
 		'owner': 'Administrator'
 	},
@@ -21,7 +21,7 @@
 
 	# These values are common for all DocType
 	{
-		'_last_update': '1315560377',
+		'_last_update': '1318321312',
 		'colour': 'White:FFF',
 		'default_print_format': 'Standard',
 		'doctype': 'DocType',
@@ -37,7 +37,7 @@
 		'show_in_menu': 0,
 		'subject': 'To %(customer_name)s on %(transaction_date)s | %(per_billed)s% billed',
 		'tag_fields': 'billing_status',
-		'version': 453
+		'version': 454
 	},
 
 	# These values are common for all DocFormat
@@ -116,6 +116,18 @@
 
 	# DocPerm
 	{
+		'amend': 1,
+		'cancel': 1,
+		'create': 1,
+		'doctype': 'DocPerm',
+		'permlevel': 0,
+		'role': 'Sales Manager',
+		'submit': 1,
+		'write': 1
+	},
+
+	# DocPerm
+	{
 		'doctype': 'DocPerm',
 		'permlevel': 1,
 		'role': 'All'
@@ -622,6 +634,7 @@
 
 	# DocField
 	{
+		'allow_on_submit': 1,
 		'doctype': 'DocField',
 		'fieldname': 'delivery_note_details',
 		'fieldtype': 'Table',
diff --git a/erpnext/stock/doctype/delivery_note_detail/delivery_note_detail.txt b/erpnext/stock/doctype/delivery_note_detail/delivery_note_detail.txt
index be7b98f..806803f 100644
--- a/erpnext/stock/doctype/delivery_note_detail/delivery_note_detail.txt
+++ b/erpnext/stock/doctype/delivery_note_detail/delivery_note_detail.txt
@@ -5,15 +5,17 @@
 	{
 		'creation': '2010-08-08 17:08:58',
 		'docstatus': 0,
-		'modified': '2011-09-07 17:34:13',
+		'modified': '2011-10-18 16:32:44',
 		'modified_by': 'Administrator',
 		'owner': 'Administrator'
 	},
 
 	# These values are common for all DocType
 	{
+		'_last_update': '1311621379',
 		'autoname': 'DND/.#######',
 		'colour': 'White:FFF',
+		'default_print_format': 'Standard',
 		'doctype': 'DocType',
 		'istable': 1,
 		'module': 'Stock',
@@ -21,7 +23,7 @@
 		'section_style': 'Tray',
 		'server_code_error': ' ',
 		'show_in_menu': 0,
-		'version': 40
+		'version': 43
 	},
 
 	# These values are common for all DocField
@@ -357,6 +359,37 @@
 	# DocField
 	{
 		'doctype': 'DocField',
+		'fieldname': 'pack_size',
+		'fieldtype': 'Data',
+		'label': 'Pack Size',
+		'no_copy': 0,
+		'permlevel': 0,
+		'print_hide': 1
+	},
+
+	# DocField
+	{
+		'doctype': 'DocField',
+		'fieldname': 'packed_by',
+		'fieldtype': 'Data',
+		'label': 'Packed By',
+		'permlevel': 0,
+		'print_hide': 1
+	},
+
+	# DocField
+	{
+		'doctype': 'DocField',
+		'fieldname': 'packing_checked_by',
+		'fieldtype': 'Data',
+		'label': 'Packing Checked By',
+		'permlevel': 0,
+		'print_hide': 1
+	},
+
+	# DocField
+	{
+		'doctype': 'DocField',
 		'fieldname': 'installed_qty',
 		'fieldtype': 'Currency',
 		'label': 'Installed Qty',