diff --git a/erpnext/accounts/doctype/period_closing_voucher/period_closing_voucher.py b/erpnext/accounts/doctype/period_closing_voucher/period_closing_voucher.py index e93fa8c140..831c343071 100644 --- a/erpnext/accounts/doctype/period_closing_voucher/period_closing_voucher.py +++ b/erpnext/accounts/doctype/period_closing_voucher/period_closing_voucher.py @@ -5,12 +5,12 @@ import frappe from frappe import _ from frappe.query_builder.functions import Sum -from frappe.utils import flt +from frappe.utils import add_days, flt from erpnext.accounts.doctype.accounting_dimension.accounting_dimension import ( get_accounting_dimensions, ) -from erpnext.accounts.utils import get_account_currency +from erpnext.accounts.utils import get_account_currency, get_fiscal_year, validate_fiscal_year from erpnext.controllers.accounts_controller import AccountsController @@ -72,8 +72,6 @@ class PeriodClosingVoucher(AccountsController): frappe.throw(_("Currency of the Closing Account must be {0}").format(company_currency)) def validate_posting_date(self): - from erpnext.accounts.utils import get_fiscal_year, validate_fiscal_year - validate_fiscal_year( self.posting_date, self.fiscal_year, self.company, label=_("Posting Date"), doc=self ) @@ -82,6 +80,8 @@ class PeriodClosingVoucher(AccountsController): self.posting_date, self.fiscal_year, company=self.company )[1] + self.check_if_previous_year_closed() + pce = frappe.db.sql( """select name from `tabPeriod Closing Voucher` where posting_date > %s and fiscal_year = %s and docstatus = 1 and company = %s""", @@ -94,6 +94,17 @@ class PeriodClosingVoucher(AccountsController): ) ) + def check_if_previous_year_closed(self): + last_year_closing = add_days(self.year_start_date, -1) + + previous_fiscal_year = get_fiscal_year(last_year_closing, company=self.company, boolean=True) + + if previous_fiscal_year and not frappe.db.exists( + "Period Closing Voucher", + {"posting_date": ("<=", last_year_closing), "docstatus": 1, "company": self.company}, + ): + frappe.throw(_("Previous Year is not closed, please close it first")) + def make_gl_entries(self, get_opening_entries=False): gl_entries = self.get_gl_entries() closing_entries = self.get_grouped_gl_entries(get_opening_entries=get_opening_entries) diff --git a/erpnext/accounts/report/financial_statements.py b/erpnext/accounts/report/financial_statements.py index d9c398004b..9bb05fda96 100644 --- a/erpnext/accounts/report/financial_statements.py +++ b/erpnext/accounts/report/financial_statements.py @@ -486,8 +486,6 @@ def get_accounting_entries( gl_entry.account, gl_entry.debit, gl_entry.credit, - gl_entry.is_opening, - gl_entry.fiscal_year, gl_entry.debit_in_account_currency, gl_entry.credit_in_account_currency, gl_entry.account_currency, @@ -498,7 +496,7 @@ def get_accounting_entries( query = query.where(gl_entry.account.isin(accounts)) if doctype == "GL Entry": - query = query.select(gl_entry.posting_date) + 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) else: diff --git a/erpnext/accounts/utils.py b/erpnext/accounts/utils.py index 005a2f176c..92906c189a 100644 --- a/erpnext/accounts/utils.py +++ b/erpnext/accounts/utils.py @@ -51,13 +51,25 @@ GL_REPOSTING_CHUNK = 100 @frappe.whitelist() def get_fiscal_year( - date=None, fiscal_year=None, label="Date", verbose=1, company=None, as_dict=False + date=None, fiscal_year=None, label="Date", verbose=1, company=None, as_dict=False, boolean=False ): - return get_fiscal_years(date, fiscal_year, label, verbose, company, as_dict=as_dict)[0] + fiscal_years = get_fiscal_years( + date, fiscal_year, label, verbose, company, as_dict=as_dict, boolean=boolean + ) + if boolean: + return fiscal_years + else: + return fiscal_years[0] def get_fiscal_years( - transaction_date=None, fiscal_year=None, label="Date", verbose=1, company=None, as_dict=False + transaction_date=None, + fiscal_year=None, + label="Date", + verbose=1, + company=None, + as_dict=False, + boolean=False, ): fiscal_years = frappe.cache().hget("fiscal_years", company) or [] @@ -121,8 +133,12 @@ def get_fiscal_years( if company: error_msg = _("""{0} for {1}""").format(error_msg, frappe.bold(company)) + if boolean: + return False + if verbose == 1: frappe.msgprint(error_msg) + raise FiscalYearError(error_msg)