e4a6aad621
Add mark_as_paid_subscription parameter to subtract_user_balance() that atomically sets has_had_paid_subscription=True within the same FOR UPDATE transaction as the balance deduction. This closes ALL purchase paths: - Cabinet renew: add SELECT FOR UPDATE row lock (fix race condition), set has_had_paid_subscription atomically, remove standalone call - Cabinet purchase_tariff: pass consume_promo_offer to subtract_user_balance (fix: inline clearing was wiped by db.refresh), remove standalone call - Cabinet switch_tariff: add mark_as_paid_subscription=True - Auto-extend: add mark_as_paid_subscription, remove standalone call - Auto-purchase tariff: add consume_promo_offer + mark_as_paid_subscription - Auto-purchase daily: add mark_as_paid_subscription - Bot purchase/extend/trial handlers: add mark_as_paid_subscription - All 8 tariff_purchase.py handlers: add mark_as_paid_subscription - Both simple_subscription.py handlers: add mark_as_paid_subscription - Menu smart activation: add mark_as_paid_subscription - Monitoring autopay: add mark_as_paid_subscription - Renewal service finalize: add mark_as_paid_subscription - MiniApp purchase service: add mark_as_paid_subscription, remove standalone - MiniApp renewal/tariff/switch: add mark_as_paid_subscription