3.23.0 (2026-03-05)
New Features
- account linking and merge system for cabinet (dc7b8dc)
- account merge system — atomic user merge with full FK coverage (2664b49)
- add dedicated sales_stats RBAC permission section (8f29e2e)
- add server-complete OAuth linking endpoint for Mini App flow (f867989)
- add Telegram account linking endpoint with security hardening (da40d56)
Bug Fixes
- abs() for transaction amounts in admin notifications and subscription events (fd139b2)
- add abs() to expenses query, display flip, contest stats, and recent payments (de6f806)
- add IntegrityError handling on link commit and format fixes (0c1dc58)
- add missing mark_as_paid_subscription, fix operation order, remove dead code (5f2d855)
- auto-update permissions for system roles on bootstrap (eff74be)
- centralize balance deduction and fix unchecked return values (0466528)
- centralize has_had_paid_subscription into subtract_user_balance (e4a6aad)
- clean email verification and password fields from secondary user during merge (7b4e948)
- consume promo offer in miniapp tariff-mode renewal path (b8857e7)
- consume promo offer in tariff_purchase.py, fix negative transaction amount (c8ef808)
- delete cross-referral earnings before bulk reassignment, clear secondary.referred_by_id (f204b67)
- from redis.exceptions import NoScriptError (667291a)
- harden account merge security and correctness (d855e9e)
- merge: validate before consuming token, add flush, defensive balance (bc1e6fb)
- negative balance transfer, linking state validation, referrer migration (531d5cf)
- prevent concurrent device purchases exceeding max device limit (1cfede2)
- prevent infinite reuse of first_purchase_only promo code discounts (2cec8dc)
- prevent self-referral loops, invalidate all sessions on merge (db61365)
- reassign orphaned records on merge, eliminate TOCTOU race (d7a9d2b)
- redis cache uses sync client due to import shadowing (667291a)
- restore merge token on DB failure, fix partner_status priority (9582758)
- review findings — exception chaining, redundant unquote, validator tightening (467dea1)
- second round review fixes for account merge (64ee045)
- use short TTL fallback in restore_merge_token on parse error (0e8c61a)
- гарантировать положительный доход от подписок и исправить общий доход (93a55df)
- добавить create_transaction для 6 потоков оплаты с баланса (374907b)
- добавить create_transaction и admin-уведомления для автопродлений (9f35088)
- добавить пробелы в формат тарифов (1000 ГБ / 2 📱) (900be65)
- изолировать stored_amount от downstream consumers в create_transaction (b87535a)
- передать явный диапазон дат для all_time_stats в дашборде (968d147)
- показывать кнопку покупки тарифа вместо ошибки для триальных подписок (acfa4b3)
- показывать только активные провайдеры на странице /profile/accounts (9d7a557)
- реактивация DISABLED подписок при покупке трафика для LIMITED пользователей (7d28f55)
- реактивация DISABLED подписок при покупке устройств и в REST API (b9e17be)
- синхронизация версии pyproject.toml с main и обновление uv в Dockerfile (b31a893)
- убрать WITHDRAWAL из автонегации, добавить abs() в агрегации, исправить all_time_stats (6da61d7)
- убрать избыточный минус в amount_kopeks для create_transaction (849b3a7)
- устранение race condition при покупке устройств через re-lock после коммита (a7a18dd)
- устранение каскадного PendingRollbackError при восстановлении бэкапа (8259278)
Refactoring
- extract shared OAuth linking logic, add Literal types for providers (f7caf0d)