7fb839aef6
- trial подписки теперь конвертируются в платные вместо отказа (ошибка ~20 из 300 юзеров) - extend_subscription: добавлен переход TRIAL→ACTIVE - UniqueConstraint на PromoCodeUse(user_id, promocode_id) + миграция 0015 с дедупликацией - create_promocode_use: begin_nested()+flush() вместо commit/rollback (без коррупции сессии) - race condition: create_promocode_use вызывается ДО _apply_promocode_effects - cleanup: удаление зарезервированной записи при ValueError от эффектов - atomic SQL increment для current_uses (защита от lost-update) - mark_user_as_had_paid_subscription: savepoint вместо commit/rollback - удалён мёртвый код: use_promocode(), trial_subscription_not_eligible из маппингов