/** * Перевод денег на другой аккаунт * * @param integer $uid UID переводящего * @param integer $gid UID кому переводят * @param integer $sum сумма * @param integer $transaction_id идентификатор транзакции * @param string $comments комментарии переводящего * @return integer 1 - все ок, 0 - иначе */ function transfer($uid, $gid, $sum, $transaction_id, $comments, $commit = true, $trs_sum = 0) { global $DB; $user_transfer = $gid; if (!$transaction_id || $transaction_id != $this->check_transaction($transaction_id, $uid)) { $this->view_error("Невозможно завершить транзакцию"); } else { $res = $DB->query("SELECT account.sum, account.id FROM account WHERE account.uid=?", $uid); if ($DB->error) { return "Ошибка при получении информации о счете!"; } list($ac_sum, $bill_id) = pg_fetch_row($res); if ($sum > $ac_sum) { return "Недостаточно средств на счету!"; } $ok = $this->GetInfo($gid); if (!$ok) { $this->CreateNew($gid); $this->GetInfo($gid); } if ($sum < 0) { return "Перевод на отрицательную сумму!"; } $descr = ''; $res = $DB->query("SELECT gid, id FROM MakeGift(?, ?, ?, ?, ?, ?, ?, ?, ?, ?) as (gid integer, id integer)", $bill_id, $this->id, 23, $sum, $descr, $comments, $uid, $gid, $sum, $trs_sum); if ($DB->error) { return "Ошибка при записи счета!"; } else { $_SESSION['ac_sum'] = $_SESSION['ac_sum'] - $sum; } list($gid, $id) = pg_fetch_row($res); if ($commit) { $this->commit_transaction($transaction_id, $uid, $id); } // для счетчика everesttech.net (см. engine/templates/footer.tpl) if ($sum > 0) { $_SESSION['everesttech_conter'] = 1; } $user = new users(); $user->GetUserByUID($user_transfer); // Обновляем сессию пользователю сразу при поступлении денежных средств $session = new session(); $session->UpdateAccountSum($user->login); // уведомление в юзербаре require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/bar_notify.php"; $bar_notify = new bar_notify($user->uid); $bar_notify->addNotify('bill', null, "На счет зачислено {$sum} руб."); return 1; } return 0; }
/** * для имитация окончания PRO у пользователя * * @param $attempt текущая попытка продления */ function checkAutoProTest($login, $attempt = 1) { require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/billing.php"; require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/bar_notify.php"; require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/smail.php"; require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/wallet/wallet.php"; global $DB; if ($attempt <= 0) { $attempt = 1; } $sql = "\n SELECT users.uid, a.id as acc_id, email, login, uname, usurname, subscr, role, substr(subscr::text,16,1) = '1' as bill_subscribe\n FROM users\n INNER JOIN account a ON a.uid = users.uid\n WHERE users.login = ?"; $user = $DB->row($sql, $login); if (!$user) { return; } $user['date_end'] = date('Y-m-d H:i:s', time()); $op_code = !is_emp($user['role']) ? 48 : 15; $price = !is_emp($user['role']) ? self::PRICE_FRL_PRO : self::PRICE_EMP_PRO; $billing = new billing($user['uid']); $queueID = $billing->create($op_code, 1); if (!$queueID) { return; } //Проталкиваем дальше автопродление для оплаты $billing->preparePayments($price, false, array($queueID)); $complete = billing::autoPayed($billing, $price); // @todo отключать ли автопродление или нет при второй попытке ( по идее на систему никак влиять не будет ) // Автопродление не будет куплено уведомляем об этом пользователя $barNotify = new bar_notify($user['uid']); $mail = new smail(); if ($complete) { $barNotify->addNotify('bill', '', 'Услуга успешно продлена.'); $mail->successAutoprolong(array('user' => $user, 'sum_cost' => $price), 'pro'); //$mail->sendAutoPROEnding(( $user['role'] == 'freelancer' ? 'FRL' : 'EMP' ), array($user)); } else { if ($attempt == 1) { $barNotify->addNotify('bill', '', 'Ошибка списания, услуга не продлена.'); $mail->attemptAutoprolong(array('user' => $user, 'sum_cost' => $price), 'pro'); } else { $barNotify->addNotify('bill', '', 'Ошибка списания, автопродление отключено.'); $mail->failAutoprolong(array('user' => $user, 'sum_cost' => $price), 'pro'); } } }
} } unset($historyItem); if ($nSbr) { $sbrSchemes = sbr_meta::getShemesSbr($sbrIds); if ($sbrSchemes) { foreach ($history['items'] as &$historyItem) { if ((int) $historyItem["sbrId"]) { $historyItem['comments'] = sbr_meta::parseOpComment($historyItem['comments'], null, null, $sbrSchemes[$historyItem["sbrId"]]); } } } } unset($historyItem); // делаем уведомления прочитанными $barNotify = new bar_notify($_SESSION['uid']); $barNotify->delNotifies(array('page' => 'bill')); if ($page > 1 && $page > $history['pagesCount']) { header_location_exit('/404.php'); } $events = account::searchBillEvent($startTime ? $startTime : '2000-01-01', time()); $js_file = array('billing.js'); $is_jury = sbr_meta::isFtJuri($uid); $is_emp = is_emp(); $isAllowAddFunds = !$is_emp && !$is_jury; if ($isAllowAddFunds) { require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/quick_payment/quickPaymentPopupAccount.php'; quickPaymentPopupAccount::getInstance()->init(array('acc_sum' => $bill->getAccSum())); } //Пользователь юрик с заполненными реквизитами? $isAllowBillInvoice = $is_jury;
/** * ищет фрилансеров у которых заканчивается срок размещения объявления */ public static function autoPayedReminder($days = 1, $interval = 'days', $test = false) { require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/bar_notify.php"; require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/billing.php"; require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/smail.php"; require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/professions.php"; global $DB; $sql = "\n SELECT ufa.*, a.sum, a.id as acc_id, p.name as prof_name, u.uname, u.login, u.email, u.usurname, u.subscr, u.is_banned, substr(u.subscr::text,16,1) = '1' as bill_subscribe, ufl.to_date\n FROM users_first_page_autopay ufa\n INNER JOIN (\n SELECT user_id, profession, MAX(from_date + to_date) as to_date\n FROM users_first_page\n WHERE payed = true\n AND ordered = true\n GROUP BY user_id, profession\n ) as ufl\n ON ufl.user_id = ufa.user_id\n AND ufl.profession = ufa.profession "; if (!$test && $interval == 'days') { $sql .= "\n AND ufl.to_date >= now()::date + interval '{$days} days' AND ufl.to_date < now()::date + interval '" . ($days + 1) . " days'"; } elseif (!$test && $interval == 'hour') { $sql .= "\n AND ufl.to_date >= now() + interval '{$days} hour' AND ufl.to_date < now() + interval '" . ($days + 1) . " hour'"; } else { $uid = $DB->val("SELECT uid FROM users WHERE login = ?", $test); $sql .= $DB->parse(" AND ufl.to_date >= now()::date AND ufl.user_id = ?", $uid); } $sql .= "\n INNER JOIN account a ON a.uid = ufa.user_id\n INNER JOIN professions p ON p.id = ufa.profession\n INNER JOIN users u ON u.uid = ufa.user_id AND u.is_banned = B'0'"; $res = $DB->rows($sql); if (!$res) { return false; } $price = self::getPrice(); $users = array(); foreach ($res as $user) { $cost = $price[$user['profession']] ? $price[$user['profession']] : $price['n']; $users[$user['user_id']]['profs'][] = array('id' => $user['profession'], 'cost' => $cost, 'name' => $user['prof_name'], 'to_date' => $user['to_date']); $users[$user['user_id']]['userData'] = $user; $users[$user['user_id']]['user'] = $user; $users[$user['user_id']]['sum_cost'] += $cost; } if (!$users) { return; } // если остается от 1 до 2 дней до окончания, то формируем списки заказов if ($days == 1) { $mail = new smail(); foreach ($users as $uid => $user) { $bill = new billing($uid); $bill->cancelAllNewAndReserved(); $barNotify = new bar_notify($uid); // отдельный блок для каждой профессии foreach ($user['profs'] as $userProf) { $tarif = self::getBillingTarif($userProf['id']); $options = array('prof_id' => $userProf['id'], 'week' => 1); $bill->setOptions($options); $create = $bill->create($tarif, true, false); if (!$create) { continue; } $queue[] = $create; } $billing = new billing($uid); if (!empty($queue)) { //Проталкиваем дальше автопродление для оплаты $billing->preparePayments($user['sum_cost'], false, $queue); $complete = billing::autoPayed($billing, $user['sum_cost']); $user['prof'] = $user['profs']; if ($complete) { $barNotify->addNotify('bill', '', 'Услуга успешно продлена.'); } else { if ($interval == 'days') { // Первая попытка $barNotify->addNotify('bill', '', 'Ошибка списания, услуга не продлена.'); } else { // Вторая попытка не удачная $barNotify->addNotify('bill', '', 'Ошибка списания, автопродление отключено.'); } } } } } }
$out['msg']['success'] = true; $out['msg']['count'] = $tip['count']; $out['msg']['count_html'] = view_event_count_format($tip['count']); $out['msg']['tip'] = iconv('CP1251', 'UTF-8', $tip['tip']); } } // события в сбр if (in_array('sbr', $op)) { $tip = notifications::getAllSbrTip(); if ($tip === null) { $out['sbr']['success'] = false; } else { $out['sbr']['success'] = true; $out['sbr']['count'] = $tip['count']; $out['sbr']['count_html'] = view_event_count_format($tip['count']); $out['sbr']['alert'] = $tip['alert']; $out['sbr']['tip'] = iconv('CP1251', 'UTF-8', $tip['tip']); } } // новые события через класс bar_notify $barNotify = new bar_notify(get_uid(0)); $barNotifies = $barNotify->getNotifies(); if (in_array('bill', $op)) { $out['bill']['success'] = true; $out['bill']['count'] = (int) $barNotifies['bill']['count']; $out['bill']['count_html'] = view_event_count_format($tip['count']); $out['bill']['tip'] = iconv('CP1251', 'UTF-8', $barNotifies['bill']['message']); } $out['success'] = true; } echo json_encode($out);