# Copyright (c) 2023, Frappe Technologies Pvt. Ltd. and Contributors # License: MIT. See LICENSE import frappe from erpnext.accounts.doctype.account_closing_balance.account_closing_balance import ( make_closing_entries, ) from erpnext.accounts.utils import get_fiscal_year def execute(): frappe.db.truncate("Account Closing Balance") for company in frappe.get_all("Company", pluck="name"): i = 0 company_wise_order = {} for pcv in frappe.db.get_all( "Period Closing Voucher", fields=["company", "posting_date", "name"], filters={"docstatus": 1, "company": company}, order_by="posting_date", ): company_wise_order.setdefault(pcv.company, []) if pcv.posting_date not in company_wise_order[pcv.company]: pcv_doc = frappe.get_doc("Period Closing Voucher", pcv.name) pcv_doc.year_start_date = get_fiscal_year( pcv.posting_date, pcv.fiscal_year, company=pcv.company )[1] # get gl entries against pcv gl_entries = frappe.db.get_all( "GL Entry", filters={"voucher_no": pcv.name, "is_cancelled": 0}, fields=["*"] ) for entry in gl_entries: entry["is_period_closing_voucher_entry"] = 1 entry["closing_date"] = pcv_doc.posting_date entry["period_closing_voucher"] = pcv_doc.name closing_entries = [] if pcv.posting_date not in company_wise_order[pcv.company]: # get all gl entries for the year closing_entries = frappe.db.get_all( "GL Entry", filters={ "is_cancelled": 0, "voucher_no": ["!=", pcv.name], "posting_date": ["between", [pcv_doc.year_start_date, pcv.posting_date]], "is_opening": "No", "company": company, }, fields=["*"], ) if i == 0: # add opening entries only for the first pcv closing_entries += frappe.db.get_all( "GL Entry", filters={"is_cancelled": 0, "is_opening": "Yes", "company": company}, fields=["*"], ) for entry in closing_entries: entry["closing_date"] = pcv_doc.posting_date entry["period_closing_voucher"] = pcv_doc.name entries = gl_entries + closing_entries make_closing_entries(entries, pcv.name, pcv.company, pcv.posting_date) company_wise_order[pcv.company].append(pcv.posting_date) i += 1