Сейчас bulkExtendExpirationDateByUuids делает простое прибавление интервала к expire_at:
expire_at = expire_at + <days>
Из-за этого, если подписка уже истекла, продление может вообще не “реанимировать” пользователя.
Пример (истекла давно)
Допустим сейчас 2026-01-14 12:00.
-
expire_at = 2026-01-07 12:00(истекла 7 дней назад) -
extendDays = 1
Текущее поведение:
-
станет
expire_at = 2026-01-08 12:00(то есть 6 дней назад) -
по факту подписка всё равно просрочена
Пример (истекла недавно)
Сейчас 2026-01-14 12:00.
-
expire_at = 2026-01-13 12:00(истекла вчера) -
extendDays = 1
Текущее поведение:
- станет
expire_at = 2026-01-14 12:00(то есть ровно сейчас, без запаса)
Предложение по логике продления
На мой взгляд корректнее продлевать “от текущего момента”, если подписка уже истекла:
-
Если
expire_at < NOW()→ установитьexpire_at = NOW() + <days> -
Если
expire_at >= NOW()→expire_at = expire_at + <days>Также, важно, чтобы при изменении менялся статус на ACTIVE, чтобы пользователь сразу активировался.
То есть по сути: expire_at = GREATEST(expire_at, NOW()) + <days>
Это ожидаемо для пользователя: продление всегда даёт активный период, даже если подписка была просрочена.