fix: Allocate tax loss to tax account head on early payment discount (#34287)
* fix: Taxes aren't discounted on early payment discount - Deductions in payment entry must be split into income loss and tax loss - Compute total discount in percentage, makes discounting different amounts proportionately easier (cherry picked from commit768c3a4927) * fix: Recalculate difference amount after setting deductions (cherry picked from commit75ec0a0a85) * fix: Set deductions in base currency - Use field precision to get more accurate values (cherry picked from commitdc2998f544) * fix: Back update discounted amount in Invoice based on discount type - Discount value was always trated as a percentage on back updation (cherry picked from commit2ae5834290) * test: PE from SI with early payment discount amount & PE assertions in discount % test (cherry picked from commitc217bb2018) * fix: Set deduction amount in company currency on Doctype - Even via JS, deductions amount is always in company currency - Since there is nothing dynamic about this field, set it in the doctype spec itself - fixed: Inconsistency between label currency and field currency formatted value (cherry picked from commit7f2e7badff) * fix: Don't add to deductions if amount is 0 - misc: better docstring (cherry picked from commitf02fc8acf0) * fix: Paid amount must be discounted considering accounting currency - Accounting is in the same currency if party currency and company currency is the same - If accounting is in the same currency, paid and recvd amount is in the base currency - Then, discount amount must also be in the base currency as it is deducted from paid amount - Received amount must be in base currency if not multi currency - cleanup: Deductions setting broken into smaller functions (cherry picked from commit761f68d7bf) * fix: Multi-currency SI with base currency PE - Return total discount loss in base currency - Allocate payment based on terms: Set allocated amount in references table in base currency if accounting is in that currency - Allocate payment based on terms: While back updating set paid amount (payment schedule) in transaction currency always - minor: discount msgprint in correct currency (cherry picked from commitb09c2381ca) * test: Multi currency SI with multi-currency accounting and single currency accounting + Early payment discount (cherry picked from commit9abf0ef615) # Conflicts: # erpnext/accounts/doctype/payment_entry/test_payment_entry.py * fix: Handle rounding more gracefully - Round off pending discount loss to avoid miniscule losses rounded to 0.0 that are added in deductions - Use base amounts to calculate base losses instead of using conversion factor which increases rounding error - Round of total base loss instead of individual income and tax losses to reduce rounding error - Use default round off account for pending rounding loss in deductions (cherry picked from commitcaa1a3dccf) * fix: Provision to apply early payment discount if payment is recorded late - Party could have paid on time but payment is recorded late - Prompt for reference date so that discount is applied while mapping - Prompt only if discount in payment schedule of valid doctypes - test: Reference date and impact on PE - `make_payment_entry` (JS) must be able to access `this` (cherry picked from commitd6d0163514) # Conflicts: # erpnext/accounts/doctype/payment_entry/payment_entry.py # erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js # erpnext/buying/doctype/purchase_order/purchase_order.js # erpnext/public/js/controllers/transaction.js * feat: Make Tax loss booking optional - Checkbox in Accounts Settings - Apply checkbox in PE deductions setting logic - Adjust tests (cherry picked from commit216a46bd66) # Conflicts: # erpnext/accounts/doctype/accounts_settings/accounts_settings.json * fix: Merge conflicts * fix: 'Donation' does not have `company_currency` field - Make sure check uses this field only for eligible documents --------- Co-authored-by: marination <maricadsouza221197@gmail.com>
This commit is contained in:
@@ -1987,22 +1987,62 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({
|
||||
}
|
||||
},
|
||||
|
||||
make_payment_entry: function() {
|
||||
make_payment_entry() {
|
||||
let via_journal_entry = this.frm.doc.__onload && this.frm.doc.__onload.make_payment_via_journal_entry;
|
||||
if(this.has_discount_in_schedule() && !via_journal_entry) {
|
||||
// If early payment discount is applied, ask user for reference date
|
||||
this.prompt_user_for_reference_date();
|
||||
} else {
|
||||
this.make_mapped_payment_entry();
|
||||
}
|
||||
},
|
||||
|
||||
make_mapped_payment_entry(args) {
|
||||
var me = this;
|
||||
args = args || { "dt": this.frm.doc.doctype, "dn": this.frm.doc.name };
|
||||
return frappe.call({
|
||||
method: cur_frm.cscript.get_method_for_payment(),
|
||||
args: {
|
||||
"dt": cur_frm.doc.doctype,
|
||||
"dn": cur_frm.doc.name
|
||||
},
|
||||
method: me.get_method_for_payment(),
|
||||
args: args,
|
||||
callback: function(r) {
|
||||
var doclist = frappe.model.sync(r.message);
|
||||
frappe.set_route("Form", doclist[0].doctype, doclist[0].name);
|
||||
// cur_frm.refresh_fields()
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
make_quality_inspection: function () {
|
||||
prompt_user_for_reference_date(){
|
||||
var me = this;
|
||||
frappe.prompt({
|
||||
label: __("Cheque/Reference Date"),
|
||||
fieldname: "reference_date",
|
||||
fieldtype: "Date",
|
||||
reqd: 1,
|
||||
}, (values) => {
|
||||
let args = {
|
||||
"dt": me.frm.doc.doctype,
|
||||
"dn": me.frm.doc.name,
|
||||
"reference_date": values.reference_date
|
||||
}
|
||||
me.make_mapped_payment_entry(args);
|
||||
},
|
||||
__("Reference Date for Early Payment Discount"),
|
||||
__("Continue")
|
||||
);
|
||||
},
|
||||
|
||||
has_discount_in_schedule() {
|
||||
let is_eligible = in_list(
|
||||
["Sales Order", "Sales Invoice", "Purchase Order", "Purchase Invoice"],
|
||||
this.frm.doctype
|
||||
);
|
||||
let has_payment_schedule = this.frm.doc.payment_schedule && this.frm.doc.payment_schedule.length;
|
||||
if(!is_eligible || !has_payment_schedule) return false;
|
||||
|
||||
let has_discount = this.frm.doc.payment_schedule.some(row => row.discount_date);
|
||||
return has_discount;
|
||||
},
|
||||
|
||||
make_quality_inspection() {
|
||||
let data = [];
|
||||
const fields = [
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user