Files
shanxia2.0/backend/app/services/pl_plan_price_mask.py
T
2026-09-03 16:25:17 +08:00

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,
}
)