Какая модель списания средств лучше?

Услуга стоит 300 ед. валюты в месяц. Можно списывать:

1. В последний день месяца. Но его сложно определять и возникает проблема если он оплатил 15 числа то надо высчитывать долю и списывать половину, а на весь второй месяц если баланс не пополнят денег не хватит.

2. Каждые 30 дней. Это несколько проще. 15 января положили - 15 февраля списали.

3. Каждый день списывать сумму равную 1/30 от месячной стоимости. Заметил что много кто использует эту модель. Почему она так популярна? Ведь транзакции надо тогда делать каждый день и вести большой лог транзакций + баланс можно было бы хранить в int, а так он точно станет дробным и надо хранить в decimal его.
И например 200 / 30 = 6.66
Но 6.66 х 30 = 199,8 как избежать накопления ошибки в этом случае?

Какая модель списания на ваш взгляд лучше и почему? У хостеров встречается обычно 2 или 3 модель например.
  • Вопрос задан
  • 284 просмотра
Решения вопроса 1
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Самый удобный для пользователей сервиса вариант: это модель №3.
Как списывать?
В базовом случае, есть 3 переменных:
1. Баланс пользователя
2. Дата активации подписки
3. Стоимость за период времени

Дано (пример):
1. Пользователь пополнил баланс на 180 ед. (прежний - был: 20 ед.) и итоговый баланс стал: 200 ед.
2. Спустя какое-то время - пользователь активировал подписку. Допустим, 15 августа.
3. Пусть за (календарный!) месяц услуга стоит 300 единиц.

Значит его остаток при активной подписке N-дней равен:
20+180-300*12/365*N => из расчёта за обычный год (не високосный!).

Например, баланс через 5 дней (20-го августа):
20+180-300*12/365*5 = 150,68493150684931506849315068493 ед.

Отображаем в ЛК пользователя как обычное математическое округление до 2-й цифры (включительно) после запятой (0-4 - в меньшую сторону, 5-9 - в большую): 150,68 ед.

Чтобы сохранять точность - никогда не вычитайте из баланса пользователя израсходованную сумму: всегда считайте ТОЛЬКО через коэффициенты в формуле!

Все статичные коэффициенты формулы (не участвующие в расчётах суточного баланса) - считаем заранее (для ускорения и снятия нагрузки) и храним с МАКСИМАЛЬНОЙ точностью!
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
AxianLTD
@AxianLTD
В это трудно поверить, но модель списания средств зависит от методов финансового управления предприятием, показателей, которыми пользуются при этом. И вы про какую схему оплаты говорите? Предоплата, постоплата, автоматическое выставление счетов? Или просто имитация списания с виртуального счета клиента в рамках вашего биллинга?
Ответ написан
lxsmkv
@lxsmkv
Test automation engineer
Можно списывать в тот момент когда сумма израсходуется. Но тогда нужно отталкиваться не от календарного месяца а от какого-то количества дней например 31 день . Когда клиент кладет деньги на счет, списание происходит ровно через 31 день. Мне кажется такая модель проще для понимания для клиента, и наверное расчет конечной даты будет проще. Есть фунцкии для прибавления к дате х дней. будет плавающий день расчета. Опеределить клиентов у которых расчет будет в определенный день тоже весьма очевидно. Нужно поле день расчета, который будет день внесения средств плюс 31 день (или икс, который вы определите). Клиенту это будет однозначно приятно, если он за свои деньги всегда будет одинаково долго пользоваться сервисом, а не 28 дней в феврале.
Ответ написан
Ваш ответ на вопрос

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

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