Пишу многоуровневую реферальную систему с рангами. Т.е. 5 уровней и ранги за кол пригласивших, у каждого разный процент отчислений. При регистрации заношу id пригласившего рефералу. Далее при покупке рефералом пакета делаю отчисления
$dataRef = $this->db->column('SELECT ref FROM accounts WHERE id = :id',
['id' => $data['uid']]);
if ($dataRef === false) {
return false;
}
if ($dataRef != 0) {
$refSum = round((($data['amount'] * 15) / 100), 2);
$params = [
'sum' => $refSum,
'id' => $dataRef,
];
$this->db->query('UPDATE accounts SET refBalance = refBalance + :sum WHERE id = :id', $params);
Потом по цепочке человеку на уровень выше
$dataRef2 = $this->db->column('SELECT ref FROM accounts WHERE id = :id', ['id' => $dataRef]);
if ($dataRef2 === 0) {
return false;
}
if ($dataRef2 != 0) {
$refSum = round((($data['amount'] * 10) / 100), 2);
$params = [
'sum' => $refSum,
'id' => $dataRef2,
];
$this->db->query('UPDATE accounts SET refBalance = refBalance + :sum WHERE id = :id', $params);
Вопрос можно ли как-то сделать это элегантнее и сократить код? А то у меня так будет 40 таких кусков, для проверки на уровень и ранг. Первый id это SESSION id реферала , который купил пакет, отправляется методом post в платежку. amount это цена тарифа тоже при покупке уходит MySQL 5v
Обновить вполне можно одним запросом:
update accounts A
join (
SELECT @id:=(select ref from accounts where id=@id) id,
round(@amount * proc / 100, 2) amount
FROM (
select @amount:= :AMOUNT, @id:= :ID
) init, (
select 1 N, 15 proc union all select 2, 10 union all
select 3, 8 union all select 4, 5 union all select 5, 3
) P
order by N
) N on A.id=N.id and N.id is not null
set A.refBalance = A.refBalance + N.amount
Необходимо передать 2 параметра: сумму начислений и стартовый ID (его реферал первым получит отчисления). В подзапросе P
задаются по порядку уровней рефералов (N
) процент (proc
) отчисления им.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Суть вот в чём: Загружаю файлы через https://githubcom/yii2-starter-kit/yii2-file-kit На выходе получается так, что грузит все файлы, но я не могу их сохранить так...
Как поставить begintransaction в очередь? Ребят, приветствуюВопрос по транзакциям: Есть скрипт, который изменяет ячейку
Какой язык на данный момент лучше подходит,например, для написания соцсети? Php или Python?