Привет. Сия дилемма такова.
Имеется БД, а в ней два столбца: balance и blocked_balance.
balance - обычный счет.
blocked_balance - это счет, который был пополнен клиентом, средства с этого счета нельзя выводить, в отличие от balance.
Имеется функция, которая считает.
spoilerfunction setUserBalance(int $user_id, int $sum) : void {
$db = DB::getAll('SELECT `balance`, `blocked_balance` FROM `users` WHERE `user_id`=?', [$user_id])[0];
$balance = (int)$db['balance'];
$blocked_balance = (int)$db['blocked_balance'];
if ($sum < 0) {
if ($blocked_balance > 0 && $blocked_balance >= $sum * -1) {
DB::exec('UPDATE `users` SET `blocked_balance`=`blocked_balance`-? WHERE `user_id`=?', [$sum * -1, $user_id]);
} elseif ($blocked_balance > 0 && $blocked_balance < $sum * -1) {
DB::exec('UPDATE `users` SET `blocked_balance`=0, `balance`=`balance`-? WHERE `user_id`=?', [($sum * -1) - $blocked_balance, $user_id]);
} else {
DB::exec('UPDATE `users` SET `balance`=`balance`-? WHERE `user_id`=?', [$sum * -1, $user_id]);
}
} else {
DB::exec('UPDATE `users` SET `balance`=`balance`+? WHERE `user_id`=?', [$sum, $user_id]);
}
}
Суть функции такова: при списании, если баланс blocked_balance больше или равен чем сумма, то средства списываются с blocked_balance. Если же на blocked_balance не совсем достаточно денег для полного списания, то blocked_balance приравнивается 0, а все вычеты происходят уже в balance и плюс вычитается сумма blocked_balance, которая была аннулирована. Такая вот система.
А сама дилемма в том, что функция не совсем корректная, иногда баланс пользователя уходит в минус, а этого никак не должно быть. Все проверки на баланс перед списанием стоят (есть функция, которая складывает balance + blocked_balance). Поэтому, ошибка именно в этой функции. Я прошу помощи, ибо потратил уже достаточное количество времени, и привел функцию к своему идеалу, но дальше уже не могу, познаний не хватает.
P.S. Использую RedBeanPHP.