diff --git a/erpnext/accounts/doctype/payment_entry/payment_entry.py b/erpnext/accounts/doctype/payment_entry/payment_entry.py index 5249f171fb8..7012eacb61e 100644 --- a/erpnext/accounts/doctype/payment_entry/payment_entry.py +++ b/erpnext/accounts/doctype/payment_entry/payment_entry.py @@ -106,6 +106,12 @@ class PaymentEntry(AccountsController): root_type == "Asset" and self.party_type == "Supplier" ): return + if self.unallocated_amount == 0: + for d in self.references: + if d.reference_doctype in ["Sales Order", "Purchase Order"]: + break + else: + return liability_account = get_party_account( self.party_type, self.party, self.company, include_advance=True )[1] @@ -1694,7 +1700,7 @@ def get_outstanding_on_journal_entry(name): @frappe.whitelist() def get_reference_details(reference_doctype, reference_name, party_account_currency): - total_amount = outstanding_amount = exchange_rate = None + total_amount = outstanding_amount = exchange_rate = account = None ref_doc = frappe.get_doc(reference_doctype, reference_name) company_currency = ref_doc.get("company_currency") or erpnext.get_company_currency( diff --git a/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.js b/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.js index a40e6f274f6..e46c81b9edc 100644 --- a/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.js +++ b/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.js @@ -34,7 +34,7 @@ erpnext.accounts.PaymentReconciliationController = class PaymentReconciliationCo filters: { "company": this.frm.doc.company, "is_group": 0, - "root_type": (this.frm.party_type == 'Customer') ? "Liability": "Asset" + "root_type": this.frm.doc.party_type == 'Customer' ? "Liability": "Asset" } }; }); diff --git a/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py b/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py index e7d7f2c1e47..e5fb3df1a4e 100644 --- a/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py +++ b/erpnext/accounts/doctype/payment_reconciliation/payment_reconciliation.py @@ -60,16 +60,7 @@ class PaymentReconciliation(Document): self.add_payment_entries(non_reconciled_payments) def get_payment_entries(self): - advance_accounts = [] - if self.party_type == "Customer": - advance_accounts = frappe.db.get_list( - "Account", filters={"root_type": "Liability", "company": self.company}, pluck="name" - ) - elif self.party_type == "Supplier": - advance_accounts = frappe.db.get_list( - "Account", filters={"root_type": "Asset", "company": self.company}, pluck="name" - ) - party_account = [self.receivable_payable_account] + advance_accounts + party_account = [self.receivable_payable_account, self.default_advance_account] order_doctype = "Sales Order" if self.party_type == "Customer" else "Purchase Order" condition = frappe._dict( diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py index dfea8e9049d..0f3b12b3ef2 100644 --- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py @@ -33,8 +33,10 @@ from erpnext.accounts.utils import get_account_currency, get_fiscal_year from erpnext.assets.doctype.asset.asset import get_asset_account, is_cwip_accounting_enabled from erpnext.assets.doctype.asset_category.asset_category import get_asset_category_account from erpnext.buying.utils import check_on_hold_or_closed_status -from erpnext.controllers.accounts_controller import validate_account_head -from erpnext.controllers.accounts_controller import make_advance_liability_entry +from erpnext.controllers.accounts_controller import ( + check_advance_liability_entry, + validate_account_head, +) from erpnext.controllers.buying_controller import BuyingController from erpnext.stock import get_warehouse_account_map from erpnext.stock.doctype.purchase_receipt.purchase_receipt import ( @@ -581,11 +583,14 @@ class PurchaseInvoice(BuyingController): gl_entries = [] self.make_supplier_gl_entry(gl_entries) - - advance_payments_as_liability = frappe.db.get_value("Company", {"company_name": self.company}, "book_advance_payments_as_liability") - if advance_payments_as_liability: - for advance_entry in self.advances: - make_advance_liability_entry(gl_entries, advance_entry.reference_name, advance_entry.allocated_amount, invoice=self.name, party_type="Supplier") + + check_advance_liability_entry( + gl_entries, + company=self.company, + advances=self.advances, + invoice=self.name, + party_type="Supplier", + ) self.make_item_gl_entries(gl_entries) self.make_precision_loss_gl_entry(gl_entries) diff --git a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py index 9ade46e045b..c15692b751b 100644 --- a/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py +++ b/erpnext/accounts/doctype/purchase_invoice/test_purchase_invoice.py @@ -1669,7 +1669,7 @@ class TestPurchaseInvoice(unittest.TestCase, StockTestMixin): frappe.db.set_value( "Company", "_Test Company", - {"book_advance_payments_as_liability": 1, "default_advance_account": "Debtors - _TC"}, + {"book_advance_payments_as_liability": 1, "default_advance_paid_account": "Debtors - _TC"}, ) pe = create_payment_entry( company="_Test Company", @@ -1722,6 +1722,7 @@ def check_gl_entries(doc, voucher_no, expected_gle, posting_date): doc.assertEqual(expected_gle[i][0], gle.account) doc.assertEqual(expected_gle[i][1], gle.debit) doc.assertEqual(expected_gle[i][2], gle.credit) + doc.assertEqual(getdate(expected_gle[i][3]), gle.posting_date) def create_tax_witholding_category(category_name, company, account): diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index 419628eaffc..d43e6e8c59e 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -32,8 +32,10 @@ from erpnext.assets.doctype.asset.depreciation import ( reset_depreciation_schedule, reverse_depreciation_entry_made_after_disposal, ) -from erpnext.controllers.accounts_controller import validate_account_head -from erpnext.controllers.accounts_controller import make_advance_liability_entry +from erpnext.controllers.accounts_controller import ( + check_advance_liability_entry, + validate_account_head, +) from erpnext.controllers.selling_controller import SellingController from erpnext.projects.doctype.timesheet.timesheet import get_projectwise_timesheet_data from erpnext.setup.doctype.company.company import update_company_current_month_sales @@ -1065,11 +1067,14 @@ class SalesInvoice(SellingController): gl_entries = [] self.make_customer_gl_entry(gl_entries) - - advance_payments_as_liability = frappe.db.get_value("Company", {"company_name": self.company}, "book_advance_payments_as_liability") - if advance_payments_as_liability: - for advance_entry in self.advances: - make_advance_liability_entry(gl_entries, advance_entry.reference_name, advance_entry.allocated_amount, invoice=self.name, party_type="Customer") + + check_advance_liability_entry( + gl_entries, + company=self.company, + advances=self.advances, + invoice=self.name, + party_type="Customer", + ) self.make_tax_gl_entries(gl_entries) self.make_exchange_gain_loss_gl_entries(gl_entries) diff --git a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py index 364bf6898a9..54c8b8472e2 100644 --- a/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/test_sales_invoice.py @@ -3320,7 +3320,10 @@ class TestSalesInvoice(unittest.TestCase): frappe.db.set_value( "Company", "_Test Company", - {"book_advance_payments_as_liability": 1, "default_advance_account": "Creditors - _TC"}, + { + "book_advance_payments_as_liability": 1, + "default_advance_received_account": "Creditors - _TC", + }, ) pe = create_payment_entry( company="_Test Company", @@ -3408,6 +3411,7 @@ def check_gl_entries(doc, voucher_no, expected_gle, posting_date): doc.assertEqual(expected_gle[i][0], gle.account) doc.assertEqual(expected_gle[i][1], gle.debit) doc.assertEqual(expected_gle[i][2], gle.credit) + doc.assertEqual(getdate(expected_gle[i][3]), gle.posting_date) def create_sales_invoice(**args): diff --git a/erpnext/accounts/party.py b/erpnext/accounts/party.py index ccd54b344fd..1e38217a167 100644 --- a/erpnext/accounts/party.py +++ b/erpnext/accounts/party.py @@ -429,7 +429,12 @@ def get_party_advance_account(party_type, party, company): ) if not account: - account = frappe.get_cached_value("Company", company, "default_advance_account") + account_name = ( + "default_advance_received_account" + if party_type == "Customer" + else "default_advance_paid_account" + ) + account = frappe.get_cached_value("Company", company, account_name) return account diff --git a/erpnext/controllers/accounts_controller.py b/erpnext/controllers/accounts_controller.py index d8c41352926..3fac56cfa2b 100644 --- a/erpnext/controllers/accounts_controller.py +++ b/erpnext/controllers/accounts_controller.py @@ -2908,16 +2908,6 @@ def update_child_qty_rate(parent_doctype, trans_items, parent_doctype_name, chil parent.create_stock_reservation_entries() -@erpnext.allow_regional -def validate_regional(doc): - pass - - -@erpnext.allow_regional -def validate_einvoice_fields(doc): - pass - - def make_advance_liability_entry( gl_entries, pe, allocated_amount, invoice, party_type, references=False ): @@ -2990,3 +2980,33 @@ def make_advance_liability_entry( item=invoice, ) ) + + +def check_advance_liability_entry(gl_entries, company, advances, invoice, party_type): + advance_payments_as_liability = frappe.db.get_value( + "Company", {"company_name": company}, "book_advance_payments_as_liability" + ) + if advance_payments_as_liability: + for advance_entry in advances: + make_advance_liability_entry( + gl_entries, + advance_entry.reference_name, + advance_entry.allocated_amount, + invoice=invoice, + party_type=party_type, + ) + + +@erpnext.allow_regional +def validate_regional(doc): + pass + + +@erpnext.allow_regional +def validate_einvoice_fields(doc): + pass + + +@erpnext.allow_regional +def update_gl_dict_with_regional_fields(doc, gl_dict): + pass diff --git a/erpnext/setup/doctype/company/company.js b/erpnext/setup/doctype/company/company.js index fb0ee7f07a5..436fe0595a6 100644 --- a/erpnext/setup/doctype/company/company.js +++ b/erpnext/setup/doctype/company/company.js @@ -227,7 +227,8 @@ erpnext.company.setup_queries = function(frm) { ["asset_received_but_not_billed", {"account_type": "Asset Received But Not Billed"}], ["unrealized_profit_loss_account", {"root_type": ["in", ["Liability", "Asset"]]}], ["default_provisional_account", {"root_type": ["in", ["Liability", "Asset"]]}], - ["default_advance_account", {"root_type": ["in", ["Liability", "Asset"]]}], + ["default_advance_received_account", {"root_type": "Liability"}], + ["default_advance_paid_account", {"root_type": "Asset"}], ], function(i, v) { erpnext.company.set_custom_query(frm, v); }); diff --git a/erpnext/setup/doctype/company/company.json b/erpnext/setup/doctype/company/company.json index 5b3d3bb0864..3523af1988f 100644 --- a/erpnext/setup/doctype/company/company.json +++ b/erpnext/setup/doctype/company/company.json @@ -72,7 +72,8 @@ "default_finance_book", "advance_payments_section", "book_advance_payments_as_liability", - "default_advance_account", + "default_advance_received_account", + "default_advance_paid_account", "column_break_cui0", "auto_accounting_for_stock_settings", "enable_perpetual_inventory", @@ -716,9 +717,17 @@ }, { "depends_on": "eval:doc.book_advance_payments_as_liability", - "fieldname": "default_advance_account", + "fieldname": "default_advance_received_account", "fieldtype": "Link", - "label": "Default Account", + "label": "Default Advance Received Account", + "mandatory_depends_on": "book_advance_payments_as_liability", + "options": "Account" + }, + { + "depends_on": "eval:doc.book_advance_payments_as_liability", + "fieldname": "default_advance_paid_account", + "fieldtype": "Link", + "label": "Default Advance Paid Account", "mandatory_depends_on": "book_advance_payments_as_liability", "options": "Account" } @@ -728,7 +737,7 @@ "image_field": "company_logo", "is_tree": 1, "links": [], - "modified": "2023-06-05 14:12:37.946451", + "modified": "2023-06-12 12:51:12.007410", "modified_by": "Administrator", "module": "Setup", "name": "Company",