83 lines
3.4 KiB
Python
Executable File
83 lines
3.4 KiB
Python
Executable File
# /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() |