diff --git a/jey_erp/custom/create_asset_categories.py b/jey_erp/custom/create_asset_categories.py index f02d3e9..ffcc89d 100644 --- a/jey_erp/custom/create_asset_categories.py +++ b/jey_erp/custom/create_asset_categories.py @@ -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): """ Создает категории активов для конкретной компании. diff --git a/jey_erp/debug_asset_categories.py b/jey_erp/debug_asset_categories.py index e12761a..3277e24 100644 --- a/jey_erp/debug_asset_categories.py +++ b/jey_erp/debug_asset_categories.py @@ -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 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 diff --git a/jey_erp/hooks.py b/jey_erp/hooks.py index 22442a2..9b24eaa 100644 --- a/jey_erp/hooks.py +++ b/jey_erp/hooks.py @@ -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"