Вход Регистрация
Файл: 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'] > && $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'], 303$orderDigits);
    
insertTransaction($workProfit$work['user_work'], 313$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_work1])) {
                
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'], 404);
        }

        
updateTransactions($us_wr['id'], $work_prc['k_order'], 413);
        
updateTransactions($us['id'],    $work_prc['k_order'], 403);

        
// Сообщение в чат
        
$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'], 413);
        
updateTransactions($us['id'],    $work_prc['k_order'], 403);

        
// Сообщение в чат
        
$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'] != && $lock['stade'] != 4) {
        
dbquery("ROLLBACK");
        return 
false;
    }
    
// ------------------------------------

    
if ($work_prc['stade'] == || $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($commission0114$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'], 103);
        
updateTransactions($us['id'],    $work_prc['k_order'], 113);

        
// Сообщение в чат
        
$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;
}
?>
Онлайн: 0
Реклама