Merge pull request #31910 from deepeshgarg007/cash_and_non_trade_discount_fix

fix: Cash and non trade discount calculation
This commit is contained in:
Deepesh Garg 2022-08-23 10:19:09 +05:30 committed by GitHub
commit 9fd0c25c9f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 49 additions and 45 deletions

View File

@ -366,7 +366,7 @@ def update_outstanding_amt(
if against_voucher_type in ["Sales Invoice", "Purchase Invoice", "Fees"]: if against_voucher_type in ["Sales Invoice", "Purchase Invoice", "Fees"]:
ref_doc = frappe.get_doc(against_voucher_type, against_voucher) 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 ref_doc.outstanding_amount = bal
frappe.db.set_value(against_voucher_type, against_voucher, "outstanding_amount", bal) frappe.db.set_value(against_voucher_type, against_voucher, "outstanding_amount", bal)

View File

@ -479,9 +479,13 @@ erpnext.accounts.SalesInvoiceController = class SalesInvoiceController extends e
is_cash_or_non_trade_discount() { 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", "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) { if (!this.frm.doc.is_cash_or_non_trade_discount) {
this.frm.set_value("additional_discount_account", ""); this.frm.set_value("additional_discount_account", "");
} }
this.calculate_taxes_and_totals();
} }
}; };

View File

@ -1033,22 +1033,6 @@ class SalesInvoice(SellingController):
) )
) )
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): def make_tax_gl_entries(self, gl_entries):
enable_discount_accounting = cint( enable_discount_accounting = cint(
frappe.db.get_single_value("Selling Settings", "enable_discount_accounting") frappe.db.get_single_value("Selling Settings", "enable_discount_accounting")

View File

@ -1109,17 +1109,17 @@ class AccountsController(TransactionBase):
frappe.db.get_single_value("Selling Settings", "enable_discount_accounting") 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 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"): for item in self.get("items"):
if item.get("discount_amount") and item.get("discount_account"): if item.get("discount_amount") and item.get("discount_account"):
discount_amount = item.discount_amount * item.qty discount_amount = item.discount_amount * item.qty
@ -1173,18 +1173,22 @@ class AccountsController(TransactionBase):
) )
) )
if self.get("discount_amount") and self.get("additional_discount_account"): if (
gl_entries.append( (enable_discount_accounting or self.get("is_cash_or_non_trade_discount"))
self.get_gl_dict( and self.get("additional_discount_account")
{ and self.get("discount_amount")
"account": self.additional_discount_account, ):
"against": supplier_or_customer, gl_entries.append(
dr_or_cr: self.discount_amount, self.get_gl_dict(
"cost_center": self.cost_center, {
}, "account": self.additional_discount_account,
item=self, "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): def validate_multiple_billing(self, ref_dt, item_ref_dn, based_on, parentfield):
from erpnext.controllers.status_updater import get_allowance_for from erpnext.controllers.status_updater import get_allowance_for

View File

@ -37,6 +37,11 @@ class calculate_taxes_and_totals(object):
self.set_discount_amount() self.set_discount_amount()
self.apply_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() self.calculate_shipping_charges()
if self.doc.doctype in ["Sales Invoice", "Purchase Invoice"]: if self.doc.doctype in ["Sales Invoice", "Purchase Invoice"]:
@ -500,9 +505,6 @@ class calculate_taxes_and_totals(object):
else: else:
self.doc.grand_total = flt(self.doc.net_total) 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"): if self.doc.get("taxes"):
self.doc.total_taxes_and_charges = flt( self.doc.total_taxes_and_charges = flt(
self.doc.grand_total - self.doc.net_total - flt(self.doc.rounding_adjustment), self.doc.grand_total - self.doc.net_total - flt(self.doc.rounding_adjustment),
@ -597,16 +599,16 @@ class calculate_taxes_and_totals(object):
if not self.doc.apply_discount_on: if not self.doc.apply_discount_on:
frappe.throw(_("Please select 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( if self.doc.apply_discount_on == "Grand Total" and self.doc.get(
"is_cash_or_non_trade_discount" "is_cash_or_non_trade_discount"
): ):
self.discount_amount_applied = True self.discount_amount_applied = True
return 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() total_for_discount_amount = self.get_total_for_discount_amount()
taxes = self.doc.get("taxes") taxes = self.doc.get("taxes")
net_total = 0 net_total = 0

View File

@ -39,6 +39,12 @@ erpnext.taxes_and_totals = class TaxesAndTotals extends erpnext.payments {
this._calculate_taxes_and_totals(); this._calculate_taxes_and_totals();
this.calculate_discount_amount(); 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(); await this.calculate_shipping_charges();
// Advance calculation applicable to Sales /Purchase Invoice // Advance calculation applicable to Sales /Purchase Invoice
@ -633,6 +639,10 @@ erpnext.taxes_and_totals = class TaxesAndTotals extends erpnext.payments {
this.frm.doc.base_discount_amount = flt(this.frm.doc.discount_amount * this.frm.doc.conversion_rate, this.frm.doc.base_discount_amount = flt(this.frm.doc.discount_amount * this.frm.doc.conversion_rate,
precision("base_discount_amount")); 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 total_for_discount_amount = this.get_total_for_discount_amount();
var net_total = 0; var net_total = 0;
// calculate item amount after Discount Amount // calculate item amount after Discount Amount