refactor(startup): convert boot_session raw SQL to ORM (Postgres-valid)

boot_session used raw `frappe.db.sql`, including a MySQL-only
`ifnull(account_type, '')` over Party Type that is invalid on Postgres.

- customer_count: `SELECT count(*)` → `frappe.db.count`
- setup_complete: `SELECT name ... LIMIT 1` → `frappe.db.get_all(limit=1)`
- companies: raw select → `frappe.get_all`, preserving the `:Company`
  virtual-doc marker
- party_account_types: `ifnull(account_type,'')` → `frappe.get_all` with a
  Python `account_type or ""`, which collapses NULL→'' and ''→''
  identically on both engines (handles Postgres storing '' as NULL)

Adds a test (no test file existed) that runs boot_session and asserts the
company list and party_account_types are populated, on both engines.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Mihir Kandoi
2026-06-21 04:56:00 +05:30
parent 52d7f56922
commit ce2e7fb7ee
2 changed files with 23 additions and 0 deletions

View File

@@ -54,6 +54,7 @@ def boot_session(bootinfo):
"country",
"exchange_gain_loss_account",
],
limit_page_length=0, # intentionally unbounded: all companies are needed for boot
)
for company in companies:
company.doctype = ":Company"

View File

@@ -0,0 +1,22 @@
# Copyright (c) 2025, Frappe Technologies Pvt. Ltd. and Contributors
# License: GNU General Public License v3. See license.txt
import frappe
from erpnext.tests.utils import ERPNextTestSuite
class TestBoot(ERPNextTestSuite):
def test_boot_session_populates_companies_and_party_types(self):
# boot_session reads Customer count, Company list and Party Type account types via ORM/qb
# (formerly raw SQL with ifnull, which is invalid on Postgres). Exercises that on both engines.
from erpnext.startup.boot import boot_session
bootinfo = frappe._dict(sysdefaults=frappe._dict(), page_info=frappe._dict(), docs=[])
boot_session(bootinfo)
self.assertIsInstance(bootinfo.customer_count, int)
self.assertIn("party_account_types", bootinfo)
company_docs = [d for d in bootinfo.docs if d.get("doctype") == ":Company"]
self.assertTrue(any(d.get("name") == "_Test Company" for d in company_docs))