From f31540afdb7c7a48987c5193807016632afd3018 Mon Sep 17 00:00:00 2001 From: 3252a8 <3252a8@proton.me> Date: Tue, 12 May 2026 21:32:47 +0300 Subject: [PATCH] fix: dedupe traffic billing warnings when panel limit drifts --- db/dal/tariff_dal.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/db/dal/tariff_dal.py b/db/dal/tariff_dal.py index 21ec902..7e0ef2e 100644 --- a/db/dal/tariff_dal.py +++ b/db/dal/tariff_dal.py @@ -63,14 +63,21 @@ async def get_warning( level: int, traffic_limit_bytes: Optional[int] = None, ) -> Optional[TrafficWarning]: + """Return an existing traffic warning row if one was already recorded. + + For traffic-style billing ``period_start_at`` is NULL. Do **not** match on + ``traffic_limit_bytes`` in that case: the effective limit can change between + worker ticks (panel sync, top-ups, admin adjustments). Matching on the exact + bytes caused duplicate Telegram alerts after restarts or the next poll. + The ``traffic_limit_bytes`` argument is kept for call-site compatibility + but is ignored when ``period_start_at`` is None. + """ conditions = [ TrafficWarning.subscription_id == subscription_id, TrafficWarning.level == level, ] if period_start_at is None: conditions.append(TrafficWarning.period_start_at.is_(None)) - if traffic_limit_bytes is not None: - conditions.append(TrafficWarning.traffic_limit_bytes == traffic_limit_bytes) else: conditions.append(TrafficWarning.period_start_at == period_start_at) result = await session.execute(select(TrafficWarning).where(and_(*conditions)).limit(1))