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