garázs fejlesztés

This commit is contained in:
Roo
2026-07-20 11:17:52 +00:00
parent 2e0abc62a7
commit 4594de6c11
80 changed files with 9135 additions and 8702 deletions

View File

@@ -0,0 +1,320 @@
"""
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()