jey_erp/jey_erp/setup/setup_wizard_handler.py

180 lines
5.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import json
import os
import frappe
SALARY_COMPONENTS_JSON = os.path.join(
os.path.dirname(os.path.dirname(__file__)),
"default_data",
"salary_components.json",
)
LEAVE_TYPES_JSON = os.path.join(
os.path.dirname(os.path.dirname(__file__)),
"default_data",
"leave_types.json",
)
COMPANY_DEFAULTS_JSON = os.path.join(
os.path.dirname(os.path.dirname(__file__)),
"default_data",
"company_defaults.json",
)
HRMS_DEFAULT_COMPONENTS = ["Basic", "Arrear", "Leave Encashment", "Income Tax"]
HRMS_DEFAULT_LEAVE_TYPES = [
"Casual Leave", "Compensatory Off", "Sick Leave", "Privilege Leave", "Leave Without Pay"
]
def create_default_salary_components(args):
if not os.path.exists(SALARY_COMPONENTS_JSON):
return
company = args.get("company_name") or frappe.db.get_single_value("Global Defaults", "default_company")
with open(SALARY_COMPONENTS_JSON, encoding="utf-8") as f:
components = json.load(f)
for data in components:
name = data.get("salary_component")
if not name or frappe.db.exists("Salary Component", name):
continue
data["doctype"] = "Salary Component"
# Резолвим account_name → полное имя счёта в целевой компании
accounts = []
for row in data.get("accounts") or []:
account_name = row.get("account")
if account_name and company:
full_account = frappe.db.get_value(
"Account", {"account_name": account_name, "company": company}, "name"
)
if full_account:
accounts.append({"company": company, "account": full_account})
data["accounts"] = accounts
frappe.get_doc(data).insert(ignore_permissions=True)
for name in HRMS_DEFAULT_COMPONENTS:
if frappe.db.exists("Salary Component", name):
frappe.delete_doc("Salary Component", name, ignore_permissions=True)
frappe.db.commit()
def create_default_leave_types(args):
if not os.path.exists(LEAVE_TYPES_JSON):
return
with open(LEAVE_TYPES_JSON, encoding="utf-8") as f:
leave_types = json.load(f)
for data in leave_types:
name = data.get("leave_type_name")
if not name or frappe.db.exists("Leave Type", name):
continue
data["doctype"] = "Leave Type"
frappe.get_doc(data).insert(ignore_permissions=True)
for name in HRMS_DEFAULT_LEAVE_TYPES:
if frappe.db.exists("Leave Type", name):
frappe.delete_doc("Leave Type", name, ignore_permissions=True)
frappe.db.commit()
def create_default_company_accounts(args):
if not os.path.exists(COMPANY_DEFAULTS_JSON):
return
company = args.get("company_name") or frappe.db.get_single_value("Global Defaults", "default_company")
if not company:
return
with open(COMPANY_DEFAULTS_JSON, encoding="utf-8") as f:
defaults = json.load(f)
doc = frappe.get_doc("Company", company)
updated = False
for fieldname, account_name in defaults.items():
full_account = frappe.db.get_value(
"Account", {"account_name": account_name, "company": company}, "name"
)
if full_account:
doc.set(fieldname, full_account)
updated = True
if updated:
doc.save(ignore_permissions=True)
frappe.db.commit()
def setup_wizard_complete_handler(args):
"""
Вызывается после завершения ERPNext setup wizard.
Ставит в очередь фоновую задачу для создания категорий активов.
Args:
args: Словарь с параметрами визарда, включая:
- company_name: Название созданной компании
- country: Выбранная страна
- currency: Валюта по умолчанию
"""
frappe.log_error(
f"Hook called\nArgs: {args}",
"AC Setup Hook"
)
company_name = args.get("company_name")
if not company_name:
# Fallback: получаем первую компанию
companies = frappe.get_all("Company", limit=1)
if companies:
company_name = companies[0].name
frappe.log_error(
f"Company name not in args, using fallback\nCompanies found: {companies}\nUsing: {company_name}",
"AC Setup Fallback"
)
else:
frappe.log_error(
"Company name not found in setup wizard args and no companies exist in database",
"AC Setup ERROR"
)
return
# Ставим в очередь фоновую задачу (некритично, не блокирует визард)
try:
frappe.enqueue(
"jey_erp.custom.create_asset_categories.create_asset_categories_for_company",
queue="default",
timeout=300,
enqueue_after_commit=True,
at_front=False, # Некритично, может подождать
company_name=company_name
)
frappe.log_error(
f"Background task enqueued successfully\nCompany: {company_name}\nQueue: default\nTimeout: 300s",
"AC Task Enqueued"
)
except Exception as e:
import traceback
frappe.log_error(
f"Failed to enqueue background task\nCompany: {company_name}\nError: {str(e)}\n\nTraceback:\n{traceback.format_exc()}",
"AC Enqueue ERROR"
)
raise
frappe.msgprint(
f"Категории активов будут созданы в фоновом режиме для {company_name}",
title="Настройка выполняется",
indicator="blue"
)