diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.json b/erpnext/accounts/doctype/payment_entry/payment_entry.json index e27a1f79b8e..f911352c884 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.json +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.json @@ -20,6 +20,7 @@ "party", "party_name", "book_advance_payments_in_separate_party_account", + "reconcile_on_advance_payment_date", "column_break_11", "bank_account", "party_bank_account", @@ -751,6 +752,7 @@ "fieldtype": "Check", "hidden": 1, "label": "Book Advance Payments in Separate Party Account", + "no_copy": 1, "read_only": 1 }, { @@ -766,6 +768,16 @@ "label": "In Words", "print_hide": 1, "read_only": 1 + }, + { + "default": "0", + "fetch_from": "company.reconcile_on_advance_payment_date", + "fieldname": "reconcile_on_advance_payment_date", + "fieldtype": "Check", + "hidden": 1, + "label": "Reconcile on Advance Payment Date", + "no_copy": 1, + "read_only": 1 } ], "index_web_pages_for_search": 1, @@ -779,7 +791,7 @@ "table_fieldname": "payment_entries" } ], - "modified": "2024-04-11 11:25:07.366347", + "modified": "2024-05-17 10:21:11.199445", "modified_by": "Administrator", "module": "Accounts", "name": "Payment Entry", diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.py b/erpnext/accounts/doctype/payment_entry/payment_entry.py index 8daa13d6165..4e05afa6be9 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.py +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.py @@ -1344,13 +1344,16 @@ class PaymentEntry(AccountsController): "voucher_detail_no": invoice.name, } - date_field = "posting_date" - if invoice.reference_doctype in ["Sales Order", "Purchase Order"]: - date_field = "transaction_date" - posting_date = frappe.db.get_value(invoice.reference_doctype, invoice.reference_name, date_field) - - if getdate(posting_date) < getdate(self.posting_date): + if self.reconcile_on_advance_payment_date: posting_date = self.posting_date + else: + date_field = "posting_date" + if invoice.reference_doctype in ["Sales Order", "Purchase Order"]: + date_field = "transaction_date" + posting_date = frappe.db.get_value(invoice.reference_doctype, invoice.reference_name, date_field) + + if getdate(posting_date) < getdate(self.posting_date): + posting_date = self.posting_date dr_or_cr, account = self.get_dr_and_account_for_advances(invoice) args_dict["account"] = account diff --git a/erpnext/accounts/doctype/payment_reconciliation/test_payment_reconciliation.py b/erpnext/accounts/doctype/payment_reconciliation/test_payment_reconciliation.py index 0a3a0678084..53f69a47e75 100644 --- a/erpnext/accounts/doctype/payment_reconciliation/test_payment_reconciliation.py +++ b/erpnext/accounts/doctype/payment_reconciliation/test_payment_reconciliation.py @@ -1525,6 +1525,55 @@ class TestPaymentReconciliation(FrappeTestCase): ] self.assertEqual(pl_entries, expected_ple) + def test_advance_payment_reconciliation_date(self): + frappe.db.set_value( + "Company", + self.company, + { + "book_advance_payments_in_separate_party_account": 1, + "default_advance_paid_account": self.advance_payable_account, + "reconcile_on_advance_payment_date": 1, + }, + ) + + self.supplier = "_Test Supplier" + amount = 1500 + + pe = self.create_payment_entry(amount=amount) + pe.posting_date = add_days(nowdate(), -1) + pe.party_type = "Supplier" + pe.party = self.supplier + pe.payment_type = "Pay" + pe.paid_from = self.cash + pe.paid_to = self.advance_payable_account + pe.save().submit() + + pi = self.create_purchase_invoice(qty=10, rate=100) + self.assertNotEqual(pe.posting_date, pi.posting_date) + + pr = self.create_payment_reconciliation(party_is_customer=False) + pr.default_advance_account = self.advance_payable_account + pr.from_payment_date = pe.posting_date + 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() + + # Assert Ledger Entries + gl_entries = frappe.db.get_all( + "GL Entry", + filters={"voucher_no": pe.name, "is_cancelled": 0, "posting_date": pe.posting_date}, + ) + self.assertEqual(len(gl_entries), 4) + pl_entries = frappe.db.get_all( + "Payment Ledger Entry", + filters={"voucher_no": pe.name, "delinked": 0, "posting_date": pe.posting_date}, + ) + self.assertEqual(len(pl_entries), 3) + def make_customer(customer_name, currency=None): if not frappe.db.exists("Customer", customer_name): diff --git a/erpnext/setup/doctype/company/company.json b/erpnext/setup/doctype/company/company.json index 8c5a34ef804..7b552d8a061 100644 --- a/erpnext/setup/doctype/company/company.json +++ b/erpnext/setup/doctype/company/company.json @@ -67,6 +67,7 @@ "default_finance_book", "advance_payments_section", "book_advance_payments_in_separate_party_account", + "reconcile_on_advance_payment_date", "column_break_fwcf", "default_advance_received_account", "default_advance_paid_account", @@ -763,6 +764,14 @@ "fieldtype": "Tab Break", "label": "Dashboard", "show_dashboard": 1 + }, + { + "default": "0", + "depends_on": "eval: doc.book_advance_payments_in_separate_party_account", + "description": "If Enabled - Reconciliation happens on the Advance Payment posting date
\nIf Disabled - Reconciliation happens on oldest of 2 Dates: Invoice Date or the Advance Payment posting date
\n", + "fieldname": "reconcile_on_advance_payment_date", + "fieldtype": "Check", + "label": "Reconcile on Advance Payment Date" } ], "icon": "fa fa-building", @@ -770,7 +779,7 @@ "image_field": "company_logo", "is_tree": 1, "links": [], - "modified": "2024-04-23 12:38:33.173938", + "modified": "2024-05-16 12:39:54.694232", "modified_by": "Administrator", "module": "Setup", "name": "Company", diff --git a/erpnext/setup/doctype/company/company.py b/erpnext/setup/doctype/company/company.py index f2d9bb74b92..44800dd5c3e 100644 --- a/erpnext/setup/doctype/company/company.py +++ b/erpnext/setup/doctype/company/company.py @@ -85,6 +85,7 @@ class Company(NestedSet): parent_company: DF.Link | None payment_terms: DF.Link | None phone_no: DF.Data | None + reconcile_on_advance_payment_date: DF.Check registration_details: DF.Code | None rgt: DF.Int round_off_account: DF.Link | None