diff --git a/erpnext/accounts/doctype/accounts_settings/accounts_settings.json b/erpnext/accounts/doctype/accounts_settings/accounts_settings.json index 16c5479c210..cb7e493e28c 100644 --- a/erpnext/accounts/doctype/accounts_settings/accounts_settings.json +++ b/erpnext/accounts/doctype/accounts_settings/accounts_settings.json @@ -73,6 +73,7 @@ "reports_tab", "remarks_section", "general_ledger_remarks_length", + "ignore_is_opening_check_for_reporting", "column_break_lvjk", "receivable_payable_remarks_length" ], @@ -465,12 +466,72 @@ "label": "Remarks Column Length" }, { +<<<<<<< HEAD "default": "Payment", "description": "Only applies for Normal Payments", "fieldname": "exchange_gain_loss_posting_date", "fieldtype": "Select", "label": "Posting Date Inheritance for Exchange Gain / Loss", "options": "Invoice\nPayment\nReconciliation Date" +======= + "default": "0", + "description": "On enabling this cancellation entries will be posted on the actual cancellation date and reports will consider cancelled entries as well", + "fieldname": "enable_immutable_ledger", + "fieldtype": "Check", + "label": "Enable Immutable Ledger" + }, + { + "fieldname": "column_break_gjcc", + "fieldtype": "Column Break" + }, + { + "default": "0", + "description": "Enable this option to calculate daily depreciation by considering the total number of days in the entire depreciation period, (including leap years) while using daily pro-rata based depreciation", + "fieldname": "calculate_depr_using_total_days", + "fieldtype": "Check", + "label": "Calculate daily depreciation using total days in depreciation period" + }, + { + "description": "Payment Request created from Sales Order or Purchase Order will be in Draft status. When disabled document will be in unsaved state.", + "fieldname": "payment_request_settings", + "fieldtype": "Tab Break", + "label": "Payment Request" + }, + { + "default": "1", + "fieldname": "create_pr_in_draft_status", + "fieldtype": "Check", + "label": "Create in Draft Status" + }, + { + "fieldname": "column_break_yuug", + "fieldtype": "Column Break" + }, + { + "fieldname": "column_break_resa", + "fieldtype": "Column Break" + }, + { + "default": "15", + "description": "Interval should be between 1 to 59 MInutes", + "fieldname": "auto_reconciliation_job_trigger", + "fieldtype": "Int", + "label": "Auto Reconciliation Job Trigger" + }, + { + "default": "5", + "description": "Documents Processed on each trigger. Queue Size should be between 5 and 100", + "fieldname": "reconciliation_queue_size", + "fieldtype": "Int", + "label": "Reconciliation Queue Size" + }, + { + "default": "0", + "description": "Ignores legacy Is Opening field in GL Entry that allows adding opening balance post the system is in use while generating reports", + "fieldname": "ignore_is_opening_check_for_reporting", + "fieldtype": "Check", + "label": "Ignore Is Opening check for reporting" +>>>>>>> 993f40fa43 (perf: Ignore is_opening column in GL Queries (#45327)) } ], "icon": "icon-cog", @@ -478,7 +539,11 @@ "index_web_pages_for_search": 1, "issingle": 1, "links": [], +<<<<<<< HEAD "modified": "2025-01-23 13:15:44.077853", +======= + "modified": "2025-01-18 21:24:19.840745", +>>>>>>> 993f40fa43 (perf: Ignore is_opening column in GL Queries (#45327)) "modified_by": "Administrator", "module": "Accounts", "name": "Accounts Settings", diff --git a/erpnext/accounts/doctype/accounts_settings/accounts_settings.py b/erpnext/accounts/doctype/accounts_settings/accounts_settings.py index ac3d44bb5e7..d9fcd33b1b0 100644 --- a/erpnext/accounts/doctype/accounts_settings/accounts_settings.py +++ b/erpnext/accounts/doctype/accounts_settings/accounts_settings.py @@ -14,6 +14,61 @@ from erpnext.stock.utils import check_pending_reposting class AccountsSettings(Document): +<<<<<<< HEAD +======= + # begin: auto-generated types + # This code is auto-generated. Do not modify anything in this block. + + from typing import TYPE_CHECKING + + if TYPE_CHECKING: + from frappe.types import DF + + acc_frozen_upto: DF.Date | None + add_taxes_from_item_tax_template: DF.Check + allow_multi_currency_invoices_against_single_party_account: DF.Check + allow_stale: DF.Check + auto_reconcile_payments: DF.Check + auto_reconciliation_job_trigger: DF.Int + automatically_fetch_payment_terms: DF.Check + automatically_process_deferred_accounting_entry: DF.Check + book_asset_depreciation_entry_automatically: DF.Check + book_deferred_entries_based_on: DF.Literal["Days", "Months"] + book_deferred_entries_via_journal_entry: DF.Check + book_tax_discount_loss: DF.Check + calculate_depr_using_total_days: DF.Check + check_supplier_invoice_uniqueness: DF.Check + create_pr_in_draft_status: DF.Check + credit_controller: DF.Link | None + delete_linked_ledger_entries: DF.Check + determine_address_tax_category_from: DF.Literal["Billing Address", "Shipping Address"] + enable_common_party_accounting: DF.Check + enable_fuzzy_matching: DF.Check + enable_immutable_ledger: DF.Check + enable_party_matching: DF.Check + frozen_accounts_modifier: DF.Link | None + general_ledger_remarks_length: DF.Int + ignore_account_closing_balance: DF.Check + ignore_is_opening_check_for_reporting: DF.Check + make_payment_via_journal_entry: DF.Check + merge_similar_account_heads: DF.Check + over_billing_allowance: DF.Currency + post_change_gl_entries: DF.Check + receivable_payable_remarks_length: DF.Int + reconciliation_queue_size: DF.Int + role_allowed_to_over_bill: DF.Link | None + round_row_wise_tax: DF.Check + show_balance_in_coa: DF.Check + show_inclusive_tax_in_print: DF.Check + show_payment_schedule_in_print: DF.Check + show_taxes_as_table_in_print: DF.Check + stale_days: DF.Int + submit_journal_entries: DF.Check + unlink_advance_payment_on_cancelation_of_order: DF.Check + unlink_payment_on_cancellation_of_invoice: DF.Check + # end: auto-generated types + +>>>>>>> 993f40fa43 (perf: Ignore is_opening column in GL Queries (#45327)) def validate(self): old_doc = self.get_doc_before_save() clear_cache = False diff --git a/erpnext/accounts/report/financial_statements.py b/erpnext/accounts/report/financial_statements.py index 02f9c827b52..cd70639d2f0 100644 --- a/erpnext/accounts/report/financial_statements.py +++ b/erpnext/accounts/report/financial_statements.py @@ -512,12 +512,16 @@ def get_accounting_entries( .where(gl_entry.company == filters.company) ) + ignore_is_opening = frappe.db.get_single_value( + "Accounts Settings", "ignore_is_opening_check_for_reporting" + ) + if doctype == "GL Entry": query = query.select(gl_entry.posting_date, gl_entry.is_opening, gl_entry.fiscal_year) query = query.where(gl_entry.is_cancelled == 0) query = query.where(gl_entry.posting_date <= to_date) - if ignore_opening_entries: + if ignore_opening_entries and not ignore_is_opening: query = query.where(gl_entry.is_opening == "No") else: query = query.select(gl_entry.closing_date.as_("posting_date")) diff --git a/erpnext/accounts/report/general_ledger/general_ledger.py b/erpnext/accounts/report/general_ledger/general_ledger.py index 0436dc51214..aa06dffb043 100644 --- a/erpnext/accounts/report/general_ledger/general_ledger.py +++ b/erpnext/accounts/report/general_ledger/general_ledger.py @@ -209,6 +209,10 @@ def get_gl_entries(filters, accounting_dimensions): def get_conditions(filters): conditions = [] + ignore_is_opening = frappe.db.get_single_value( + "Accounts Settings", "ignore_is_opening_check_for_reporting" + ) + if filters.get("account"): filters.account = get_accounts_with_children(filters.account) if filters.account: @@ -268,9 +272,15 @@ def get_conditions(filters): or filters.get("party") or filters.get("group_by") in ["Group by Account", "Group by Party"] ): - conditions.append("(posting_date >=%(from_date)s or is_opening = 'Yes')") + if not ignore_is_opening: + conditions.append("(posting_date >=%(from_date)s or is_opening = 'Yes')") + else: + conditions.append("posting_date >=%(from_date)s") - conditions.append("(posting_date <=%(to_date)s or is_opening = 'Yes')") + if not ignore_is_opening: + conditions.append("(posting_date <=%(to_date)s or is_opening = 'Yes')") + else: + conditions.append("posting_date <=%(to_date)s") if filters.get("project"): conditions.append("project in %(project)s") diff --git a/erpnext/accounts/report/trial_balance/trial_balance.json b/erpnext/accounts/report/trial_balance/trial_balance.json index 8ed96a7161a..af586f7f17d 100644 --- a/erpnext/accounts/report/trial_balance/trial_balance.json +++ b/erpnext/accounts/report/trial_balance/trial_balance.json @@ -14,14 +14,14 @@ "owner": "Administrator", "ref_doctype": "GL Entry", "report_name": "Trial Balance", - "report_type": "Script Report", + "report_type": "Script Report", "roles": [ { "role": "Accounts User" - }, + }, { "role": "Accounts Manager" - }, + }, { "role": "Auditor" } diff --git a/erpnext/accounts/report/trial_balance/trial_balance.py b/erpnext/accounts/report/trial_balance/trial_balance.py index e65f479f056..4ae314bdff7 100644 --- a/erpnext/accounts/report/trial_balance/trial_balance.py +++ b/erpnext/accounts/report/trial_balance/trial_balance.py @@ -89,6 +89,10 @@ def get_data(filters): ) company_currency = filters.presentation_currency or erpnext.get_company_currency(filters.company) + ignore_is_opening = frappe.db.get_single_value( + "Accounts Settings", "ignore_is_opening_check_for_reporting" + ) + if not accounts: return None @@ -102,7 +106,7 @@ def get_data(filters): gl_entries_by_account = {} - opening_balances = get_opening_balances(filters) + opening_balances = get_opening_balances(filters, ignore_is_opening) # add filter inside list so that the query in financial_statements.py doesn't break if filters.project: @@ -120,7 +124,13 @@ def get_data(filters): ignore_opening_entries=True, ) - calculate_values(accounts, gl_entries_by_account, opening_balances, filters.get("show_net_values")) + calculate_values( + accounts, + gl_entries_by_account, + opening_balances, + filters.get("show_net_values"), + ignore_is_opening=ignore_is_opening, + ) accumulate_values_into_parents(accounts, accounts_by_name) data = prepare_data(accounts, filters, parent_children_map, company_currency) @@ -131,15 +141,15 @@ def get_data(filters): return data -def get_opening_balances(filters): - balance_sheet_opening = get_rootwise_opening_balances(filters, "Balance Sheet") - pl_opening = get_rootwise_opening_balances(filters, "Profit and Loss") +def get_opening_balances(filters, ignore_is_opening): + balance_sheet_opening = get_rootwise_opening_balances(filters, "Balance Sheet", ignore_is_opening) + pl_opening = get_rootwise_opening_balances(filters, "Profit and Loss", ignore_is_opening) balance_sheet_opening.update(pl_opening) return balance_sheet_opening -def get_rootwise_opening_balances(filters, report_type): +def get_rootwise_opening_balances(filters, report_type, ignore_is_opening): gle = [] last_period_closing_voucher = "" @@ -165,16 +175,24 @@ def get_rootwise_opening_balances(filters, report_type): report_type, accounting_dimensions, period_closing_voucher=last_period_closing_voucher[0].name, + ignore_is_opening=ignore_is_opening, ) # Report getting generate from the mid of a fiscal year if getdate(last_period_closing_voucher[0].posting_date) < getdate(add_days(filters.from_date, -1)): start_date = add_days(last_period_closing_voucher[0].posting_date, 1) gle += get_opening_balance( - "GL Entry", filters, report_type, accounting_dimensions, start_date=start_date + "GL Entry", + filters, + report_type, + accounting_dimensions, + start_date=start_date, + ignore_is_opening=ignore_is_opening, ) else: - gle = get_opening_balance("GL Entry", filters, report_type, accounting_dimensions) + gle = get_opening_balance( + "GL Entry", filters, report_type, accounting_dimensions, ignore_is_opening=ignore_is_opening + ) opening = frappe._dict() for d in gle: @@ -193,7 +211,13 @@ def get_rootwise_opening_balances(filters, report_type): def get_opening_balance( - doctype, filters, report_type, accounting_dimensions, period_closing_voucher=None, start_date=None + doctype, + filters, + report_type, + accounting_dimensions, + period_closing_voucher=None, + start_date=None, + ignore_is_opening=0, ): closing_balance = frappe.qb.DocType(doctype) account = frappe.qb.DocType("Account") @@ -229,11 +253,16 @@ def get_opening_balance( (closing_balance.posting_date >= start_date) & (closing_balance.posting_date < filters.from_date) ) - opening_balance = opening_balance.where(closing_balance.is_opening == "No") + + if not ignore_is_opening: + opening_balance = opening_balance.where(closing_balance.is_opening == "No") else: - opening_balance = opening_balance.where( - (closing_balance.posting_date < filters.from_date) | (closing_balance.is_opening == "Yes") - ) + if not ignore_is_opening: + opening_balance = opening_balance.where( + (closing_balance.posting_date < filters.from_date) | (closing_balance.is_opening == "Yes") + ) + else: + opening_balance = opening_balance.where(closing_balance.posting_date < filters.from_date) if doctype == "GL Entry": opening_balance = opening_balance.where(closing_balance.is_cancelled == 0) @@ -304,7 +333,7 @@ def get_opening_balance( return gle -def calculate_values(accounts, gl_entries_by_account, opening_balances, show_net_values): +def calculate_values(accounts, gl_entries_by_account, opening_balances, show_net_values, ignore_is_opening=0): init = { "opening_debit": 0.0, "opening_credit": 0.0, @@ -322,7 +351,7 @@ def calculate_values(accounts, gl_entries_by_account, opening_balances, show_net d["opening_credit"] = opening_balances.get(d.name, {}).get("opening_credit", 0) for entry in gl_entries_by_account.get(d.name, []): - if cstr(entry.is_opening) != "Yes": + if cstr(entry.is_opening) != "Yes" or ignore_is_opening: d["debit"] += flt(entry.debit) d["credit"] += flt(entry.credit)