77 lines
2.2 KiB
Python
77 lines
2.2 KiB
Python
from __future__ import annotations
|
|
|
|
from decimal import Decimal
|
|
|
|
from sqlalchemy.orm import Session
|
|
|
|
from app.core.menu_guard import SUPER_ADMIN_ROLE, get_user_menu_codes
|
|
from app.schemas.pl.plan import PlanWithProducts
|
|
|
|
ARCHIVE_PRICE_PERM = "pl:plan-archive:price"
|
|
ARCHIVE_PERM = "pl:plan-archive:archive"
|
|
|
|
|
|
def user_has_menu_perm(db: Session, user, perm: str) -> bool:
|
|
if getattr(user, "role", None) == SUPER_ADMIN_ROLE:
|
|
return True
|
|
codes = get_user_menu_codes(db, user.id)
|
|
return perm in codes
|
|
|
|
|
|
def user_can_view_archive_prices(db: Session, user) -> bool:
|
|
return user_has_menu_perm(db, user, ARCHIVE_PRICE_PERM)
|
|
|
|
|
|
def user_can_archive_plan(db: Session, user) -> bool:
|
|
return user_has_menu_perm(db, user, ARCHIVE_PERM)
|
|
|
|
|
|
def _mask_brand_qtys(brand_qtys):
|
|
if not brand_qtys:
|
|
return brand_qtys
|
|
return [bq.model_copy(update={"unit_price": None}) for bq in brand_qtys]
|
|
|
|
|
|
def _mask_product_like(item):
|
|
return item.model_copy(
|
|
update={
|
|
"inbound_price": None,
|
|
"inbound_amount": None,
|
|
"outbound_price": None,
|
|
"outbound_amount": None,
|
|
"brand_qtys": _mask_brand_qtys(getattr(item, "brand_qtys", None)),
|
|
}
|
|
)
|
|
|
|
|
|
def mask_plan_with_products_prices(
|
|
plan: PlanWithProducts, *, enabled: bool = True
|
|
) -> PlanWithProducts:
|
|
if not enabled:
|
|
return plan
|
|
products = [_mask_product_like(p) for p in (plan.products or [])]
|
|
load = plan.load
|
|
if load is not None and getattr(load, "products", None):
|
|
load = load.model_copy(
|
|
update={"products": [_mask_product_like(p) for p in load.products]}
|
|
)
|
|
deliveries = []
|
|
for d in plan.deliveries or []:
|
|
if getattr(d, "products", None):
|
|
deliveries.append(
|
|
d.model_copy(
|
|
update={"products": [_mask_product_like(p) for p in d.products]}
|
|
)
|
|
)
|
|
else:
|
|
deliveries.append(d)
|
|
return plan.model_copy(
|
|
update={
|
|
"total_amount": Decimal("0"),
|
|
"freight_amount": Decimal("0"),
|
|
"products": products,
|
|
"load": load,
|
|
"deliveries": deliveries,
|
|
}
|
|
)
|