From 6b5992fe3bddf628358335bb811bb9658425b07e Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Fri, 2 Aug 2024 15:43:04 +0530 Subject: [PATCH 1/7] refactor: ignore filter in general ledger for cr / dr notes --- erpnext/accounts/report/general_ledger/general_ledger.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/erpnext/accounts/report/general_ledger/general_ledger.js b/erpnext/accounts/report/general_ledger/general_ledger.js index f2bef09458..6e0305874b 100644 --- a/erpnext/accounts/report/general_ledger/general_ledger.js +++ b/erpnext/accounts/report/general_ledger/general_ledger.js @@ -220,6 +220,11 @@ frappe.query_reports["General Ledger"] = { label: __("Ignore Exchange Rate Revaluation Journals"), fieldtype: "Check", }, + { + fieldname: "ignore_cr_dr_notes", + label: __("Ignore System Generated Credit / Debit Notes"), + fieldtype: "Check", + }, ], formatter: function (value, row, column, data, default_formatter) { if ( -- GitLab From 2da6f7dd35c83c2bf051fb597e20e0fef55eef2c Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Fri, 2 Aug 2024 15:47:27 +0530 Subject: [PATCH 2/7] refactor: ignore system generated cr / dr notes on general ledger --- .../report/general_ledger/general_ledger.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/erpnext/accounts/report/general_ledger/general_ledger.py b/erpnext/accounts/report/general_ledger/general_ledger.py index 67d5e82854..3c02b53984 100644 --- a/erpnext/accounts/report/general_ledger/general_ledger.py +++ b/erpnext/accounts/report/general_ledger/general_ledger.py @@ -272,6 +272,20 @@ def get_conditions(filters): if err_journals: filters.update({"voucher_no_not_in": [x[0] for x in err_journals]}) + if filters.get("ignore_cr_dr_notes"): + system_generated_cr_dr_journals = frappe.db.get_all( + "Journal Entry", + filters={ + "company": filters.get("company"), + "docstatus": 1, + "voucher_type": ("in", ["Credit Note", "Debit Note"]), + "is_system_generated": 1, + }, + as_list=True, + ) + if system_generated_cr_dr_journals: + filters.update({"voucher_no_not_in": [x[0] for x in system_generated_cr_dr_journals]}) + if filters.get("voucher_no_not_in"): conditions.append("voucher_no not in %(voucher_no_not_in)s") -- GitLab From eb59e791b8c84f81420c95d82ea9ecced720dc99 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Mon, 5 Aug 2024 09:56:16 +0530 Subject: [PATCH 3/7] test: ignore filter for system generated cr / dr note journals --- .../general_ledger/test_general_ledger.py | 76 ++++++++++++++++++- 1 file changed, 73 insertions(+), 3 deletions(-) diff --git a/erpnext/accounts/report/general_ledger/test_general_ledger.py b/erpnext/accounts/report/general_ledger/test_general_ledger.py index 75f94309bc..682eef8f41 100644 --- a/erpnext/accounts/report/general_ledger/test_general_ledger.py +++ b/erpnext/accounts/report/general_ledger/test_general_ledger.py @@ -5,7 +5,9 @@ import frappe from frappe.tests.utils import FrappeTestCase from frappe.utils import flt, today +from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice from erpnext.accounts.report.general_ledger.general_ledger import execute +from erpnext.controllers.sales_and_purchase_return import make_return_doc class TestGeneralLedger(FrappeTestCase): @@ -203,9 +205,7 @@ class TestGeneralLedger(FrappeTestCase): revaluation.extend("accounts", accounts) row = revaluation.accounts[0] row.new_exchange_rate = 83 - row.new_balance_in_base_currency = flt( - row.new_exchange_rate * flt(row.balance_in_account_currency) - ) + row.new_balance_in_base_currency = flt(row.new_exchange_rate * flt(row.balance_in_account_currency)) row.gain_loss = row.new_balance_in_base_currency - flt(row.balance_in_base_currency) revaluation.set_total_gain_loss() revaluation = revaluation.save().submit() @@ -250,3 +250,73 @@ class TestGeneralLedger(FrappeTestCase): ) ) self.assertIn(revaluation_jv.name, set([x.voucher_no for x in data])) + + def test_ignore_cr_dr_notes_filter(self): + si = create_sales_invoice() + + cr_note = make_return_doc(si.doctype, si.name) + cr_note.submit() + + pr = frappe.get_doc("Payment Reconciliation") + pr.company = si.company + pr.party_type = "Customer" + pr.party = si.customer + pr.receivable_payable_account = si.debit_to + + pr.get_unreconciled_entries() + self.assertEqual(len(pr.invoices), 1) + self.assertEqual(len(pr.payments), 1) + + invoices = [invoice.as_dict() for invoice in pr.invoices] + payments = [payment.as_dict() for payment in pr.payments] + pr.allocate_entries(frappe._dict({"invoices": invoices, "payments": payments})) + pr.reconcile() + + self.assertEqual(len(pr.invoices), 0) + self.assertEqual(len(pr.payments), 0) + + system_generated_journal = frappe.db.get_all( + "Journal Entry", + filters={ + "docstatus": 1, + "reference_type": si.doctype, + "reference_name": si.name, + "voucher_type": "Credit Note", + "is_system_generated": True, + }, + fields=["name"], + ) + self.assertEqual(len(system_generated_journal), 1) + expected = set([si.name, cr_note.name, system_generated_journal[0].name]) + # Without ignore_cr_dr_notes + columns, data = execute( + frappe._dict( + { + "company": si.company, + "from_date": si.posting_date, + "to_date": si.posting_date, + "account": [si.debit_to], + "group_by": "Group by Voucher (Consolidated)", + "ignore_cr_dr_notes": False, + } + ) + ) + actual = set([x.voucher_no for x in data if x.voucher_no]) + self.assertEqual(expected, actual) + + # Without ignore_cr_dr_notes + expected = set([si.name, cr_note.name]) + columns, data = execute( + frappe._dict( + { + "company": si.company, + "from_date": si.posting_date, + "to_date": si.posting_date, + "account": [si.debit_to], + "group_by": "Group by Voucher (Consolidated)", + "ignore_cr_dr_notes": True, + } + ) + ) + actual = set([x.voucher_no for x in data if x.voucher_no]) + self.assertEqual(expected, actual) -- GitLab From 0a532e029f4b8593e7821745a052d45bea7c09da Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Mon, 5 Aug 2024 09:58:50 +0530 Subject: [PATCH 4/7] refactor: make use of date filters on ignore filterss --- erpnext/accounts/report/general_ledger/general_ledger.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/erpnext/accounts/report/general_ledger/general_ledger.py b/erpnext/accounts/report/general_ledger/general_ledger.py index 3c02b53984..f41e50b54a 100644 --- a/erpnext/accounts/report/general_ledger/general_ledger.py +++ b/erpnext/accounts/report/general_ledger/general_ledger.py @@ -266,6 +266,7 @@ def get_conditions(filters): "company": filters.get("company"), "docstatus": 1, "voucher_type": ("in", ["Exchange Rate Revaluation", "Exchange Gain Or Loss"]), + "posting_date": ["between", [filters.get("from_date"), filters.get("to_date")]], }, as_list=True, ) @@ -280,6 +281,7 @@ def get_conditions(filters): "docstatus": 1, "voucher_type": ("in", ["Credit Note", "Debit Note"]), "is_system_generated": 1, + "posting_date": ["between", [filters.get("from_date"), filters.get("to_date")]], }, as_list=True, ) -- GitLab From 6da98133bc7e1e81983e7566e065c35f1693f9ef Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Mon, 5 Aug 2024 10:23:52 +0530 Subject: [PATCH 5/7] test: clear old data --- .../accounts/report/general_ledger/test_general_ledger.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/erpnext/accounts/report/general_ledger/test_general_ledger.py b/erpnext/accounts/report/general_ledger/test_general_ledger.py index 682eef8f41..094da52e68 100644 --- a/erpnext/accounts/report/general_ledger/test_general_ledger.py +++ b/erpnext/accounts/report/general_ledger/test_general_ledger.py @@ -2,6 +2,7 @@ # MIT License. See license.txt import frappe +from frappe import qb from frappe.tests.utils import FrappeTestCase from frappe.utils import flt, today @@ -252,6 +253,10 @@ class TestGeneralLedger(FrappeTestCase): self.assertIn(revaluation_jv.name, set([x.voucher_no for x in data])) def test_ignore_cr_dr_notes_filter(self): + # Clear old data + sinv_doctype = qb.DocType("Sales Invoice") + qb.from_(sinv_doctype).delete().where(sinv_doctype.company.eq("_Test Company")).run() + si = create_sales_invoice() cr_note = make_return_doc(si.doctype, si.name) -- GitLab From e08fb8248090c1c899f11d7065017944dafb564c Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Mon, 5 Aug 2024 10:46:35 +0530 Subject: [PATCH 6/7] refactor(test): filter and reconcile concerned vouchers --- .../report/general_ledger/test_general_ledger.py | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/erpnext/accounts/report/general_ledger/test_general_ledger.py b/erpnext/accounts/report/general_ledger/test_general_ledger.py index 094da52e68..1a935bd05d 100644 --- a/erpnext/accounts/report/general_ledger/test_general_ledger.py +++ b/erpnext/accounts/report/general_ledger/test_general_ledger.py @@ -253,10 +253,6 @@ class TestGeneralLedger(FrappeTestCase): self.assertIn(revaluation_jv.name, set([x.voucher_no for x in data])) def test_ignore_cr_dr_notes_filter(self): - # Clear old data - sinv_doctype = qb.DocType("Sales Invoice") - qb.from_(sinv_doctype).delete().where(sinv_doctype.company.eq("_Test Company")).run() - si = create_sales_invoice() cr_note = make_return_doc(si.doctype, si.name) @@ -269,17 +265,12 @@ class TestGeneralLedger(FrappeTestCase): pr.receivable_payable_account = si.debit_to pr.get_unreconciled_entries() - self.assertEqual(len(pr.invoices), 1) - self.assertEqual(len(pr.payments), 1) - invoices = [invoice.as_dict() for invoice in pr.invoices] - payments = [payment.as_dict() for payment in pr.payments] + invoices = [invoice.as_dict() for invoice in pr.invoices if invoice.invoice_number == si.name] + payments = [payment.as_dict() for payment in pr.payments if payment.reference_name == cr_note.name] pr.allocate_entries(frappe._dict({"invoices": invoices, "payments": payments})) pr.reconcile() - self.assertEqual(len(pr.invoices), 0) - self.assertEqual(len(pr.payments), 0) - system_generated_journal = frappe.db.get_all( "Journal Entry", filters={ -- GitLab From 123bc3130630bb7adbe42c50b6da044aad86bb69 Mon Sep 17 00:00:00 2001 From: ruthra kumar Date: Mon, 5 Aug 2024 13:25:43 +0530 Subject: [PATCH 7/7] refactor(test): clear old records on GL report tests --- .../general_ledger/test_general_ledger.py | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/erpnext/accounts/report/general_ledger/test_general_ledger.py b/erpnext/accounts/report/general_ledger/test_general_ledger.py index 75f94309bc..cbd28d1d0a 100644 --- a/erpnext/accounts/report/general_ledger/test_general_ledger.py +++ b/erpnext/accounts/report/general_ledger/test_general_ledger.py @@ -9,6 +9,22 @@ from erpnext.accounts.report.general_ledger.general_ledger import execute class TestGeneralLedger(FrappeTestCase): + def setUp(self): + self.company = "_Test Company" + self.clear_old_entries() + + def clear_old_entries(self): + doctype_list = [ + "GL Entry", + "Payment Ledger Entry", + "Sales Invoice", + "Purchase Invoice", + "Payment Entry", + "Journal Entry", + ] + for doctype in doctype_list: + qb.from_(qb.DocType(doctype)).delete().where(qb.DocType(doctype).company == self.company).run() + def test_foreign_account_balance_after_exchange_rate_revaluation(self): """ Checks the correctness of balance after exchange rate revaluation @@ -203,9 +219,7 @@ class TestGeneralLedger(FrappeTestCase): revaluation.extend("accounts", accounts) row = revaluation.accounts[0] row.new_exchange_rate = 83 - row.new_balance_in_base_currency = flt( - row.new_exchange_rate * flt(row.balance_in_account_currency) - ) + row.new_balance_in_base_currency = flt(row.new_exchange_rate * flt(row.balance_in_account_currency)) row.gain_loss = row.new_balance_in_base_currency - flt(row.balance_in_base_currency) revaluation.set_total_gain_loss() revaluation = revaluation.save().submit() -- GitLab