Merge pull request #30710 from deepeshgarg007/advance_jv_allocation
fix: Exchange gain and loss on advance Journal Entry allocation
diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js
index ee29d2a..42917f8 100644
--- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js
+++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js
@@ -30,6 +30,9 @@
onload() {
super.onload();
+ // Ignore linked advances
+ this.frm.ignore_doctypes_on_cancel_all = ['Journal Entry', 'Payment Entry'];
+
if(!this.frm.doc.__islocal) {
// show credit_to in print format
if(!this.frm.doc.supplier && this.frm.doc.credit_to) {
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js
index 6818955..0f7c13f 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js
@@ -33,7 +33,9 @@
var me = this;
super.onload();
- this.frm.ignore_doctypes_on_cancel_all = ['POS Invoice', 'Timesheet', 'POS Invoice Merge Log', 'POS Closing Entry'];
+ this.frm.ignore_doctypes_on_cancel_all = ['POS Invoice', 'Timesheet', 'POS Invoice Merge Log',
+ 'POS Closing Entry', 'Journal Entry', 'Payment Entry'];
+
if(!this.frm.doc.__islocal && !this.frm.doc.customer && this.frm.doc.debit_to) {
// show debit_to in print format
this.frm.set_df_property("debit_to", "print_hide", 0);
diff --git a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py
index 7781fe3..caa70d0 100644
--- a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py
+++ b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py
@@ -3124,6 +3124,62 @@
si.reload()
self.assertTrue(si.items[0].serial_no)
+ def test_gain_loss_with_advance_entry(self):
+ from erpnext.accounts.doctype.journal_entry.test_journal_entry import make_journal_entry
+
+ unlink_enabled = frappe.db.get_value(
+ "Accounts Settings", "Accounts Settings", "unlink_payment_on_cancel_of_invoice"
+ )
+
+ frappe.db.set_value(
+ "Accounts Settings", "Accounts Settings", "unlink_payment_on_cancel_of_invoice", 1
+ )
+
+ jv = make_journal_entry("_Test Receivable USD - _TC", "_Test Bank - _TC", -7000, save=False)
+
+ jv.accounts[0].exchange_rate = 70
+ jv.accounts[0].credit_in_account_currency = 100
+ jv.accounts[0].party_type = "Customer"
+ jv.accounts[0].party = "_Test Customer USD"
+
+ jv.save()
+ jv.submit()
+
+ si = create_sales_invoice(
+ customer="_Test Customer USD",
+ debit_to="_Test Receivable USD - _TC",
+ currency="USD",
+ conversion_rate=75,
+ do_not_save=1,
+ rate=100,
+ )
+
+ si.append(
+ "advances",
+ {
+ "reference_type": "Journal Entry",
+ "reference_name": jv.name,
+ "reference_row": jv.accounts[0].name,
+ "advance_amount": 100,
+ "allocated_amount": 100,
+ "ref_exchange_rate": 70,
+ },
+ )
+ si.save()
+ si.submit()
+
+ expected_gle = [
+ ["_Test Receivable USD - _TC", 7500.0, 500],
+ ["Exchange Gain/Loss - _TC", 500.0, 0.0],
+ ["Sales - _TC", 0.0, 7500.0],
+ ]
+
+ check_gl_entries(self, si.name, expected_gle, nowdate())
+
+ frappe.db.set_value(
+ "Accounts Settings", "Accounts Settings", "unlink_payment_on_cancel_of_invoice", unlink_enabled
+ )
+
def get_sales_invoice_for_e_invoice():
si = make_sales_invoice_for_ewaybill()
diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py
index 7cbd2bd..f20df09 100644
--- a/erpnext/controllers/accounts_controller.py
+++ b/erpnext/controllers/accounts_controller.py
@@ -1997,12 +1997,13 @@
reference_condition = " and (" + " or ".join(conditions) + ")" if conditions else ""
+ # nosemgrep
journal_entries = frappe.db.sql(
"""
select
"Journal Entry" as reference_type, t1.name as reference_name,
t1.remark as remarks, t2.{0} as amount, t2.name as reference_row,
- t2.reference_name as against_order
+ t2.reference_name as against_order, t2.exchange_rate
from
`tabJournal Entry` t1, `tabJournal Entry Account` t2
where