Show Write-Off for all Sales Invoices if there is a Grand Total
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js
index f83528c..ade0d32 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js
@@ -174,7 +174,7 @@
 			frappe.model.round_floats_in(this.frm.doc, ["base_grand_total", "paid_amount"]);
 			// this will make outstanding amount 0
 			this.frm.set_value("write_off_amount",
-				flt(this.frm.doc.base_grand_total - this.frm.doc.paid_amount, precision("write_off_amount"))
+				flt(this.frm.doc.base_grand_total - this.frm.doc.paid_amount - this.frm.doc.total_advance, precision("write_off_amount"))
 			);
 			this.frm.toggle_enable("write_off_amount", false);
 
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json
index 70e79b0..11ae3b5 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.json
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.json
@@ -664,14 +664,6 @@
   }, 
   {
    "depends_on": "is_pos", 
-   "fieldname": "column_break3", 
-   "fieldtype": "Column Break", 
-   "permlevel": 0, 
-   "read_only": 0, 
-   "width": "50%"
-  }, 
-  {
-   "depends_on": "is_pos", 
    "fieldname": "paid_amount", 
    "fieldtype": "Currency", 
    "label": "Paid Amount", 
@@ -685,6 +677,14 @@
   }, 
   {
    "depends_on": "is_pos", 
+   "fieldname": "column_break3", 
+   "fieldtype": "Column Break", 
+   "permlevel": 0, 
+   "read_only": 0, 
+   "width": "50%"
+  }, 
+  {
+   "depends_on": "is_pos", 
    "fieldname": "cash_bank_account", 
    "fieldtype": "Link", 
    "label": "Cash/Bank Account", 
@@ -696,24 +696,16 @@
    "read_only": 0
   }, 
   {
-   "depends_on": "eval:doc.is_pos===1||(doc.advances && doc.advances.length>0)", 
+   "depends_on": "grand_total", 
    "fieldname": "column_break4", 
-   "fieldtype": "Column Break", 
+   "fieldtype": "Section Break", 
+   "label": "Write Off", 
    "permlevel": 0, 
    "read_only": 0, 
    "width": "50%"
   }, 
   {
-   "depends_on": "eval:doc.is_pos===1||(doc.advances && doc.advances.length>0)", 
-   "fieldname": "write_off_outstanding_amount_automatically", 
-   "fieldtype": "Check", 
-   "label": "Write Off Outstanding Amount", 
-   "permlevel": 0, 
-   "print_hide": 1, 
-   "read_only": 0
-  }, 
-  {
-   "depends_on": "eval:doc.is_pos===1||(doc.advances && doc.advances.length>0)", 
+   "depends_on": "", 
    "fieldname": "write_off_amount", 
    "fieldtype": "Currency", 
    "label": "Write Off Amount", 
@@ -724,7 +716,23 @@
    "read_only": 0
   }, 
   {
+   "depends_on": "", 
+   "fieldname": "write_off_outstanding_amount_automatically", 
+   "fieldtype": "Check", 
+   "label": "Write Off Outstanding Amount", 
+   "permlevel": 0, 
+   "print_hide": 1, 
+   "read_only": 0
+  }, 
+  {
    "depends_on": "eval:doc.is_pos===1||(doc.advances && doc.advances.length>0)", 
+   "fieldname": "column_break_74", 
+   "fieldtype": "Column Break", 
+   "permlevel": 0, 
+   "precision": ""
+  }, 
+  {
+   "depends_on": "", 
    "fieldname": "write_off_account", 
    "fieldtype": "Link", 
    "label": "Write Off Account", 
@@ -734,7 +742,7 @@
    "read_only": 0
   }, 
   {
-   "depends_on": "eval:doc.is_pos===1||(doc.advances && doc.advances.length>0)", 
+   "depends_on": "", 
    "fieldname": "write_off_cost_center", 
    "fieldtype": "Link", 
    "label": "Write Off Cost Center", 
@@ -1246,8 +1254,8 @@
  "icon": "icon-file-text", 
  "idx": 1, 
  "is_submittable": 1, 
- "modified": "2015-04-01 06:50:49.748285", 
- "modified_by": "Administrator", 
+ "modified": "2015-04-02 13:42:22.985078", 
+ "modified_by": "anand@erpnext.com", 
  "module": "Accounts", 
  "name": "Sales Invoice", 
  "owner": "Administrator", 
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
index 9cb63b2..2a4c331 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
@@ -48,10 +48,10 @@
 		self.clear_unallocated_advances("Sales Invoice Advance", "advances")
 		self.validate_advance_jv("advances", "sales_order")
 		self.add_remarks()
+		self.validate_write_off_account()
 
 		if cint(self.is_pos):
 			self.validate_pos()
-			self.validate_write_off_account()
 
 		if cint(self.update_stock):
 			self.validate_item_code()
@@ -453,8 +453,10 @@
 		if gl_entries:
 			from erpnext.accounts.general_ledger import make_gl_entries
 
+			# if POS and amount is written off, there's no outstanding and hence no need to update it
 			update_outstanding = cint(self.is_pos) and self.write_off_account \
 				and 'No' or 'Yes'
+
 			make_gl_entries(gl_entries, cancel=(self.docstatus == 2),
 				update_outstanding=update_outstanding, merge_entries=False)
 
@@ -483,6 +485,8 @@
 
 		self.make_pos_gl_entries(gl_entries)
 
+		self.make_write_off_gl_entry(gl_entries)
+
 		return gl_entries
 
 	def make_customer_gl_entry(self, gl_entries):
@@ -555,29 +559,31 @@
 					"remarks": self.remarks,
 				})
 			)
-			# write off entries, applicable if only pos
-			if self.write_off_account and self.write_off_amount:
-				gl_entries.append(
-					self.get_gl_dict({
-						"account": self.debit_to,
-						"party_type": "Customer",
-						"party": self.customer,
-						"against": self.write_off_account,
-						"credit": self.write_off_amount,
-						"remarks": self.remarks,
-						"against_voucher": self.name,
-						"against_voucher_type": self.doctype,
-					})
-				)
-				gl_entries.append(
-					self.get_gl_dict({
-						"account": self.write_off_account,
-						"against": self.debit_to,
-						"debit": self.write_off_amount,
-						"remarks": self.remarks,
-						"cost_center": self.write_off_cost_center
-					})
-				)
+
+	def make_write_off_gl_entry(self, gl_entries):
+		# write off entries, applicable if only pos
+		if self.write_off_account and self.write_off_amount:
+			gl_entries.append(
+				self.get_gl_dict({
+					"account": self.debit_to,
+					"party_type": "Customer",
+					"party": self.customer,
+					"against": self.write_off_account,
+					"credit": self.write_off_amount,
+					"remarks": self.remarks,
+					"against_voucher": self.name,
+					"against_voucher_type": self.doctype,
+				})
+			)
+			gl_entries.append(
+				self.get_gl_dict({
+					"account": self.write_off_account,
+					"against": self.debit_to,
+					"debit": self.write_off_amount,
+					"remarks": self.remarks,
+					"cost_center": self.write_off_cost_center
+				})
+			)
 
 def get_list_context(context=None):
 	from erpnext.controllers.website_list_for_contact import get_list_context