/** * ищет фрилансеров у которых заканчивается срок размещения объявления */ 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', '', 'Ошибка списания, автопродление отключено.'); } } } } } }
//Здесь счет создастся при редактировании конкурса $items['contest']['no_pro'] = $tmpPrj->isEdit() ? 0 : 3300; $items['contest']['pro'] = $tmpPrj->isEdit() ? 0 : 3000; $op_code = is_pro() ? new_projects::OPCODE_KON : new_projects::OPCODE_KON_NOPRO; } $op_code_pay = new_projects::OPCODE_PAYED_KON; } else { $op_code = new_projects::OPCODE_PAYED; $op_code_pay = new_projects::OPCODE_PAYED; } if ($items) { $bill->start(); // Конкурс if ($items['contest'] > 0) { $option['items'] = array('contest' => $items['contest']); $bill->setOptions($option); $success = $bill->create($op_code, 0, false); $items['contest'] = 0; } // Создаем услуги по отдельности foreach ($items as $opt => $value) { if (is_array($value) && $value['no_pro'] <= 0) { continue; } if ($value <= 0) { continue; } /* Почему-то этот код здесь был. Не купятся услуги, если при редактировании не покупается логотип * Проверка на наличие ранее купленных должна быть именно тут, до создания счета * Делалось, видимо, чтобы деньги не списывались при редактировании, но отказ обрабатывать - не выход if($opt == 'hide' && $tmpPrj->isEdit()) {
/** * Верификация через FF.RU. * Шаг 2. Получения кода авторизация и общение с ff.ru * * @global type $DB * @param type $uid * @param type $code * @return boolean */ public function ffCommit($uid, $code) { global $DB; $requestConfig = array('adapter' => 'HTTP_Request2_Adapter_Curl', 'connect_timeout' => 20, 'protocol_version' => '1.1', 'ssl_verify_peer' => false, 'ssl_verify_host' => false, 'ssl_cafile' => null, 'ssl_capath' => null, 'ssl_passphrase' => null); $user = new users(); $user->GetUserByUID($uid); if (empty($user->uid)) { $this->error = 'Вы не авторизованы'; return false; } $prev = $DB->row("SELECT * FROM verify_ff WHERE user_id = ? ORDER BY req_time DESC LIMIT 1", $uid); if ($prev['result'] != 'f') { $this->error = 'Вам необходимо использовать такую же учетную запись с который вы начинали верификацию.'; return false; } // Для тестирования на бете/альфе if (is_release()) { // меняем код авторизации на токен $request = new HTTP_Request2('https://ff.ru/oauth/token', HTTP_Request2::METHOD_POST); $request->setConfig($requestConfig); $request->setHeader('Content-Type', 'application/x-www-form-urlencoded'); $request->addPostParameter('client_id', FF_CLIENT_ID); $request->addPostParameter('client_secret', md5(FF_CLIENT_ID . FF_CLIENT_SECRET)); $request->addPostParameter('grant_type', 'authorization_code'); $request->addPostParameter('code', $code); $request->addPostParameter('redirect_uri', self::FF_REDIRECT_URI); $resp = $request->send(); //var_dump($resp); // del $body = json_decode(iconv('UTF-8', 'CP1251', $resp->getBody())); if ($resp->getStatus() == 200) { // меняем токен на паспортные данные $request = new HTTP_Request2('https://ff.ru/oauth/userinfo', HTTP_Request2::METHOD_GET); $request->setConfig($requestConfig); $request->setHeader('Authorization', 'Bearer ' . $body->access_token); $url = $request->getUrl(); $url->setQueryVariable('scope', 'passport question account video'); $resp = $request->send(); $body = json_decode($resp->getBody()); $DB->query("UPDATE verify_ff SET body = ? WHERE id = ?", $resp->getBody(), $prev['id']); if ($resp->getStatus() == 200) { if (empty($body->passport_sn)) { $this->error = 'Необходимо подтвердить личность в личном кабинете сайта FF.RU.'; return false; } $fio = $body->last_name . ' ' . $body->first_name . ' ' . $body->patronimic; $this->data = array('fio' => iconv('UTF-8', 'CP1251', htmlentities($fio, ENT_QUOTES, "UTF-8")), 'birthday' => dateFormat('Y-m-d', (string) $body->birth_date), 'idcard_name' => 'Паспорт', 'idcard' => $body->passport_sn, 'idcard_from' => dateFormat('Y-m-d', (string) $body->passport_date), 'idcard_to' => NULL, 'idcard_by' => iconv('UTF-8', 'CP1251', htmlentities($body->passport_issuer, ENT_QUOTES, "UTF-8")), 'mob_phone' => '+7' . $body->cellular); //var_dump($this->data); } else { if (empty($body->error)) { $this->error = 'Ошибка при получении данных с FF.RU.'; } else { $this->error = 'Ошибка при получении данных с FF.RU (' . $body->error . ' / ' . $body->error_description . '). '; } $this->error .= $resp->getStatus() . '.'; return false; } } else { if (empty($body->error)) { $this->error = 'Ошибка при подключении к сервису FF.RU.'; } else { $this->error = 'Ошибка при подключении к сервису FF.RU (' . $body->error . ' / ' . $body->error_description . '). '; } $this->error .= $resp->getStatus() . '.'; return false; } } else { $this->data = array('fio' => 'Фамилия Имя Отчество', 'birthday' => dateFormat('Y-m-d', (string) '1950-01-01'), 'idcard_name' => 'Паспорт', 'idcard' => '1900 100001', 'idcard_from' => dateFormat('Y-m-d', (string) '2000-01-01'), 'idcard_to' => NULL, 'idcard_by' => 'УВД г. Города', 'mob_phone' => '+79' . rand(100000000, 900000000)); } $this->is_pro = true; if ($user->is_pro != 't' && empty($prev['bill_id'])) { //переносим сюда списание средств $account = new account(); // $billId = NULL; // $transactionId = $account->start_transaction($uid); // $description = 'Верификация через сервис FF.RU'; // $buyResult = $account->Buy($billId, $transactionId, self::FF_OP_CODE, $uid, $description, $description, 1, 0); // if ( $buyResult ) { // $this->error .= $buyResult; // return false; // } require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/billing.php"; $bill = new billing($uid); $bill->setOptions(array('prev' => $prev, 'data' => $this->data)); $create_id = $bill->create(self::FF_OP_CODE); $this->is_pro = false; if (!$create_id) { $this->error .= 'Ошибка создания услуги'; return false; } else { return true; //header("Location: /bill/orders/"); exit; } } $DB->query("UPDATE verify_ff SET is_pro = ?, bill_id = ? WHERE id = ?", $user->is_pro, $billId, $prev['id']); if ($this->verify($uid)) { $DB->query("UPDATE verify_ff SET result = TRUE WHERE id = ?", $prev['id']); //$account->commit_transaction($transactionId, $uid); return true; } }