[test-case] for billing status in DN
diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.py b/erpnext/stock/doctype/delivery_note/delivery_note.py
index 64a5516..cf44d8d 100644
--- a/erpnext/stock/doctype/delivery_note/delivery_note.py
+++ b/erpnext/stock/doctype/delivery_note/delivery_note.py
@@ -281,7 +281,8 @@
 		
 		for dn in set(updated_delivery_notes):
 			update_billing_percentage(dn)
-			self.per_billed = frappe.db.get_value("Delivery Note", self.name, "per_billed")
+
+		self.load_from_db()
 				
 def update_billing_percentage(delivery_note, set_modified=True):
 	frappe.db.sql("""update `tabDelivery Note`
@@ -328,10 +329,13 @@
 			pending_to_bill = flt(dnd.amount) - billed_amt_agianst_dn
 			if pending_to_bill <= billed_against_so:
 				billed_amt_agianst_dn += pending_to_bill
+				billed_against_so -= pending_to_bill
 			else:
 				billed_amt_agianst_dn += billed_against_so
+				billed_against_so = 0
 				
 		frappe.db.set_value("Delivery Note Item", dnd.name, "billed_amt", billed_amt_agianst_dn)
+		
 		updated_dn.append(dnd.parent)
 		
 	return updated_dn
diff --git a/erpnext/stock/doctype/delivery_note/test_delivery_note.py b/erpnext/stock/doctype/delivery_note/test_delivery_note.py
index c3d8447..699d8b6 100644
--- a/erpnext/stock/doctype/delivery_note/test_delivery_note.py
+++ b/erpnext/stock/doctype/delivery_note/test_delivery_note.py
@@ -18,6 +18,7 @@
 from erpnext.stock.doctype.serial_no.serial_no import get_serial_nos, SerialNoWarehouseError
 from erpnext.stock.doctype.stock_reconciliation.test_stock_reconciliation \
 	import create_stock_reconciliation, set_valuation_method
+from erpnext.selling.doctype.sales_order.test_sales_order import make_sales_order, create_dn_against_so
 
 class TestDeliveryNote(unittest.TestCase):
 	def test_over_billing_against_dn(self):
@@ -405,6 +406,112 @@
 		
 		update_delivery_note_status(dn.name, "Closed")
 		self.assertEquals(frappe.db.get_value("Delivery Note", dn.name, "Status"), "Closed")
+		
+	def test_dn_billing_status_case1(self):
+		# SO -> DN -> SI
+		so = make_sales_order()
+		dn = create_dn_against_so(so.name, delivered_qty=2)
+		
+		self.assertEqual(dn.status, "To Bill")
+		self.assertEqual(dn.per_billed, 0)
+		
+		si = make_sales_invoice(dn.name)
+		si.submit()
+		
+		dn.load_from_db()
+		self.assertEqual(dn.get("items")[0].billed_amt, 200)
+		self.assertEqual(dn.per_billed, 100)
+		self.assertEqual(dn.status, "Completed")
+		
+	def test_dn_billing_status_case2(self):
+		# SO -> SI and SO -> DN1, DN2
+		from erpnext.selling.doctype.sales_order.sales_order import make_delivery_note, make_sales_invoice
+		
+		so = make_sales_order()
+		
+		si = make_sales_invoice(so.name)
+		si.get("items")[0].qty = 5
+		si.insert()
+		si.submit()
+		
+		frappe.db.set_value("Stock Settings", None, "allow_negative_stock", 1)
+		
+		dn1 = make_delivery_note(so.name)
+		dn1.posting_time = "10:00"
+		dn1.get("items")[0].qty = 2
+		dn1.submit()
+		
+		self.assertEqual(dn1.get("items")[0].billed_amt, 200)
+		self.assertEqual(dn1.per_billed, 100)
+		self.assertEqual(dn1.status, "Completed")
+		
+		dn2 = make_delivery_note(so.name)
+		dn2.posting_time = "08:00"
+		dn2.get("items")[0].qty = 4
+		dn2.submit()
+		
+		dn1.load_from_db()
+		self.assertEqual(dn1.get("items")[0].billed_amt, 100)
+		self.assertEqual(dn1.per_billed, 50)
+		self.assertEqual(dn1.status, "To Bill")
+		
+		self.assertEqual(dn2.get("items")[0].billed_amt, 400)
+		self.assertEqual(dn2.per_billed, 100)
+		self.assertEqual(dn2.status, "Completed")
+		
+	def test_dn_billing_status_case3(self):
+		# SO -> DN1 -> SI and SO -> SI and SO -> DN2
+		from erpnext.selling.doctype.sales_order.sales_order \
+			import make_delivery_note, make_sales_invoice as make_sales_invoice_from_so
+		frappe.db.set_value("Stock Settings", None, "allow_negative_stock", 1)
+		
+		so = make_sales_order()
+		
+		dn1 = make_delivery_note(so.name)
+		dn1.posting_time = "10:00"
+		dn1.get("items")[0].qty = 2
+		dn1.submit()
+
+		si1 = make_sales_invoice(dn1.name)
+		si1.submit()
+		
+		dn1.load_from_db()
+		self.assertEqual(dn1.per_billed, 100)
+		
+		si2 = make_sales_invoice_from_so(so.name)
+		si2.get("items")[0].qty = 4
+		si2.submit()
+		
+		dn2 = make_delivery_note(so.name)
+		dn2.posting_time = "08:00"
+		dn2.get("items")[0].qty = 5
+		dn2.submit()
+		
+		dn1.load_from_db()
+		self.assertEqual(dn1.get("items")[0].billed_amt, 200)
+		self.assertEqual(dn1.per_billed, 100)
+		self.assertEqual(dn1.status, "Completed")
+		
+		self.assertEqual(dn2.get("items")[0].billed_amt, 400)
+		self.assertEqual(dn2.per_billed, 80)
+		self.assertEqual(dn2.status, "To Bill")
+		
+	def test_dn_billing_status_case4(self):
+		# SO -> SI -> DN
+		from erpnext.selling.doctype.sales_order.sales_order import make_sales_invoice
+		from erpnext.accounts.doctype.sales_invoice.sales_invoice import make_delivery_note
+		
+		so = make_sales_order()
+		
+		si = make_sales_invoice(so.name)
+		si.submit()
+		
+		dn = make_delivery_note(si.name)
+		dn.submit()
+		
+		self.assertEqual(dn.get("items")[0].billed_amt, 1000)
+		self.assertEqual(dn.per_billed, 100)
+		self.assertEqual(dn.status, "Completed")
 
 def create_delivery_note(**args):
 	dn = frappe.new_doc("Delivery Note")