Как держать в БД приобретённые юзером платные тарифы?

Есть сервис, где доступны режимы Бесплатный (Б), Платный 1 (П1) и Платный 2 (П2). (На деле тарифов больше)

В любой момент пользователь может приобрести себе какой-то из Платных режимов на 1 месяц или больше.

Может, не дожидаясь конца срока действия П1, проапгрейдиться до более дорогого П2.

Задачи:
  1. В любой момент быстро определить, какой сейчас у юзера режим
  2. Предупреждать юзера при визите о необходимости/возможности продлить подписку за неделю, день, день-после, неделю после.
  3. В нужные моменты переключать юзеру тариф, автономно, без его визита.


Вопросы:
  1. Как лучше держать в БД текущее состояние пользователя? Наверное, его активный тариф и срок его окончания.
  2. В случае апгрейда – по окончании П2 логично откатиться сначала на неиспользованный хвост П1, и только потом на Бесплатный. Как это лучше реализовать – держать в БД только покупки и перерасчитывать раз в сутки / 12 часов / час?
  3. Как лучше держать в БД (и нужно ли) перспективу? – напр., дату-время, когда апгрейд до П2 закончится и произойдёт откат на «хвост» от оплаченного П1; и когда закончится тот хвост и откатится на Бесплатный.
  • Вопрос задан
  • 348 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Draconian
Oracle Developer
СУБД не указали.

В общем случае, по-моему, будет примерно так:
Таблица пользователей (с id активного сейчас тарифа). По умолчанию все пользователи бесплатные.
Таблица тарифов.
Поскольку у одного юзера может быть много тарифов, связь N-M, нужна таблица связи:
юзер_тариф (id юзера, id тарифа, датавремя начала действия, датавремя окончания действия, признак is_active)

Джобами проверяем пользователей на активные тарифы, если время вышло - меняем тариф на тот, у которого осталось время, ставим признак is_active в 0, меняем активный тариф в таблице пользователей. Тут же можно вести лог, какого пользователя, когда, с какого на какой тариф перевели.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы