fix: Cash and non trade discount calculation
diff --git a/erpnext/accounts/doctype/gl_entry/gl_entry.py b/erpnext/accounts/doctype/gl_entry/gl_entry.py
index 1987c83..7227b95 100644
--- a/erpnext/accounts/doctype/gl_entry/gl_entry.py
+++ b/erpnext/accounts/doctype/gl_entry/gl_entry.py
@@ -366,7 +366,7 @@
if against_voucher_type in ["Sales Invoice", "Purchase Invoice", "Fees"]:
ref_doc = frappe.get_doc(against_voucher_type, against_voucher)
- # Didn't use db_set for optimisation purpose
+ # Didn't use db_set for optimization purpose
ref_doc.outstanding_amount = bal
frappe.db.set_value(against_voucher_type, against_voucher, "outstanding_amount", bal)
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js
index adcbb83..73ec051 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js
@@ -479,9 +479,13 @@
is_cash_or_non_trade_discount() {
this.frm.set_df_property("additional_discount_account", "hidden", 1 - this.frm.doc.is_cash_or_non_trade_discount);
+ this.frm.set_df_property("additional_discount_account", "reqd", this.frm.doc.is_cash_or_non_trade_discount);
+
if (!this.frm.doc.is_cash_or_non_trade_discount) {
this.frm.set_value("additional_discount_account", "");
}
+
+ this.calculate_taxes_and_totals();
}
};
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
index 19a234d..4008863 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py
@@ -1033,22 +1033,6 @@
)
)
- if self.apply_discount_on == "Grand Total" and self.get("is_cash_or_discount_account"):
- gl_entries.append(
- self.get_gl_dict(
- {
- "account": self.additional_discount_account,
- "against": self.debit_to,
- "debit": self.base_discount_amount,
- "debit_in_account_currency": self.discount_amount,
- "cost_center": self.cost_center,
- "project": self.project,
- },
- self.currency,
- item=self,
- )
- )
-
def make_tax_gl_entries(self, gl_entries):
enable_discount_accounting = cint(
frappe.db.get_single_value("Selling Settings", "enable_discount_accounting")
diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py
index 70d2bc6..28070d2 100644
--- a/erpnext/controllers/accounts_controller.py
+++ b/erpnext/controllers/accounts_controller.py
@@ -1109,17 +1109,17 @@
frappe.db.get_single_value("Selling Settings", "enable_discount_accounting")
)
+ if self.doctype == "Purchase Invoice":
+ dr_or_cr = "credit"
+ rev_dr_cr = "debit"
+ supplier_or_customer = self.supplier
+
+ else:
+ dr_or_cr = "debit"
+ rev_dr_cr = "credit"
+ supplier_or_customer = self.customer
+
if enable_discount_accounting:
- if self.doctype == "Purchase Invoice":
- dr_or_cr = "credit"
- rev_dr_cr = "debit"
- supplier_or_customer = self.supplier
-
- else:
- dr_or_cr = "debit"
- rev_dr_cr = "credit"
- supplier_or_customer = self.customer
-
for item in self.get("items"):
if item.get("discount_amount") and item.get("discount_account"):
discount_amount = item.discount_amount * item.qty
@@ -1173,18 +1173,22 @@
)
)
- if self.get("discount_amount") and self.get("additional_discount_account"):
- gl_entries.append(
- self.get_gl_dict(
- {
- "account": self.additional_discount_account,
- "against": supplier_or_customer,
- dr_or_cr: self.discount_amount,
- "cost_center": self.cost_center,
- },
- item=self,
- )
+ if (
+ (enable_discount_accounting or self.is_cash_or_non_trade_discount)
+ and self.get("additional_discount_account")
+ and self.get("discount_amount")
+ ):
+ gl_entries.append(
+ self.get_gl_dict(
+ {
+ "account": self.additional_discount_account,
+ "against": supplier_or_customer,
+ dr_or_cr: self.discount_amount,
+ "cost_center": self.cost_center,
+ },
+ item=self,
)
+ )
def validate_multiple_billing(self, ref_dt, item_ref_dn, based_on, parentfield):
from erpnext.controllers.status_updater import get_allowance_for
diff --git a/erpnext/controllers/taxes_and_totals.py b/erpnext/controllers/taxes_and_totals.py
index 0d8cffe..bc38d08 100644
--- a/erpnext/controllers/taxes_and_totals.py
+++ b/erpnext/controllers/taxes_and_totals.py
@@ -37,6 +37,11 @@
self.set_discount_amount()
self.apply_discount_amount()
+ # Update grand total as per cash and non trade discount
+ if self.doc.apply_discount_on == "Grand Total" and self.doc.get("is_cash_or_non_trade_discount"):
+ self.doc.grand_total -= self.doc.discount_amount
+ self.doc.base_grand_total -= self.doc.base_discount_amount
+
self.calculate_shipping_charges()
if self.doc.doctype in ["Sales Invoice", "Purchase Invoice"]:
@@ -500,9 +505,6 @@
else:
self.doc.grand_total = flt(self.doc.net_total)
- if self.doc.apply_discount_on == "Grand Total" and self.doc.get("is_cash_or_non_trade_discount"):
- self.doc.grand_total -= self.doc.discount_amount
-
if self.doc.get("taxes"):
self.doc.total_taxes_and_charges = flt(
self.doc.grand_total - self.doc.net_total - flt(self.doc.rounding_adjustment),
@@ -597,16 +599,16 @@
if not self.doc.apply_discount_on:
frappe.throw(_("Please select Apply Discount On"))
+ self.doc.base_discount_amount = flt(
+ self.doc.discount_amount * self.doc.conversion_rate, self.doc.precision("base_discount_amount")
+ )
+
if self.doc.apply_discount_on == "Grand Total" and self.doc.get(
"is_cash_or_non_trade_discount"
):
self.discount_amount_applied = True
return
- self.doc.base_discount_amount = flt(
- self.doc.discount_amount * self.doc.conversion_rate, self.doc.precision("base_discount_amount")
- )
-
total_for_discount_amount = self.get_total_for_discount_amount()
taxes = self.doc.get("taxes")
net_total = 0
diff --git a/erpnext/public/js/controllers/taxes_and_totals.js b/erpnext/public/js/controllers/taxes_and_totals.js
index 16b0b4a..3b9e23a 100644
--- a/erpnext/public/js/controllers/taxes_and_totals.js
+++ b/erpnext/public/js/controllers/taxes_and_totals.js
@@ -39,6 +39,12 @@
this._calculate_taxes_and_totals();
this.calculate_discount_amount();
+ // # Update grand total as per cash and non trade discount
+ if (this.frm.doc.apply_discount_on == "Grand Total" && this.frm.doc.is_cash_or_non_trade_discount) {
+ this.frm.doc.grand_total -= this.frm.doc.discount_amount;
+ this.frm.doc.base_grand_total -= this.frm.doc.base_discount_amount;
+ }
+
await this.calculate_shipping_charges();
// Advance calculation applicable to Sales /Purchase Invoice
@@ -633,6 +639,10 @@
this.frm.doc.base_discount_amount = flt(this.frm.doc.discount_amount * this.frm.doc.conversion_rate,
precision("base_discount_amount"));
+ if (this.frm.doc.apply_discount_on == "Grand Total" && this.frm.doc.is_cash_or_non_trade_discount) {
+ return
+ }
+
var total_for_discount_amount = this.get_total_for_discount_amount();
var net_total = 0;
// calculate item amount after Discount Amount