# /opt/docker/dev/service_finder/backend/app/services/config_service.py from typing import Any, Optional, Dict import logging import os from decimal import Decimal from datetime import datetime, timezone from sqlalchemy import select, text from sqlalchemy.ext.asyncio import AsyncSession # Modellek importálása a központi helyről from app.models import ExchangeRate, AssetCost, AssetTelemetry from app.db.session import AsyncSessionLocal logger = logging.getLogger(__name__) class CostService: # A cost_in típusát 'Any'-re állítottam ideiglenesen, hogy ne dobjon újabb ImportError-t a hiányzó Pydantic séma miatt async def record_cost(self, db: AsyncSession, cost_in: Any, user_id: int): try: # 1. Árfolyam lekérése (EUR Pivot) rate_stmt = select(ExchangeRate).where( ExchangeRate.target_currency == cost_in.currency_local ).order_by(ExchangeRate.id.desc()).limit(1) rate_res = await db.execute(rate_stmt) rate_obj = rate_res.scalar_one_or_none() exchange_rate = rate_obj.rate if rate_obj else Decimal("1.0") # 2. Kalkuláció amt_eur = Decimal(str(cost_in.amount_local)) / exchange_rate # 3. Mentés az új AssetCost modellbe new_cost = AssetCost( asset_id=cost_in.asset_id, organization_id=cost_in.organization_id, driver_id=user_id, cost_type=cost_in.cost_type, amount_local=cost_in.amount_local, currency_local=cost_in.currency_local, amount_eur=amt_eur, exchange_rate_used=exchange_rate, mileage_at_cost=cost_in.mileage_at_cost, date=cost_in.date or datetime.now(timezone.utc) ) db.add(new_cost) # 4. Telemetria szinkron if cost_in.mileage_at_cost: tel_stmt = select(AssetTelemetry).where(AssetTelemetry.asset_id == cost_in.asset_id) telemetry = (await db.execute(tel_stmt)).scalar_one_or_none() if telemetry and cost_in.mileage_at_cost > (telemetry.current_mileage or 0): telemetry.current_mileage = cost_in.mileage_at_cost await db.commit() return new_cost except Exception as e: await db.rollback() raise e class ConfigService: """ MB 2.0 Alapvető konfigurációs szerviz. Kezeli az AI szolgáltatások (Ollama) dinamikus beállításait és promptjait. """ async def get_setting(self, db: AsyncSession, key: str, default: Any = None) -> Any: """ Lekéri a kért beállítást. 1. Megnézi a környezeti változókat (NAGYBETŰVEL). 2. Ha nincs ilyen ENV, visszaadja a kódba égetett 'default' értéket. """ env_val = os.getenv(key.upper()) if env_val is not None: # Automatikus típuskonverzió a default paraméter típusa alapján if isinstance(default, int): return int(env_val) if isinstance(default, float): return float(env_val) if isinstance(default, bool): return str(env_val).lower() in ('true', '1', 'yes') return env_val return default # A példány, amit a többi modul (pl. az auth_service, ai_service) importálni próbál config = ConfigService()