58d899aab8
- renewal.py: block renew/renewal-options for PENDING/DISABLED subscriptions (extend_subscription doesn't transition these to ACTIVE — user would pay for nothing) - autopay.py: wrap 2x bare int() card_id parsing in try/except - devices.py: wrap 2x bare int() device_count parsing in try/except - daily_subscription_service: atomic daily charge — subtract_user_balance, create_transaction, update_daily_charge_time all use commit=False, single db.commit() after all three succeed. Prevents re-charge on partial failure. - subscription.py: update_daily_charge_time accepts commit=False kwarg