""" Seed script: Enterprise Taxonomy - Pénzügy, Biztosítás és Hatósági kategóriák a marketplace.expertise_tags táblába. Hierarchia: Level 1: Pénzügy és Biztosítás (Finance & Insurance) Level 2: Gépjármű biztosító (Vehicle Insurance) Level 2: Lízing és Finanszírozás (Leasing & Financing) Level 2: Bank és Hitelintézet (Bank & Credit Institution) Level 1: Hatóságok és Közigazgatás (Authorities & Administration) Level 2: Önkormányzat (Municipality) Level 2: Állami Kincstár / Nemzeti Adóhatóság (State Treasury / Tax Authority) Level 2: Közlekedési Hatóság / Kormányablak (Transport Authority) Level 2: Útdíj / Autópálya Kezelő (Toll & Highway Operator) Idempotens - ON CONFLICT DO NOTHING miatt többször is futtatható. Futtatás: docker exec sf_api python3 /app/backend/app/scripts/seed_expertise_enterprise.py """ import asyncio import logging from sqlalchemy import select, func, text from app.db.session import AsyncSessionLocal from app.models.marketplace.service import ExpertiseTag logger = logging.getLogger(__name__) # ── Enterprise Taxonomy Definitions ── # Level 1: Pénzügy és Biztosítás (Finance & Insurance) FINANCE_INSURANCE = { "key": "penzugy_es_biztositas", "name_i18n": { "hu": "Pénzügy és Biztosítás", "en": "Finance & Insurance", }, "name_hu": "Pénzügy és Biztosítás", "name_en": "Finance & Insurance", "category": "financial", "level": 1, "parent_id": None, "path": "penzugy_es_biztositas", "search_keywords": [ "pénzügy", "biztosítás", "finance", "insurance", "bank", "lízing", "hitel", "kölcsön", ], "description": "Pénzügyi szolgáltatások, biztosítások, banki és lízing szolgáltatások", } # Level 2 children of Pénzügy és Biztosítás FINANCE_CHILDREN = [ { "key": "gepjarmu_biztosito", "name_i18n": { "hu": "Gépjármű biztosító", "en": "Vehicle Insurance", }, "name_hu": "Gépjármű biztosító", "name_en": "Vehicle Insurance", "category": "financial", "level": 2, "search_keywords": [ "biztosító", "biztosítás", "insurance", "kgfb", "casco", "kötelező", "gépjármű biztosítás", ], "description": "Gépjármű felelősségbiztosítás (KGFB), casco és egyéb járműbiztosítások", }, { "key": "lizing_es_finanszirozas", "name_i18n": { "hu": "Lízing és Finanszírozás", "en": "Leasing & Financing", }, "name_hu": "Lízing és Finanszírozás", "name_en": "Leasing & Financing", "category": "financial", "level": 2, "search_keywords": [ "lízing", "finanszírozás", "leasing", "financing", "autólízing", "operatív lízing", "pénzügyi lízing", ], "description": "Gépjármű lízing, operatív és pénzügyi lízing, járműfinanszírozás", }, { "key": "bank_es_hitelintezet", "name_i18n": { "hu": "Bank és Hitelintézet", "en": "Bank & Credit Institution", }, "name_hu": "Bank és Hitelintézet", "name_en": "Bank & Credit Institution", "category": "financial", "level": 2, "search_keywords": [ "bank", "hitelintézet", "banking", "credit", "számla", "hitel", "kölcsön", "folyószámla", ], "description": "Banki szolgáltatások, hitelintézetek, számlavezetés és hitelezés", }, ] # Level 1: Hatóságok és Közigazgatás (Authorities & Administration) AUTHORITIES = { "key": "hatosagok_es_kozigazgatas", "name_i18n": { "hu": "Hatóságok és Közigazgatás", "en": "Authorities & Administration", }, "name_hu": "Hatóságok és Közigazgatás", "name_en": "Authorities & Administration", "category": "government", "level": 1, "parent_id": None, "path": "hatosagok_es_kozigazgatas", "search_keywords": [ "hatóság", "közigazgatás", "authority", "government", "önkormányzat", "adó", "kincstár", "ügyfélkapu", ], "description": "Hatósági és közigazgatási szervek, önkormányzatok, adóhatóságok", } # Level 2 children of Hatóságok és Közigazgatás AUTHORITY_CHILDREN = [ { "key": "onkormanyzat", "name_i18n": { "hu": "Önkormányzat", "en": "Municipality", }, "name_hu": "Önkormányzat", "name_en": "Municipality", "category": "government", "level": 2, "search_keywords": [ "önkormányzat", "municipality", "polgármesteri hivatal", "helyi adó", "gépjárműadó", "iparűzési adó", ], "description": "Helyi önkormányzatok, polgármesteri hivatalok, helyi adóhatóságok", }, { "key": "allami_kincstar_nav", "name_i18n": { "hu": "Állami Kincstár / Nemzeti Adóhatóság", "en": "State Treasury / Tax Authority", }, "name_hu": "Állami Kincstár / Nemzeti Adóhatóság", "name_en": "State Treasury / Tax Authority", "category": "government", "level": 2, "search_keywords": [ "adóhatóság", "nav", "kincstár", "treasury", "adó", "tax", "államkincstár", "magyar államkincstár", ], "description": "Nemzeti Adó- és Vámhivatal (NAV), Magyar Államkincstár, központi adóhatóság", }, { "key": "kozlekedesi_hatosag", "name_i18n": { "hu": "Közlekedési Hatóság / Kormányablak", "en": "Transport Authority", }, "name_hu": "Közlekedési Hatóság / Kormányablak", "name_en": "Transport Authority", "category": "government", "level": 2, "search_keywords": [ "közlekedési hatóság", "kormányablak", "transport authority", "ügyfélkapu", "okmányiroda", "gépjármű ügyintézés", "forgalmi engedély", "törzskönyv", ], "description": "Közlekedési hatóságok, kormányablakok, okmányirodák, gépjármű ügyintézés", }, { "key": "utdij_autopalya_kezelo", "name_i18n": { "hu": "Útdíj / Autópálya Kezelő", "en": "Toll & Highway Operator", }, "name_hu": "Útdíj / Autópálya Kezelő", "name_en": "Toll & Highway Operator", "category": "government", "level": 2, "search_keywords": [ "útdíj", "autópálya", "toll", "highway", "matrica", "e-matrica", "hu-go", "nemzeti útdíj", "autópálya matrica", "úthasználat", ], "description": "Autópálya kezelők, útdíj fizetési rendszerek, e-matrica szolgáltatók", }, ] async def seed_enterprise_taxonomy(): """Beszúrja a Pénzügy és Hatóság kategóriákat a marketplace.expertise_tags táblába.""" async with AsyncSessionLocal() as db: try: inserted = 0 # ── Helper: insert a single tag ── async def insert_tag(tag_data: dict, parent_path: str = None) -> int | None: nonlocal inserted # Check if already exists stmt = select(ExpertiseTag).where( ExpertiseTag.key == tag_data["key"] ) result = await db.execute(stmt) existing = result.scalar_one_or_none() if existing: logger.info( f"A '{tag_data['name_hu']}' kategória " f"már létezik (ID: {existing.id}). Kihagyva." ) print( f" ⏭️ '{tag_data['name_hu']}' már létezik (ID: {existing.id})" ) return existing.id # Build path path = tag_data.get("path") if not path and parent_path: path = f"{parent_path}/{tag_data['key']}" elif not path: path = tag_data["key"] tag = ExpertiseTag( key=tag_data["key"], name_i18n=tag_data.get("name_i18n", { "hu": tag_data["name_hu"], "en": tag_data["name_en"], }), name_hu=tag_data["name_hu"], name_en=tag_data["name_en"], category=tag_data.get("category", "other"), level=tag_data["level"], parent_id=tag_data.get("parent_id"), path=path, search_keywords=tag_data.get("search_keywords", []), description=tag_data.get("description", ""), is_official=True, discovery_points=10, usage_count=0, ) db.add(tag) await db.flush() await db.refresh(tag) inserted += 1 print(f" ✅ '{tag_data['name_hu']}' beszúrva (ID: {tag.id})") return tag.id # ── 1. Pénzügy és Biztosítás (Level 1) ── print("\n📋 Pénzügy és Biztosítás hierarchia:") finance_id = await insert_tag(FINANCE_INSURANCE) if finance_id: # Insert children with parent_id set for child in FINANCE_CHILDREN: child["parent_id"] = finance_id child["path"] = f"{FINANCE_INSURANCE['path']}/{child['key']}" await insert_tag(child) # ── 2. Hatóságok és Közigazgatás (Level 1) ── print("\n📋 Hatóságok és Közigazgatás hierarchia:") auth_id = await insert_tag(AUTHORITIES) if auth_id: for child in AUTHORITY_CHILDREN: child["parent_id"] = auth_id child["path"] = f"{AUTHORITIES['path']}/{child['key']}" await insert_tag(child) await db.commit() # ── Final verification ── result = await db.execute( select(func.count(ExpertiseTag.id)) ) final_count = result.scalar() print(f"\n📊 Összes rekord az expertise_tags táblában: {final_count}") # List the new enterprise tags print("\n📋 Új Enterprise kategóriák:") result = await db.execute( text(""" SELECT id, key, name_hu, name_en, level, parent_id, path FROM marketplace.expertise_tags WHERE key IN ( 'penzugy_es_biztositas', 'gepjarmu_biztosito', 'lizing_es_finanszirozas', 'bank_es_hitelintezet', 'hatosagok_es_kozigazgatas', 'onkormanyzat', 'allami_kincstar_nav', 'kozlekedesi_hatosag', 'utdij_autopalya_kezelo' ) ORDER BY level, id """) ) for row in result: indent = " " * row.level print( f"{indent}ID={row.id}, key={row.key}, " f"name_hu={row.name_hu}, level={row.level}" ) except Exception as e: await db.rollback() logger.error(f"Hiba a seed-elés során: {e}") print(f"❌ Hiba: {e}") raise def main(): logging.basicConfig(level=logging.INFO) asyncio.run(seed_enterprise_taxonomy()) if __name__ == "__main__": main()