Добрый день! Делаю сервис в котором будут платные услуги, как разовые, так и повышение привилегий аккаунта (премиум аккаунт).
В данный момент реализован личный кабинет пользователя, в который он может зайти и пополнить свой баланс .
Баланс хранится в отдельной табличке в бд в виде записей:
transaction_value - значение баланса (положительное или отрицательное) суммируемое, в результате чего получается текущий баланс...
Требуется сделать возможность покупать премиум аккаунт на сайте и разовые услуги, допустим :
- премиум аккаунт на 5 дней
- премиум аккаунт на 10 дней
- премиум аккаунт на 30 дней
- Поднять объявление в топ на 1 день
- Поднять объявление в топ на 2 дня
- .....
Разовые услуги :
Купить возможность скачать все объявления с сайта за 500 руб.
*( возможно еще скидки, акции, купоны какие реализую, но это потом)
Вот такого типа услуги хочу реализовать.
1) Первый вариант на половину уже реализован, но что то я засомневался в его адекватности...
Создаем 2 таблички :
Список типов услуг
tbl_service_list_type_id - ID
tbl_service_list_type_name - Наименование
tbl_service_list_type_desc - Описание
tbl_service_list_type_price - Цена
tbl_service_list_type_timerange - Период на который действует услуга в днях
tbl_service_list_type_add_permission_name - Разрешение из RBAC, которое добавляется при покупки данной услуги
tbl_service_list_type_status - Статус (актив или нет)
Список услуг
tbl_service_list_id - ID
tbl_service_list_user_fk - ID юзера, который купил данную услугу
tbl_service_list_type_fk - ID Типа услуги (структура описана выше)
tbl_service_list_name - Наименование (берется из типа услуги)
tbl_service_list_desc - Описание (берется из типа услуги)
tbl_service_list_price - Цена (берется из типа услуги но возможно тут сделаю скидочки в зависимости от чего то...)
tbl_service_list_date_start - Момент покупки услуги в timestamp
tbl_service_list_date_range - Период на который действует услуга в днях (берется из типа услуги)
tbl_service_list_pay_id - ID платежки (ID записи по которой списалась денежка из баланса)
tbl_service_list_permission_name Разрешение из RBAC, которое добавляется при покупки данной услуги (берется из типа услуги)
tbl_service_list_status - Статус (актив или нет)
Вот такая структура таблиц уже реализована, баланс списывается, все логируется, все считается, все ок!
1 вариант организации покупки
Юзер имеет на балансе 5000 руб.
Вывести список
Список типов услуг как товары, юзер кликает по нужной ( премиум аккаунт на 10 дней, стоит она 1000 руб.) создается запись в таблице
Список услуг, данные частично берутся из соответствующей записи таблицы
Список типов услуг и далее генерируется запись со значением
-1000 руб в таблице с платежками, соответственно баланс уменьшается и у юзера появляется активная услуга, добавляются нужные права в RBAC.
Такая схема реализована уже, но появляется проблема с отслеживанием времени действия...
Думаю отслеживать так: раз в сутки пробегать кроном по всему списку активных услуг, брать в каждой поле
tbl_service_list_date_start -
Момент покупки услуги в timestamp и прибавлять
tbl_service_list_date_range -
Период на который действует услуга в днях и сравнивать timestamp с текущим, если текущий меньше, тогда ничего не делаем, если текущий больше - значит услуга закончилась, помечаем ее как неактиваная.... Все вроде красиво и четко, НО вдруг пользователь захочет оплатить еще один прем на 10 дней через 4 для использования текущего, получается этот прем еще не кончился а он уже другой взял, деньги получается спишутся но прем наложится на другой и срок не увеличится...
Тут можно конечно проверять есть ли уже подобный прем активный, если есть то делать
tbl_service_list_date_start у новго (второго активного) према таким
tbl_service_list_date_start + tbl_service_list_date_range от первого према. Получается второй прем должен заработать сразу после окончания первого..
2 ой вариант с балансом
Делаем услугу стоимость услуги - према составляет 50 руб в день, юзер закидывает деньги, 1000 руб допустим, покупает услугу прем со стоимостью в 50 руб/день на 10 дней (в записи услуги в поле
tbl_service_list_date_range стоит значение 10) , еще другую услугу со стоимостью 20 руб/день.
Ну их можно купить только при условии что сумма баланса вашего больше или равно
tbl_service_list_date_range+
tbl_service_list_price (общей стоимости услуги на весь планируемый период) и каждую ночь по крону бегает скрипт по услугам, пробегает по каждому пользователю с активными услугами, суммирует стоимость подключенных услуг и отнимает от баланса юзера, ну и в записи каждой активной услуги отнимает 1 день. Когда услуга станет с 0 днями, статус ее становится тоже 0 и она не отображается более..
Как то так.. Может я вообще не в том направлении копаю, посоветуйте какой лучше вариант выбрать, может что поправить, может вообще эти мои схемы не верные и имеют фундаментальные минусы,которые не позволят их юзать в перспективе.
Посоветуйте свой вариант если уже делали подобное?