321 lines
12 KiB
Python
321 lines
12 KiB
Python
"""
|
|
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()
|