180 lines
5.8 KiB
Python
180 lines
5.8 KiB
Python
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"
|
||
)
|