átlagos kiegészítséek jó sok

This commit is contained in:
Roo
2026-03-22 11:02:05 +00:00
parent f53e0b53df
commit 5d44339f21
249 changed files with 20922 additions and 2253 deletions

View File

@@ -1,12 +1,14 @@
# /opt/docker/dev/service_finder/backend/app/services/geo_service.py
import uuid
import logging
from datetime import datetime, timezone
from typing import Optional, List, Dict, Any
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy import text, select
from sqlalchemy import text, select, and_
from app.services.config_service import config # 2.0 Dinamikus konfig
from app.db.session import AsyncSessionLocal
from app.models.identity.address import GeoPostalCode, GeoStreet, GeoStreetType, Address
logger = logging.getLogger("Geo-Service-2.2")
@@ -74,27 +76,49 @@ class GeoService:
default="{zip} {city}, {street} {type} {number}."
)
# 2. Irányítószám és Város (Auto-learning / Upsert)
zip_id_query = text("""
INSERT INTO system.geo_postal_codes (zip_code, city, country_code)
VALUES (:z, :c, :cc)
ON CONFLICT (country_code, zip_code, city) DO UPDATE SET city = EXCLUDED.city
RETURNING id
""")
zip_res = await db.execute(zip_id_query, {"z": zip_code, "c": city, "cc": default_country})
zip_id = zip_res.scalar()
# 2. Irányítószám és Város (Auto-learning / Upsert) - SELECT, majd INSERT
stmt = select(GeoPostalCode).where(
and_(
GeoPostalCode.country_code == default_country,
GeoPostalCode.zip_code == zip_code,
GeoPostalCode.city == city
)
)
existing_pc = (await db.execute(stmt)).scalar_one_or_none()
if existing_pc:
zip_id = existing_pc.id
else:
# 2. Beszúrás ha nem létezik
new_pc = GeoPostalCode(
country_code=default_country,
zip_code=zip_code,
city=city
)
db.add(new_pc)
await db.flush()
zip_id = new_pc.id
# 3. Utca szótár frissítése
await db.execute(text("""
INSERT INTO system.geo_streets (postal_code_id, name) VALUES (:zid, :n)
ON CONFLICT (postal_code_id, name) DO NOTHING
"""), {"zid": zip_id, "n": street_name})
# 3. Utca szótár frissítése (SELECT, majd INSERT)
stmt_street = select(GeoStreet).where(
and_(
GeoStreet.postal_code_id == zip_id,
GeoStreet.name == street_name
)
)
existing_street = (await db.execute(stmt_street)).scalar_one_or_none()
if not existing_street:
new_street = GeoStreet(postal_code_id=zip_id, name=street_name)
db.add(new_street)
await db.flush()
# 4. Közterület típus (út, utca, köz...)
await db.execute(text("""
INSERT INTO system.geo_street_types (name) VALUES (:n)
ON CONFLICT (name) DO NOTHING
"""), {"n": street_type.lower()})
# 4. Közterület típus (SELECT, majd INSERT)
stmt_type = select(GeoStreetType).where(GeoStreetType.name == street_type.lower())
existing_type = (await db.execute(stmt_type)).scalar_one_or_none()
if not existing_type:
new_type = GeoStreetType(name=street_type.lower())
db.add(new_type)
await db.flush()
# 5. SZÖVEGES CÍM GENERÁLÁSA SABLON ALAPJÁN (2.2 Újdonság)
# Megformázzuk az alapcímet az admin sablon szerint
@@ -111,42 +135,37 @@ class GeoService:
if floor: full_text += f" {floor}. em."
if door: full_text += f" {door}. ajtó"
# 6. Központi Address rekord rögzítése vagy lekérése
address_query = text("""
INSERT INTO system.addresses (
postal_code_id, street_name, street_type, house_number,
stairwell, floor, door, parcel_id, full_address_text
# 6. Központi Address rekord rögzítése vagy lekérése (SELECT, majd INSERT)
stmt_addr = select(Address).where(
and_(
Address.postal_code_id == zip_id,
Address.street_name == street_name,
Address.street_type == street_type,
Address.house_number == house_number,
Address.stairwell == stairwell,
Address.floor == floor,
Address.door == door
)
VALUES (:zid, :sn, :st, :hn, :sw, :fl, :dr, :pid, :txt)
ON CONFLICT (postal_code_id, street_name, street_type, house_number, stairwell, floor, door)
DO NOTHING
RETURNING id
""")
params = {
"zid": zip_id, "sn": street_name, "st": street_type,
"hn": house_number, "sw": stairwell, "fl": floor,
"dr": door, "pid": parcel_id, "txt": full_text
}
res = await db.execute(address_query, params)
addr_id = res.scalar()
# 7. Biztonsági keresés: Ha létezett a rekord, de nem kaptunk ID-t a RETURNING-gal
if not addr_id:
lookup_query = text("""
SELECT id FROM system.addresses
WHERE postal_code_id = :zid
AND street_name = :sn
AND street_type = :st
AND house_number = :hn
AND (stairwell IS NOT DISTINCT FROM :sw)
AND (floor IS NOT DISTINCT FROM :fl)
AND (door IS NOT DISTINCT FROM :dr)
LIMIT 1
""")
lookup_res = await db.execute(lookup_query, params)
addr_id = lookup_res.scalar()
)
existing_addr = (await db.execute(stmt_addr)).scalar_one_or_none()
if existing_addr:
addr_id = existing_addr.id
else:
new_addr = Address(
postal_code_id=zip_id,
street_name=street_name,
street_type=street_type,
house_number=house_number,
stairwell=stairwell,
floor=floor,
door=door,
parcel_id=parcel_id,
full_address_text=full_text,
created_at=datetime.now(timezone.utc)
)
db.add(new_addr)
await db.flush()
addr_id = new_addr.id
return addr_id