Файл: upload/core/functions/deal.php
Строк: 160
<?php
function closeDisputeIfExists($disp, $id) {
if (isset($disp['id'])) {
dbquery("UPDATE disputes SET status_disp = '1' WHERE deal_disp = ?", [$id]);
}
}
function processWorkPurchase($user, $work, $work_process, $checkWorkProcess, $orderDigits, $id, $us, $count_transact_user)
{
global $gen_parameters;
// --- ЗАЩИТА ОТ ПОВТОРНЫХ ЗАПРОСОВ ---
dbquery("START TRANSACTION");
// Блокируем попытку повторной покупки
$lock = FetchAssoc(dbquery("
SELECT id
FROM work_processed
WHERE k_work = ? AND worker = ? AND stade = 1
FOR UPDATE
", [$id, $user['id']]));
if ($lock) {
dbquery("ROLLBACK");
showAlert('Ошибка', 'fail', 'Вы уже приобрели данный ворк');
ReloadPage();
return false;
}
// ------------------------------------
if ($user && $user['k_money'] > 0 && $count_transact_user < 1) {
dbquery("ROLLBACK");
dbquery("UPDATE users SET k_money = 0 WHERE id = ?", [$user['id']]);
showAlert('Ошибка', 'fail', 'Баланс сброшен: отсутствуют реальные пополнения.');
ReloadPage();
return false;
}
// Проверка баланса
if (getAvailableBalance($user['id'], $user['k_money']) < $work['cena_work']) {
dbquery("ROLLBACK");
showAlert('Ошибка', 'fail', 'Недостаточно средств');
ReloadPage();
return false;
}
// Проверка: уже купил
if ($work_process && $work_process['worker'] == $user['id'] && $work_process['stade'] == 1) {
dbquery("ROLLBACK");
showAlert('Ошибка', 'fail', 'Вы уже приобрели данную работу');
ReloadPage();
return false;
}
// Проверка: покупка своей работы
if ($work['user_work'] == $user['id']) {
dbquery("ROLLBACK");
showAlert('Ошибка', 'fail', 'Вы не можете заказать свою работу');
ReloadPage();
return false;
}
// Проверка: нельзя брать несколько заказов у одного исполнителя
if ($checkWorkProcess > 0) {
dbquery("ROLLBACK");
showAlert('Ошибка', 'fail', 'Нельзя брать сразу несколько заказов у одного исполнителя');
ReloadPage();
return false;
}
// Генерация соли
$salt = genRandomString(12);
// Создание записи в works_transact_orders
dbquery("INSERT INTO works_transact_orders SET worker=?, us=?, key_work=?, salt=?, k_work=?, deal_order=?", [
$user['id'],
$work['user_work'],
CryptorPass($orderDigits . $work['user_work'], $salt),
$salt,
$work['id'],
$orderDigits
]);
// Создание записи в work_processed
dbquery("INSERT INTO work_processed SET k_work=?, worker=?, creator=?, stade='1', k_money=?, time_work=?, time_close_work='', k_order=?, wts=?, deal_commiss=?", [
$id,
$user['id'],
$work['user_work'],
$work['cena_work'],
time(),
$orderDigits,
$salt,
$gen_parameters['deal_commission']
]);
// Комиссия и профит
$commissionData = Commission($work['cena_work'], $gen_parameters['deal_commission']);
$workProfit = $commissionData['profit'];
// Транзакции
insertTransaction($work['cena_work'], $user['id'], 3, 0, 3, $orderDigits);
insertTransaction($workProfit, $work['user_work'], 3, 1, 3, $orderDigits);
// Сообщение
insertMessagePay($user['id'], $work['user_work'], $work['name_work'], $work['cena_work']);
// Списать деньги у заказчика
dbquery("UPDATE users SET k_money = k_money - ? WHERE id=?", [
$work['cena_work'],
$user['id']
]);
// ФИКСАЦИЯ
dbquery("COMMIT");
// Редирект
RedirectToPage('/buys');
exit();
}
function processDealRefund($work_prc, $work, $us, $us_wr, $user, $id)
{
global $gen_parameters;
// --- ЗАЩИТА ОТ ПОВТОРНЫХ ЗАПРОСОВ ---
dbquery("START TRANSACTION");
// Блокируем строку сделки
$lock = FetchAssoc(dbquery("
SELECT stade
FROM work_processed
WHERE id = ?
FOR UPDATE
", [$id]));
// Если стадия уже не 2 — возврат уже был или невозможен
if (!$lock || $lock['stade'] != 2) {
dbquery("ROLLBACK");
return false;
}
// ------------------------------------
if ($work_prc['stade'] == 2) {
// Проверка кулдауна
if (hasDealCooldownPassed($work_prc['k_work'])) {
dbquery("ROLLBACK");
return false;
}
// Комиссия и суммы
$commissionData = Commission($work_prc['k_money'], $work_prc['deal_commiss']);
$backProfit = $commissionData['profit'];
$commission_work = $commissionData['commission'];
// Коррекция прибыли проекта
if ($work_prc['deal_commiss'] > 0) {
if (!dbquery("UPDATE project_profit SET fullprofit = fullprofit - ? WHERE id = ?", [$commission_work, 1])) {
dbquery("ROLLBACK");
return false;
}
}
// Списать у заказчика
if (!dbquery("UPDATE users SET k_money = k_money - ? WHERE id = ?", [$backProfit, $us['id']])) {
dbquery("ROLLBACK");
return false;
}
// Вернуть исполнителю
if (!dbquery("UPDATE users SET k_money = k_money + ? WHERE id = ?", [$work_prc['k_money'], $us_wr['id']])) {
dbquery("ROLLBACK");
return false;
}
// Транзакции
if ($work_prc['deal_commiss'] > 0) {
updateTransactions(0, $work_prc['k_order'], 4, 0, 4);
}
updateTransactions($us_wr['id'], $work_prc['k_order'], 4, 1, 3);
updateTransactions($us['id'], $work_prc['k_order'], 4, 0, 3);
// Сообщение в чат
$text = ($us_wr['id'] != $user['id'] && $us['id'] != $user['id'])
? "[QUOTEMESSAGEROOT][BMESSAGEROOT]Арбитр отменил сделку №{$work_prc['id']} ({$work['name_work']}) на сумму {$work_prc['k_money']} ₽. [BRMESSAGEROOT]Деньги возвращены вам на счет.[/BRMESSAGEROOT][/BMESSAGEROOT][/QUOTEMESSAGEROOT]"
: "[QUOTEMESSAGEROOT][BMESSAGEROOT]Вернул деньги с заказа №{$work_prc['id']} ({$work['name_work']}) в сумме {$work_prc['k_money']} ₽. [BRMESSAGEROOT]Деньги возвращены вам на счет.[/BRMESSAGEROOT][/BMESSAGEROOT][/QUOTEMESSAGEROOT]";
insertMessage($us['id'], $us_wr['id'], $text);
// Обновить стадию сделки
$up_stade = dbquery("UPDATE work_processed SET stade = '3' WHERE id = ?", [$id]);
if (!$up_stade) {
dbquery("ROLLBACK");
return false;
}
// --- ФИКСИРУЕМ ВСЁ ---
dbquery("COMMIT");
RedirectToPage('/deal' . $id);
exit();
}
dbquery("ROLLBACK");
return false;
}
function openDispute($work_prc, $work, $us, $us_wr, $user, $order, $id)
{
// --- ЗАЩИТА ОТ ПОВТОРНЫХ ЗАПРОСОВ ---
dbquery("START TRANSACTION");
// Блокируем строку сделки
$lock = FetchAssoc(dbquery("
SELECT stade
FROM work_processed
WHERE id = ?
FOR UPDATE
", [$id]));
// Если стадия уже не 1 — спор уже открыт или невозможен
if (!$lock || $lock['stade'] != 1) {
dbquery("ROLLBACK");
return false;
}
// ------------------------------------
if ($work_prc['stade'] == 1) {
// Причина спора
$reason = chars($_POST['dispute-info']);
// Создание спора
$set = dbquery("INSERT INTO disputes (status_disp, us_open_disp, deal_disp, info_disp) VALUES (0, ?, ?, ?)", [
$user['id'],
$id,
$reason
]);
if (!$set) {
dbquery("ROLLBACK");
return false;
}
// Получаем спор
$dispute = FetchAssoc(dbquery("SELECT * FROM disputes WHERE deal_disp=?", [$id]));
// Определяем кому отправить сообщение
$receiver = ($dispute['us_open_disp'] == $us_wr['id']) ? $us['id'] : $us_wr['id'];
// Сообщение в чат
$text = "[QUOTEMESSAGEROOT][BMESSAGEROOT]Открыл спор по заказу #{$work_prc['id']} ({$work['name_work']}) на сумму {$work_prc['k_money']} ₽[BRMESSAGEROOT]Причина:[/BRMESSAGEROOT][BRMESSAGEROOT]{$dispute['info_disp']}[/BRMESSAGEROOT][/BMESSAGEROOT][/QUOTEMESSAGEROOT]";
insertMessage($dispute['us_open_disp'], $receiver, $text);
// Обновляем стадию сделки
$up_stade = dbquery("UPDATE work_processed SET stade='4' WHERE id=?", [$id]);
if (!$up_stade) {
dbquery("ROLLBACK");
return false;
}
// --- ФИКСИРУЕМ ВСЁ ---
dbquery("COMMIT");
// --- ВНЕ ТРАНЗАКЦИИ ---
$dispute_user = FetchAssoc(dbquery("SELECT * FROM users WHERE id=?", [$dispute['us_open_disp']]));
// Редирект
RedirectToPage('/deal' . $id);
exit();
}
dbquery("ROLLBACK");
return false;
}
function processDealFail($work_prc, $work, $us, $us_wr, $user, $order, $orderHash, $id, $users_perms, $disp)
{
// --- ЗАЩИТА ОТ ПОВТОРНЫХ ЗАПРОСОВ ---
dbquery("START TRANSACTION");
// Блокируем строку сделки
$lock = FetchAssoc(dbquery("
SELECT stade
FROM work_processed
WHERE id = ?
FOR UPDATE
", [$id]));
// Если стадия уже не 4 — срыв уже был или невозможен
if (!$lock || $lock['stade'] != 4) {
dbquery("ROLLBACK");
return false;
}
// ------------------------------------
if ($work_prc['stade'] == 4) {
// Проверка валидности действия
$valid = ($order['key_work'] == $orderHash || $users_perms['manage_deal'] == 1);
if (!$valid) {
dbquery("ROLLBACK");
showAlert('Ошибка', 'fail', 'Параметры сделки не совпадают с исходными<br>Необходимо открыть спор и дождаться арбитра');
ReloadPage();
return false;
}
// Вернуть деньги заказчику
$pay = dbquery("UPDATE users SET k_money = k_money + ? WHERE id = ?", [
$work_prc['k_money'],
$us_wr['id']
]);
if (!$pay) {
dbquery("ROLLBACK");
return false;
}
// Закрыть спор, если есть
closeDisputeIfExists($disp, $id);
// Транзакции
updateTransactions($us_wr['id'], $work_prc['k_order'], 4, 1, 3);
updateTransactions($us['id'], $work_prc['k_order'], 4, 0, 3);
// Сообщение в чат
$text = ($us_wr['id'] != $user['id'] && $us['id'] != $user['id'])
? "[QUOTEMESSAGEROOT][BMESSAGEROOT]Арбитр отменил заказ №{$work_prc['id']} ({$work['name_work']}) на сумму {$work_prc['k_money']} ₽. [BRMESSAGEROOT]Деньги возвращены вам на счет.[/BRMESSAGEROOT][/BMESSAGEROOT][/QUOTEMESSAGEROOT]"
: "[QUOTEMESSAGEROOT][BMESSAGEROOT]Отказался от выполнение заказа №{$work_prc['id']} ({$work['name_work']}) на сумму {$work_prc['k_money']} ₽. [BRMESSAGEROOT]Деньги возвращены вам на счет.[/BRMESSAGEROOT][/BMESSAGEROOT][/QUOTEMESSAGEROOT]";
insertMessage($us['id'], $us_wr['id'], $text);
// Обновление стадии сделки и времени закрытия
$up_stade = dbquery("UPDATE work_processed SET stade='3', time_close_work=? WHERE id=?", [
time(),
$id
]);
if (!$up_stade) {
dbquery("ROLLBACK");
return false;
}
// --- ФИКСИРУЕМ ВСЁ ---
dbquery("COMMIT");
// Удаление ключа сделки
dbquery("DELETE FROM works_transact_orders WHERE key_work=?", [$orderHash]);
// Редирект
RedirectToPage('/deal' . $id);
exit();
}
dbquery("ROLLBACK");
return false;
}
function processDealSuccess($work_prc, $work, $us, $us_wr, $user, $order, $orderHash, $id, $users_perms, $disp)
{
global $gen_parameters;
// --- ЗАЩИТА ОТ ПОВТОРНЫХ ЗАПРОСОВ ---
dbquery("START TRANSACTION");
// Блокируем строку сделки
$lock = FetchAssoc(dbquery("
SELECT stade
FROM work_processed
WHERE id = ?
FOR UPDATE
", [$id]));
if ($work_prc['k_money'] <= 0) {
dbquery("ROLLBACK");
return false;
}
// Если стадия уже не 1 — сделка уже подтверждена или невозможна
if (!$lock || $lock['stade'] != 1 && $lock['stade'] != 4) {
dbquery("ROLLBACK");
return false;
}
// ------------------------------------
if ($work_prc['stade'] == 1 || $work_prc['stade'] == 4) {
// Проверка валидности действия
$valid = ($order['key_work'] == $orderHash || $users_perms['manage_deal'] == 1);
if (!$valid) {
dbquery("ROLLBACK");
showAlert('Ошибка', 'fail', 'Параметры сделки не совпадают с исходными<br>Необходимо открыть спор и дождаться арбитра');
ReloadPage();
return false;
}
// Комиссия и профит
$commissionData = Commission($work_prc['k_money'], $work_prc['deal_commiss']);
$commission = $commissionData['commission'];
$userProfit = $commissionData['profit'];
// Начислить исполнителю его профит
$pay = dbquery("UPDATE users SET k_money = k_money + ? WHERE id = ?", [
$userProfit,
$us['id']
]);
if (!$pay) {
dbquery("ROLLBACK");
return false;
}
// Комиссия системе
if ($work_prc['deal_commiss'] > 0) {
insertTransaction($commission, 0, 1, 1, 4, $work_prc['k_order']);
dbquery("UPDATE project_profit SET fullprofit = fullprofit + ? WHERE id = 1", [$commission]);
}
// Закрыть спор, если есть
closeDisputeIfExists($disp, $id);
// Транзакции
updateTransactions($us_wr['id'], $work_prc['k_order'], 1, 0, 3);
updateTransactions($us['id'], $work_prc['k_order'], 1, 1, 3);
// Сообщение в чат
$text = ($us_wr['id'] != $user['id'] && $us['id'] != $user['id'])
? "[QUOTEMESSAGEROOT][BMESSAGEROOT]Арбитр подтвердил выполнение заказа №{$work_prc['id']} ({$work['name_work']}) на сумму {$work_prc['k_money']} ₽[/BMESSAGEROOT][/QUOTEMESSAGEROOT]"
: "[QUOTEMESSAGEROOT][BMESSAGEROOT]Подтвердил выполнение заказа №{$work_prc['id']} ({$work['name_work']}) на сумму {$work_prc['k_money']} ₽[/BMESSAGEROOT][/QUOTEMESSAGEROOT]";
insertMessage($us_wr['id'], $us['id'], $text);
// Обновление стадии сделки
$up_stade = dbquery("UPDATE work_processed SET stade='2', time_close_work=? WHERE id=?", [
time(),
$id
]);
if (!$up_stade) {
dbquery("ROLLBACK");
return false;
}
// --- ФИКСИРУЕМ ВСЁ ---
dbquery("COMMIT");
// Удаление ключа сделки
dbquery("DELETE FROM works_transact_orders WHERE key_work=?", [$orderHash]);
// Редирект
RedirectToPage('/deal' . $id);
exit();
}
dbquery("ROLLBACK");
return false;
}
?>