Как правильно списать бонусы?

Каков алгоритм списания бонусов у клиента по истечению времени.
С каждой покупки клиенту начисляются n-% бонусов. клиент копит копит копит. Потом тратит. По истечению 2х лет бонусы начислены в самом начале должны сгорать. Помогите с алгоритмом и структурой в БД.

Нужно как то интересно их начислять и списывать.
Потому что в момент списания (использования) берется сумма всех бонусов накоплены клиентом и списывается на покупку А по истечению какого то времени нужно их сжигать в хронологическом порядке. от старого к новому.

PS: Если по истечению времени списывать столько же бонуса сколько начислено ( мы загоняем клиента в минус )
Нужно пропорционально списывать как то бонусы.
  • Вопрос задан
  • 843 просмотра
Пригласить эксперта
Ответы на вопрос 6
@AnneSmith
самая ленивая
Моя мысль:
оставьте людям их несчастные бонусы
и найдите способы вынудить людей тратить больше именно с этими бонусами
Ответ написан
Комментировать
sergiks
@sergiks Куратор тега Алгоритмы
♬♬
В БД держать записи про каждое начисление бонуса:
  1. dt_created дата-время поступления;
  2. dt_void дата-время обнуления этого бонуса: через 2 года, а может, и другие правила введете;
  3. value_in сколько начислено;
  4. value_out сколько списано.
Алгоритмы:
  • Для подсчёта числа актуальных баллов, бежим по непросроченным (Now() < dt_void) и суммируем (value_in - value_out).
  • Для списания при покупке бежим от старых к новым, набирая максимально допустимое для списания число баллов и обновляем value_out.
Ответ написан
@Eldar01
Ровно одно дополнительное поле - дата сгорания.

При создании бонуса сразу выставлять дату сгорания.

При списании бонуса - проверять дату сгорания, естественно, что если бонус просрочен, то его игнорировать и не использовать в зачет стоимости покупок.
Ответ написан
Комментировать
kawabanga
@kawabanga
Бью себя по рукам за каждый ответ на глупый вопрос
Моя мысль

использовать метку сгорания. Причем, некоторые бонусы могут работать неделю, а некоторые и несколько месяцев.
количество бонусов | дата загрузки | дата сгорания | id удаленной транзакции.
И каждый день кроном списывать неактуальные бонусы в виде транзакции.
Ответ написан
Stalker_RED
@Stalker_RED
Сразу после списания if (bonus < 0) bonus = 0
Всё.
Ответ написан
Запросом выбираешь остаток по ФИФО расписанный по датам начисления и списываешь те у которых дата больше года. PostgreSQL и Oracle позволяют получить такой остаток одним запросом.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы