@@ -0,0 +1,46 @@
|
||||
"""Цены компонентов для analytics."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from typing import Dict, List, Optional
|
||||
|
||||
from sqlalchemy import select
|
||||
|
||||
from app import db
|
||||
from app.models import Component
|
||||
|
||||
|
||||
def component_prices(
|
||||
*,
|
||||
component_ids: Optional[List[str]] = None,
|
||||
names: Optional[List[str]] = None,
|
||||
) -> Dict[str, float]:
|
||||
"""component_id или имя -> price руб/кг."""
|
||||
prices: Dict[str, float] = {}
|
||||
ids = [x for x in (component_ids or []) if x]
|
||||
if ids:
|
||||
rows = db.session.execute(
|
||||
select(Component).where(
|
||||
Component.id.in_(ids),
|
||||
Component.is_deleted.is_(False),
|
||||
)
|
||||
).scalars().all()
|
||||
for row in rows:
|
||||
prices[row.id] = float(row.price or 0)
|
||||
for name in names or []:
|
||||
if not name or name in prices:
|
||||
continue
|
||||
row = db.session.execute(
|
||||
select(Component)
|
||||
.where(Component.name == name, Component.is_deleted.is_(False))
|
||||
.limit(1)
|
||||
).scalar_one_or_none()
|
||||
if row:
|
||||
prices[name] = float(row.price or 0)
|
||||
return prices
|
||||
|
||||
|
||||
def price_for(*, prices: Dict[str, float], component_id: Optional[str], name: str) -> float:
|
||||
if component_id and component_id in prices:
|
||||
return prices[component_id]
|
||||
return prices.get(name, 0.0)
|
||||
Reference in New Issue
Block a user