monkey patched asset categories

This commit is contained in:
Ali 2026-01-10 03:44:28 +04:00
parent 7db5238874
commit 22d22f4529
3 changed files with 83 additions and 29 deletions

View File

@ -60,6 +60,54 @@ def get_account_by_name(account_name, company):
return account
def create_asset_categories_on_company_update(doc, method):
"""
Автоматически создает категории активов при создании компании.
Вызывается через doc_events на Company.on_update.
Это стандартный паттерн ERPNext (как создаются Warehouses, Departments, Cost Centers).
Args:
doc: Company document
method: "on_update"
"""
company_name = doc.name
# Идемпотентность: проверяем, есть ли уже системные категории
system_categories = get_system_asset_categories()
# Проверяем первую категорию из списка
if frappe.db.exists("Asset Category", {"asset_category_name": system_categories[0]}):
# Категории уже созданы (они создаются для всех компаний сразу)
frappe.log_error(
f"Asset categories already exist, skipping creation\nCompany: {company_name}\nFirst category found: {system_categories[0]}",
"AC Skip Existing"
)
return
# Логируем начало создания
frappe.log_error(
f"Creating asset categories automatically\nTriggered by: Company.on_update\nCompany: {company_name}",
"AC Auto Create"
)
try:
# Создаем категории
_create_categories_for_company(company_name)
frappe.log_error(
f"Asset categories created successfully\nCompany: {company_name}\nCategories: {len(system_categories)}",
"AC Created"
)
except Exception as e:
import traceback
frappe.log_error(
f"Failed to create asset categories\nCompany: {company_name}\nError: {str(e)}\n\nTraceback:\n{traceback.format_exc()}",
"AC Create Failed"
)
# Не пробрасываем исключение - не блокируем создание компании
def create_asset_categories_for_company(company_name):
"""
Создает категории активов для конкретной компании.

View File

@ -88,12 +88,19 @@ def diagnose():
print(" Логи не найдены")
# 5. Проверка хука
print("\n5. Проверка хука setup_wizard_complete:")
hooks = frappe.get_hooks("setup_wizard_complete")
if hooks:
print(f" ✓ Хук зарегистрирован: {hooks}")
print("\n5. Проверка doc_events на Company:")
company_events = frappe.get_hooks("doc_events", {}).get("Company", {})
on_update_hooks = company_events.get("on_update", [])
if on_update_hooks:
print(f" ✓ Company.on_update хуки зарегистрированы:")
if isinstance(on_update_hooks, str):
on_update_hooks = [on_update_hooks]
for hook in on_update_hooks:
status = "" if "asset_categories" in hook.lower() else " "
print(f" {status} {hook}")
else:
print(" ✗ Хук НЕ зарегистрирован!")
print("Company.on_update хуки НЕ зарегистрированы!")
# 6. Проверка фоновых задач
print("\n6. Проверка фоновых задач:")
@ -160,18 +167,20 @@ def force_create():
def test_hook():
"""Тестирует вызов хука setup_wizard_complete напрямую"""
"""Тестирует вызов Company.on_update хука напрямую"""
print("\n" + "=" * 80)
print("ТЕСТ ХУКА setup_wizard_complete")
print("ТЕСТ ХУКА Company.on_update")
print("=" * 80 + "\n")
# Проверяем, что хук зарегистрирован
hooks = frappe.get_hooks("setup_wizard_complete")
print(f"Зарегистрированные хуки: {hooks}\n")
company_events = frappe.get_hooks("doc_events", {}).get("Company", {})
on_update_hooks = company_events.get("on_update", [])
if not hooks:
print("✗ Хук НЕ зарегистрирован в hooks.py!")
print(f"Зарегистрированные Company.on_update хуки: {on_update_hooks}\n")
if not on_update_hooks:
print("✗ Company.on_update хук НЕ зарегистрирован в hooks.py!")
return
# Получаем первую компанию
@ -183,27 +192,22 @@ def test_hook():
company_name = companies[0].name
print(f"Компания найдена: {company_name}\n")
# Вызываем хук напрямую с тестовыми аргументами
# Получаем Company document
print("Загружаем Company document...\n")
company_doc = frappe.get_doc("Company", company_name)
# Вызываем хук напрямую
print("Вызываем хук напрямую...\n")
try:
from jey_erp.setup.setup_wizard_handler import setup_wizard_complete_handler
from jey_erp.custom.create_asset_categories import create_asset_categories_on_company_update
test_args = {
"company_name": company_name,
"country": "Test",
"currency": "AZN"
}
setup_wizard_complete_handler(test_args)
create_asset_categories_on_company_update(company_doc, "on_update")
print("\n✓ Хук вызван успешно!")
print("\nПроверьте Error Log для записей с префиксом 'AC'")
print("Также проверьте фоновые задачи: bench --site <site> console")
print(">>> from rq import Queue; import redis")
print(">>> conn = redis.from_url('redis://localhost:11000')")
print(">>> q = Queue('default', connection=conn)")
print(">>> [job.func_name for job in q.jobs]")
print("\nИли проверьте категории:")
print(">>> frappe.db.count('Asset Category')")
except Exception as e:
import traceback

View File

@ -48,16 +48,18 @@ doc_events = {
],
"before_save": "jey_erp.custom.sales_order_vat.set_vat_fields_permissions"
},
"Company": {
"on_update": "jey_erp.custom.create_asset_categories.create_asset_categories_on_company_update"
},
"Asset Category": {
"validate": "jey_erp.custom.create_asset_categories.prevent_create_new_asset_categories",
"on_trash": "jey_erp.custom.create_asset_categories.prevent_delete_system_asset_categories"
}
}
# Setup Wizard
# ------------
setup_wizard_complete = "jey_erp.setup.setup_wizard_handler.setup_wizard_complete_handler"
# REMOVED: setup_wizard_complete hook
# Asset categories are now created automatically via Company.on_update event
# setup_wizard_complete = "jey_erp.setup.setup_wizard_handler.setup_wizard_complete_handler"
after_migrate = "jey_erp.hooks.after_migrate_combined"