public function process_event(&$event) { global $DB; $this->force_connect(); $r = false; switch ($event->type) { case 'ProjectPosted': $project_id = $event->data['id']; $this->log->notice('New project posted #id = ' . $project_id); $obj_project = new projects(); $project = $obj_project->GetPrjCust($project_id); // Не выбран испольнитель (если испольнитель выбран, то не пишем ответ на этот проект) if ($project && $project['exec_id'] == 0 && $project['kind'] == 1) { $autoresponses = autoresponse::getListForProject($project); foreach ($autoresponses as $autoresponse) { $freelancer = $autoresponse->data['freelancer']; $contacts_freelancer = $autoresponse->data['contacts_freelancer']; // Проверяем если проект только для про, то и пользователь который на него отвечает должен быть ПРО if ($project['pro_only'] == 't' && !payed::CheckPro($freelancer->login)) { continue; } // Проверяем если проект только для верифицированных, то и пользователь который на него отвечает должен быть верифицирован if ($project['verify_only'] == 't' && !$freelancer->IsVerified()) { continue; } // Проверка, что текущий пользователь не является владельцем проекта if ($project['user_id'] == $freelancer->uid) { continue; } // Добавление нового отзыва к проекту $obj_offer = new projects_offers(); $save_contacts = serialize($contacts_freelancer); $DB->start(); $error_offer = $obj_offer->AddOffer($freelancer->uid, $project['id'], '', '', '', '', '', '', antispam(stripslashes($autoresponse->data['descr'])), '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', $autoresponse->toBoolean($autoresponse->data['only_4_cust']), 0, 0, false, false, $save_contacts, 0, $autoresponse->data['id']); // В случае добавление автоответа, уменьшаем счетчик автоответов для пользователя (в транзакции) if ($error_offer || !$autoresponse->reduce($freelancer, $obj_offer, $project_id)) { $this->log->notice('Rollback autoresponse posted for project #id = ' . $project_id); $DB->rollback(); } else { $obj_project->incrementViews($project_id); $this->log->notice(sprintf('New autoresponse #%d posted for project #%d', $obj_offer->offer_id, $project_id)); $DB->commit(); } } } break; } return PGQ_EVENT_OK; }
function GetMorePrj($uid) { session_start(); $objResponse = new xajaxResponse(); $html = ''; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/projects_offers.php'; $prjs = projects_offers::GetFrlOffers($uid, 'marked', NULL); $i = 0; $uid = get_uid(FALSE); $is_adm = hasPermissions('users'); if ($prjs) { foreach ($prjs as $p) { $is_link = $uid > 0 && (in_array($uid, array($p['exec_id'], $p['project_user_id'], $p['offer_user_id'])) || $is_adm); ++$i; $html .= "<li><span class='prj_list_number'>{$i}.</span>"; if ($p['kind'] == 9) { $html .= $is_link ? "<a href='" . getFriendlyURL('project', $p['project_id']) . "'>{$p['project_name']}</a>" : "{$p['project_name']}"; } else { $html .= "<a href='" . getFriendlyURL('project', $p['project_id']) . "'>{$p['project_name']}</a>"; } if ($p['position'] > 0 && $p['is_executor'] == 't') { //$html .= " ({$p['position']}-е место)"; } if ($p['refused'] == 't') { $html .= "<p>Отказ: <span class='ops-minus'>" . $p['rating'] . '</span></p>'; } if ($p['selected'] == 't') { $html .= "<p><span>Кандидат: <span class='ops-plus'>+" . $p['rating'] . '</span></p>'; } if ($p['is_executor'] == 't' && $p['position'] <= 0) { $html .= "<p><span>Исполнитель: <span class='ops-plus'>+" . $p['rating'] . '</span></p>'; } if ($p['position'] > 0) { $html .= "<p>{$p['position']}-е место: <span class='ops-plus'>+{$p['rating']}</span></p>"; } $html .= '</li>'; } $objResponse->assign('prj_list', 'innerHTML', $html); } return $objResponse; }
/** * Аутентификация пользователя и заполнение его сессии необходимыми данными. * * @param string $login логин пользователя * @param string $pwd пароль пользователя * @param array ¶ms данные пользователя * @param boolean $is_2fa_off принудительное откулючение 2х этапной проверки * * @return integer id сессии * * @global DB $DB */ public function Auth($login, $pwd, &$params, $is_2fa_off = false) { ////////////////////////////////////////////////////////// // Ахтунг! Изменение логики нужно отражать также в новом движке. // Например, при добавлении новый полей в сессию, добавьте их в Web_Front::login() ////////////////////////////////////////////////////////// global $DB; $plogin = preg_replace('/[+ ()-]/', '', $login); $phoneType = preg_replace("/\\D/", '', $plogin); if ($phoneType == $plogin) { $plogin = '******' . $plogin; $sql = "SELECT user_id FROM sbr_reqv WHERE (_1_mob_phone = ? OR _2_mob_phone = ?) AND is_activate_mob = 't'"; $uids = $DB->rows($sql, $plogin, $plogin); if ($uids) { foreach ($uids as $u) { $sql_uids .= $u['user_id'] . ','; } $sql_uids = preg_replace('/,$/', '', $sql_uids); } } $sql = ' SELECT u.email, u.role, u.uname, u.usurname, u.uid, u.is_banned, u.ban_where, u.active, a.sum, a.bonus_sum, u.login, u.anti_uid, u.is_pro_test, u.is_pro_new, u.is_chuck, u.sex, u.settings, u.splash_show, u.is_verify, u.reg_date, ac.code, u.photo, u.is_profi, u.birthday FROM users AS u LEFT JOIN activate_code ac ON ac.user_id = u.uid LEFT JOIN account AS a ON a.uid = u.uid WHERE ((lower(u.login) = ? OR lower(u.email) = ?) AND u.passwd = ?) ' . ($sql_uids ? "OR ( u.uid IN ({$sql_uids}) AND u.passwd = ?)" : ''); $res = $DB->rows($sql, strtolower($login), mb_strtolower($login), $pwd, $pwd); if ($res) { $qres = $res; $uvisits = array(); $n = 0; foreach ($qres as $k => $v) { $uvisits[$this->getLastVisit($v['uid']) . '-' . $n] = $k; ++$n; } asort($uvisits); $res = $qres[array_pop($uvisits)]; } $error .= $DB->error; $first_login = $this->getLastVisit($res['uid']); $ip = getRemoteIP(); /** * Дополнительная проверка логина. * Нужна для исправления паролей, содержащих * теги (или похожие на теги последовательности). * * !!Убрать после следующей глобальной смены паролей. */ if (!$res) { // попробуем убрать (0018079) //$res = $this->FixPassword($sql, $login); } /** * Определяем нужна ли 2хэтапная авторизация. */ if (!$is_2fa_off && count($res) && $first_login) { //не первый вход //если на 2ом этапе ввели другой аккаунт то направить //обратно на 2ой этап и сообщить обэтом if (isset($params['2fa_provider']['uid']) && $params['2fa_provider']['uid'] != $res['uid']) { $is_login = $params['2fa_provider']['type'] == 0; session::setFlashMessage($is_login ? self::TXT_AUTH_2FA_LOG_FAIL : self::TXT_AUTH_2FA_SOC_FAIL, '/auth/second/'); return self::AUTH_STATUS_2FA; } $is_opauth = defined('IS_OPAUTH'); if (!isset($params['2fa_provider']) || $params['2fa_provider']['type'] > 0 != $is_opauth) { //несовпадают типы авторизаций на 2ом этапе require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/opauth/OpauthModel.php'; $opauthModel = new OpauthModel(); $is_2fa = $opauthModel->getMultilevel($res['uid']); if (isset($is_2fa['type'])) { //$is_2fa - авторизация через выбранную соцсеть //0 - нужна обычная авторизация так как вход был выполнен через соцсеть $params['2fa_provider'] = array('type' => !$is_opauth ? $is_2fa['type'] : 0, 'uid' => $res['uid'], 'login' => $res['login']); //Сбрасываем авторизацию $res = array(); //переходим ко 2ой стадии return self::AUTH_STATUS_2FA; } } } //Более нам параметр этапов авторизации не нужен unset($params['2fa_provider']); /** * Успешная авторизация. */ if (count($res)) { list($email, $trole, $tname, $tsurname, $tid, $is_banned, $ban_where, $active, $sum, $bonus_sum, $log, $anti_uid, $is_pro_test, $is_pro_new, $is_chuck, $sex, $settings, $splash_show, $is_verify, $reg_date, $activate_code, $photo, $is_profi, $birthday) = array_values($res); if ($activate_code != '' && $active == 't') { $this->checkRegDate($tid, $reg_date); } if ($is_banned) { return -1; } //if ($active=='f') return -2; //##0027983 if (!$this->CheckUserAllowIP($ip, $tid)) { return -3; } $params['birthday'] = $birthday ? strtotime($birthday) : null; $params['age'] = $params['birthday'] ? intval(ElapsedYears($params['birthday'])) : null; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/permissions.php'; $params['permissions'] = permissions::getUserPermissions($tid); $params['email'] = $email; $params['role'] = $trole; $params['name'] = $tname; $params['surname'] = $tsurname; $params['uid'] = $tid; $params['user_ip'] = $ip; $params['ac_sum'] = zin($sum); $params['bn_sum'] = zin($bonus_sum); $params['login'] = $log; $params['is_pro_new'] = $is_pro_new; $params['pro_test'] = $is_pro_test; $params['is_chuck'] = $is_chuck; $params['is_verify'] = $is_verify; $params['sex'] = $sex; $params['reg_date'] = $reg_date; $params['photo'] = $photo; if (!is_emp($trole)) { $params['is_profi'] = $is_profi === 't'; } if ($anti_uid) { $anti_class = is_emp($trole) ? 'freelancer' : 'employer'; require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/{$anti_class}.php"; $anti = new $anti_class(); $anti->GetUserByUID($anti_uid); $params['anti_uid'] = $anti->uid; $params['anti_login'] = $anti->login; $params['anti_surname'] = $anti->usurname; $params['anti_name'] = $anti->uname; } if (!is_emp($params['role'])) { require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/projects_offers.php'; if ($po_summary = projects_offers::GetFrlOffersSummary($params['uid'])) { $params['po_count'] = $po_summary['total']; } } $sql = 'UPDATE users SET last_time = now(), last_ip = ?, is_active = true WHERE uid = ?i'; $res = $DB->query($sql, $ip, $tid); $this->SaveLoginIPLog($tid, $ip); $this->increaseLoginsCnt($tid); // количество операций $sQuery = 'SELECT COUNT(ao.id) FROM account_operations ao INNER JOIN account a ON a.id = ao.billing_id WHERE a.uid = ?i AND (ao.ammount <> 0 OR ao.trs_sum <> 0)'; $params['account_operations'] = $DB->val($sQuery, $tid); $params['question_button_hide'] = $settings[1]; // Показывать/скрывать кнопку "У вас есть вопрос?" $params['promo_block_hide'] = $settings[2]; // показывать Блок "Быстрый доступ к основным функциям сайта" $params['direct_external_links'] = $settings[3]; // Не показывать страницу "Переход по внешней ссылке" a.php $params['sbr_slash_show'] = $settings[4] && $first_login < strtotime('2012-08-08'); // Показывать/скрыть СБР промо-слеш $params['splash_show'] = $splash_show; $params['chat'] = $settings[5]; $params['chat_sound'] = $settings[6]; // #0017182 > Вопрос можем ли мы вытащить эту настройку из кук пользователей и сохранить ее в базу? if (empty($settings[3]) && $_COOKIE['direct_external_links'] == 1) { $this->setDirectExternalLinks($tid, 1); if ($anti_uid) { $this->setDirectExternalLinks($anti_uid, 1); } setcookie('direct_external_links', '', time() - 60 * 60 * 24 * 365, '/'); setcookie('no_a_php', '1', time() + 60 * 60 * 24 * 365 * 2, '/'); } //генерация куки для userecho require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/userecho.php'; setcookie('ue_sso_token', UserEcho::get_sso_token(USERECHO_API_KEY, USERECHO_PROJECT_KEY, array()), 0, '/', preg_replace('/^https?\\:\\/\\/(?:www\\.)?/', '.', 'fl.ru')); // Первый заход, регистрация через мастер, мастер не закончен if ($first_login == 0) { require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/wizard/wizard.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/wizard/wizard_registration.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/wizard/step_employer.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/wizard/step_freelancer.php'; if (is_emp($params['role'])) { $wiz_user = wizard::isUserWizard($tid, step_employer::STEP_REGISTRATION_CONFIRM, wizard_registration::REG_EMP_ID); } else { $wiz_user = wizard::isUserWizard($tid, step_freelancer::STEP_REGISTRATION_CONFIRM, wizard_registration::REG_FRL_ID); } if ($wiz_user['id'] > 0) { $role = is_emp($params['role']) ? wizard_registration::REG_EMP_ID : wizard_registration::REG_FRL_ID; header('Location: /registration/activated.php?role=' . $role); //header("Location: /wizard/registration/?role={$role}"); exit; } elseif (!is_emp($params['role'])) { require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/payed.php'; $pro_last = payed::ProLast($_SESSION['login']); $_SESSION['pro_last'] = $pro_last['is_freezed'] ? false : $pro_last['cnt']; if ($_SESSION['pro_last'] && $_SESSION['is_pro_new'] != 't') { payed::checkNewPro($id); } if ($pro_last['freeze_to']) { $_SESSION['freeze_from'] = $pro_last['freeze_from']; $_SESSION['freeze_to'] = $pro_last['freeze_to']; $_SESSION['is_freezed'] = $pro_last['is_freezed']; $_SESSION['payed_to'] = $pro_last['cnt']; } if ($_SESSION['anti_login']) { $pro_last = payed::ProLast($_SESSION['anti_login']); $_SESSION['anti_pro_last'] = $pro_last['freeze_to'] ? false : $pro_last['cnt']; } //отправляем письмо с инфой, как работать на сайте /* require_once($_SERVER['DOCUMENT_ROOT'] . "/classes/smail.php"); $mail = new smail(); if (is_emp()) { $mail->employerQuickStartGuide(get_uid(false)); } else { $mail->freelancerQuickStartGuide(get_uid(false)); } */ return $tid; if (!defined('IN_API')) { // для API мобильного приложения не нужно header("Location: /users/{$login}/"); exit; } } } //----------------------------------- } else { $tid = 0; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/annoy.php'; $annoy = new annoy(); $annoy->Add($ip); } return $tid; }
/** * Предложения в проектах. Утверждение/удаление записи * * @param string $stream_id идентификатор потока * @param int $user_id идентификатор модератора * @param int $from_id идентификатор пользователя * @param int $rec_id идентификатор записи * @param int $rec_type тип записи * @param int $action действие: 1 - утверждено, 2 - удалено * @param string $is_sent было ли отправлено уведомление * @param string $reason причина удаления */ function resolvePrjOffers($stream_id = '', $user_id = 0, $from_id = 0, $rec_id = 0, $rec_type = 0, $action = 1, $is_sent = '', $reason = '') { $bRet = false; $sQuery = 'UPDATE moderation SET moder_num = ?i, status = ?i WHERE rec_id = ?i AND rec_type = ?i AND stream_id = ? RETURNING rec_id'; $sRecId = $GLOBALS['DB']->val($sQuery, $this->nResolveCnt, $action, $rec_id, self::MODER_PRJ_OFFERS, $stream_id); if ($sRecId) { $bRet = true; if ($rec_type == 7) { $aData = array('moderator_status' => $user_id); if ($action == 1 && $is_sent == 'f') { // отправка уведомления о новом сообщении require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/pmail.php'; $pmail = new pmail(); $pmail->NewPrjOffer($rec_id); $aData['is_sent'] = true; // устанавливаем флаг отправки } $sDeluserId = $GLOBALS['DB']->val('SELECT deluser_id FROM projects_contest_offers WHERE id = ?i', $rec_id); if ($action == 1 && $sDeluserId && $sDeluserId != $from_id) { $aData['is_deleted'] = false; $aData['deluser_id'] = null; $aData['deleted_reason'] = ''; } elseif ($action == 2 && $sDeluserId != $from_id) { $aData['is_deleted'] = true; $aData['deluser_id'] = $user_id; $aData['deleted_reason'] = $reason; } $GLOBALS['DB']->update('projects_contest_offers', $aData, 'id = ?i', $rec_id); $GLOBALS['DB']->update('projects_offers', array('moderator_status' => $user_id), 'id = ?i', $rec_id); } else { require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/projects_offers.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/admin_log.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/projects.php'; $projects_offers = new projects_offers(); $offer = $projects_offers->GetPrjOfferById($rec_id); $aData = $aData2 = array('moderator_status' => $user_id); $projects = new projects(); $project = $projects->GetPrjCust($offer['project_id']); $sObjName = $project['name']; $sObjLink = getFriendlyURL('project', $offer['project_id']); if ($action == 1) { if ($is_sent == 'f') { // отправка уведомления о новом сообщении require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/pmail.php'; $pmail = new pmail(); $pmail->NewPrjOffer($rec_id); $aData['is_sent'] = true; // устанавливаем флаг отправки } if ($offer['blocked_time']) { $projects_offers->UnBlocked($rec_id); // пишем лог админских действий admin_log::addLog(admin_log::OBJ_CODE_PROJ, admin_log::ACT_ID_PRJ_UNBLOCK_OFFER, $from_id, $rec_id, $sObjName, $sObjLink, 0, '', 0, ''); } } elseif ($action == 2 && !$offer['blocked_time']) { $sReason = 'Содержит запрещенную информацию'; $sBlockId = $projects_offers->Blocked($rec_id, $from_id, $offer['project_id'], $reason, 0, $user_id, true); // пишем лог админских действий admin_log::addLog(admin_log::OBJ_CODE_PROJ, admin_log::ACT_ID_PRJ_BLOCK_OFFER, $from_id, $rec_id, $sObjName, $sObjLink, 0, '', 0, $sReason, $sBlockId); } $GLOBALS['DB']->update('projects_offers', $aData, 'id = ?i', $rec_id); $GLOBALS['DB']->update('projects_offers_dialogue', $aData2, 'po_id = ?i AND root = true', $rec_id); } } return $bRet; }
break; case 'refuse': if ($PDA) { $po_id = intval($_GET['id']); $prj_id = intval($_GET['pid']); $user_id = intval($_GET['uid']); $prj = new projects(); $project = $prj->GetPrj($emp_id, $prj_id, 1); if (!$project) { $content = '404.php'; include '../template2.php'; exit; } if (isset($_GET['refuse'])) { $user = new users(); $prj_offer = new projects_offers(); $po_reason = intval($_GET['refuse']); $emp_id = get_uid(false); $emp_name = $user->GetName($emp_id, $error); //Не позволяем производить действия с заблокированным проектом if (projects::CheckBlocked(intval($prj_id))) { $objResponse->script("document.location.href='/projects/index.php?pid=" . intval($prj_id) . "'"); } else { $error = ''; $project = $prj->GetPrjCust($prj_id); if ($project['exec_id'] == $user_id) { $error = $prj->ClearExecutor($prj_id, $emp_id); } if (!$error) { $prj_offer->SetRefused($po_id, $prj_id, $user_id, $po_reason, true); header('Location: /projects/index.php?pid=' . intval($prj_id));
/** * Отдает HTML для Редактирование предложения по проектам * * @param object $objResponse xajaxResponse * @param string $rec_id идентификатор записи * @param string $rec_type тип записи * @param array $aParams дополнительные параметры с UID отправителя. остальные - опционально * @return string */ function _admEditPrjOfferParseForm(&$objResponse, $rec_id = '', $rec_type = '', $aParams = array()) { require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/users.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/account.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/portfolio.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/professions.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/projects_offers.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/projects_offers_answers.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/projects_offers_dialogue.php'; $offer = projects_offers::GetPrjOfferById($rec_id); $dialogue = new projects_offers_dialogue(); $user = new users(); $account = new account(); $portfolio = new portfolio(); $professions = professions::GetSelFilProf($offer['user_id']); $professions = $professions ? $professions : array(); $cur_prof = $professions ? $professions[0]['id'] : 0; $op_sum = projects_offers_answers::COLOR_FM_COST; if (!($portf_works = $portfolio->GetPortfProf($offer['user_id'], $cur_prof))) { $portf_works = array(); } $user->GetUserByUID($offer['user_id']); $account->GetInfo($offer['user_id']); $offer['dialogue'] = $dialogue->GetDialogueForOffer($offer['id']); ob_start(); include_once $_SERVER['DOCUMENT_ROOT'] . '/user/adm_edit_tpl/projects_offers.php'; $sHtml = ob_get_contents(); ob_end_clean(); // текст $sOnReady = "if(document.getElementById('adm_edit_descr')) document.getElementById('adm_edit_descr').value = (\$('adm_edit_descr_source')? \$('adm_edit_descr_source').value : null);"; // работы ----------------------------------- $offer['portfolio_work_1_id'] = $offer['portf_id1']; $offer['portfolio_work_2_id'] = $offer['portf_id2']; $offer['portfolio_work_3_id'] = $offer['portf_id3']; $offer['portfolio_work_1'] = $offer['pict1']; $offer['portfolio_work_2'] = $offer['pict2']; $offer['portfolio_work_3'] = $offer['pict3']; $offer['portfolio_work_1_prev_pict'] = $offer['prev_pict1']; $offer['portfolio_work_2_prev_pict'] = $offer['prev_pict2']; $offer['portfolio_work_3_prev_pict'] = $offer['prev_pict3']; $offer['cost_from'] = round($offer['cost_from'], 2); $offer['cost_to'] = round($offer['cost_to'], 2); $use = array(); $sWorks = 'adm_edit_content.works_ids = new Array(); adm_edit_content.works_names = new Array(); adm_edit_content.works_prevs = new Array(); adm_edit_content.works_picts = new Array(); adm_edit_content.works_links = new Array();'; if ($portf_works) { foreach ($portf_works as $key => $value) { $use[$value['id']] = 1; $sWorks .= "adm_edit_content.works_ids[{$value['id']}] = '{$value['id']}';\n adm_edit_content.works_names[{$value['id']}] = '" . htmlspecialchars(addslashes(trim($value['name']))) . "';\n adm_edit_content.works_prevs[{$value['id']}] = '" . trim($value['prev_pict']) . "';\n adm_edit_content.works_picts[{$value['id']}] = '" . trim($value['pict']) . "';\n adm_edit_content.works_links[{$value['id']}] = '" . trim($value['link']) . "';"; } } for ($i = 1; $i < 4; $i++) { if ($user_offer['portf_id' . $i] > 0 && !isset($use[$user_offer['portf_id' . $i]])) { $sId = $user_offer['portf_id' . $i]; $sWorks .= "adm_edit_content.works_ids[{$sId}] = '{$sId}';\n adm_edit_content.works_prevs[{$sId}] = '" . trim($user_offer['prev_pict' . $i]) . "';\n adm_edit_content.works_picts[{$sId}] = '" . trim($user_offer['pict' . $i]) . "';"; } } if ($offer['portfolio_work_1'] != '') { $sWorks .= "adm_edit_content.prjOfferAddWork({$offer['portfolio_work_1_id']}, '{$offer['portfolio_work_1']}', '{$offer['portfolio_work_1_prev_pict']}');"; } if ($offer['portfolio_work_2'] != '') { $sWorks .= "adm_edit_content.prjOfferAddWork({$offer['portfolio_work_2_id']}, '{$offer['portfolio_work_2']}', '{$offer['portfolio_work_2_prev_pict']}');"; } if ($offer['portfolio_work_3'] != '') { $sWorks .= "adm_edit_content.prjOfferAddWork({$offer['portfolio_work_3_id']}, '{$offer['portfolio_work_3']}', '{$offer['portfolio_work_3_prev_pict']}');"; } //------------------------------------------- $objResponse->assign('h4_adm_edit', 'innerHTML', 'Редактировать предложения по проекту'); $objResponse->assign('div_adm_edit', 'innerHTML', $sHtml); $objResponse->script("\$('div_adm_reason').setStyle('display', 'none');"); $objResponse->script("adm_edit_content.editMenuItems = ['', 'Основное', 'Файлы'];"); $objResponse->script('adm_edit_content.edit();'); $objResponse->script("adm_edit_content.userLogin = '******';"); $objResponse->script($sOnReady); $objResponse->script($sWorks); $objResponse->script('xajax_getAdmEditReasons(' . admin_log::ACT_ID_EDIT_PRJ_OFFERS . ');'); }
$xajax->printJavascript('/xajax/'); require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/rating.php"; require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/projects_offers.php"; require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/sbr.php"; if (!$rating || !$rating instanceof rating || $rating->data['user_id'] != $user->uid) { $rating = new rating($user->uid, $user->is_pro, $user->is_verify, $user->is_profi); } $r_data = $rating->data; $r_data['kis'] = projects_offers::GetFrlOffersSummary($r_data['user_id']); $r_data['kis']['refused_3'] = (int) $r_data['kis']['refused'] - (int) $r_data['kis']['refused_1'] - (int) $r_data['kis']['refused_0'] - (int) $r_data['kis']['refused_2'] - (int) $r_data['kis']['refused_4']; if (!$r_data['max']) { $r_data['max'] = $rating->get_max_of('total', false); } $sbr_ratings = sbr_meta::getUserRatings($user->uid, is_emp($user->role), 5, 0, $sbr_info['success_cnt']); //$sbr_info['success_cnt'] = sbr_meta::getCountSuccessRatingSbr($user->uid, is_emp($user->role)); if (!($prjs = projects_offers::GetFrlOffers($r_data['user_id'], 'marked', NULL))) { $prjs = array(); } $kis_per_refused = round($r_data['kis']['total'] ? 100 * $r_data['kis']['refused'] / $r_data['kis']['total'] : 0, 2); $kis_per_frl_refused = round($r_data['kis']['total'] ? 100 * $r_data['kis']['frl_refused'] / $r_data['kis']['total'] : 0, 2); $kis_per_selected = round($r_data['kis']['total'] ? 100 * $r_data['kis']['selected'] / $r_data['kis']['total'] : 0, 2); $kis_per_executor = round($r_data['kis']['total'] ? 100 * $r_data['kis']['executor'] / $r_data['kis']['total'] : 0, 2); $kis_unknown = (int) $r_data['kis']['total'] - ((int) $r_data['kis']['refused'] + (int) $r_data['kis']['selected'] + (int) $r_data['kis']['executor']) - (int) $r_data['kis']['frl_refused']; $kis_per_unknown = 100 - ($kis_per_refused + $kis_per_selected + $kis_per_executor + $kis_per_frl_refused); $o_contest_rating = round($r_data['o_contest_1'] + $r_data['o_contest_2'] + $r_data['o_contest_3']); $o_contest_ban_rating = round($r_data['o_contest_ban']); $is_owner = $user->uid == $_SESSION['uid']; ?> <style type="text/css"> .rating .big-s {font-size:17px}
/** * Переносим ответы на проекты в работающие таблицы * * @param array $offers Ответы на проекты * @return array */ public function transferOffers($offers) { require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/projects_offers.php"; require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/contest.php"; foreach ($offers as $k => $offer) { $pict1 = str_replace("sm_", "", $offer['pict1']); $pict2 = str_replace("sm_", "", $offer['pict2']); $pict3 = str_replace("sm_", "", $offer['pict3']); // Переносим файлы в рабочие папки сайта $files = $this->_db->rows("SELECT DISTINCT id FROM file_wizard WHERE fname IN (?l)", array($pict1, $pict2, $pict3)); if ($files) { $dir = "users/" . substr($this->user->login, 0, 2) . "/" . $this->user->login . "/upload/"; $table = 'file'; $picts = $this->transferFiles($files, $table, $dir, false); $sm_files = $this->_db->rows("SELECT DISTINCT id FROM file_wizard WHERE fname IN (?l)", array($offer['pict1'], $offer['pict2'], $offer['pict3'])); if ($sm_files) { $sm_picts = $this->transferFiles($sm_files, $table, $dir, false); } } if ($offer['kind'] != 7) { $error = projects_offers::AddOffer(wizard::getUserIDReg(), $offer['project_id'], $offer['cost_from'], $offer['cost_to'], $offer['cost_currency'], $offer['time_from'], $offer['time_to'], $offer['time_type'], $offer['descr'], 0, 0, 0, null, null, null, null, null, null, $picts[0]['fname'], $picts[1]['fname'], $picts[2]['fname'], $sm_picts[0]['fname'], $sm_picts[1]['fname'], $sm_picts[2]['fname']); } else { // Пишем ответ на конкурс $contest = new contest($offer['project_id'], wizard::getUserIDReg()); $error = $contest->CreateOffer($offer['descr'], implode('/', $files), false); if ($picts && $contest->new_oid) { $content_pict = array(); foreach ($picts as $k => $pict) { $content_pict[] = array('uid' => wizard::getUserIDReg(), 'file' => $pict['id'], 'prev' => $sm_picts[$k]['id'], 'orig_name' => $pict['orig_name'], 'post_date' => date('Y-m-d H:i:s')); } $contest->addOfferFiles($contest->new_oid, $content_pict); } } if (!$error) { $delete_offers[] = $offer['id']; } else { $error_offer[] = $error . " - ответ на проект #{$offer['id']}"; } unset($error); } // Очищаем перенесенные данные если нет ошибок если есть выводим if ($error_offer) { foreach ($error_offer as $error) { $this->log->writeln("Error transfer offer content - user (" . wizard::getUserIDReg() . "|" . $this->getWizardUserID() . ") - Error: {$error}"); } } else { if ($delete_offers) { $this->_db->query("DELETE FROM wizard_offers WHERE id IN (?l) AND wiz_uid = ?", $delete_offers, $this->getWizardUserID()); } } return $error_offer; }
/** * @todo: замена NewProj * * Рассылка о новых проектах за предыдущий день. Вызывается раз в день из hourly.php * * @param array $uids - массив идентификаторов пользователей, которых нужно исключить * * @return int количество получивших рассылку */ public function NewProj2($uids = array()) { $show_pro_limit = 25; $show_limit = 25; $projects = projects::GetNewProjectsPreviousDay($error, true); $groups = professions::GetAllGroupsLite(true); $page = 0; $count = 0; $projects_count = count($projects); if (!$projects_count) { return false; } //Получаем баннеры $settings = new settings(); $banner_file = $settings->GetVariable('newsletter', 'banner_file'); $banner_link = $settings->GetVariable('newsletter', 'banner_link'); $this->subject = 'Новые проекты на FL.ru'; $this->message = Template::render($_SERVER['DOCUMENT_ROOT'] . '/templates/mail/new_projects/project_layout.tpl.php', array('projects' => '%MESSAGE%', 'host' => $GLOBALS['host'], 'title' => '%TITLE%', 'unsubscribe_url' => '%UNSUBSCRIBE_URL%', 'date' => strtotime('- 1 day'), 'track_url' => '%TRACK_URL%')); $this->recipient = ''; $massId = $this->send('text/html'); $project_ids = array(); foreach ($projects as $i => $prj) { $descr = $prj['descr']; $descr = htmlspecialchars($descr, ENT_QUOTES, 'CP1251', false); $descr = reformat(LenghtFormatEx($descr, 180), 50, 0, 1); $price = $prj['cost'] ? CurToChar($prj['cost'], $prj['currency']) . getPricebyProject($prj['priceby']) : null; $projects[$i]['html'] = Template::render($_SERVER['DOCUMENT_ROOT'] . '/templates/mail/new_projects/project.tpl.php', array('url' => $GLOBALS['host'] . getFriendlyURL('project', array('id' => $prj['id'], 'name' => $prj['name'])), 'name' => $prj['name'] ? reformat(htmlspecialchars($prj['name'], ENT_QUOTES, 'CP1251', false), 50, 0, 1) : '', 'descr' => $descr, 'host' => $GLOBALS['host'], 'project_kind' => $prj['kind'], 'project_pro_only' => $prj['pro_only'] == 't', 'project_verify_only' => $prj['verify_only'] == 't', 'project_urgent' => $prj['urgent'] == 't', 'price' => $price, 'end_date' => $prj['end_date'], 'create_date' => $prj['create_date'], 'utm_param' => '%UTM_PARAM%')); $project_ids[] = $prj['id']; } //Собираем юзеров у которых есть ответы на новые проекты $offers_exist = array(); $offers = projects_offers::AllFrlOffersByProjectIDs($project_ids); if (count($offers)) { foreach ($offers as $offer) { if (!isset($offers_exist[$offer['project_id']])) { $offers_exist[$offer['project_id']] = array(); } $offers_exist[$offer['project_id']][$offer['user_id']] = true; } } $strtotime_3y_ago = strtotime('- 3 year'); $strtotime_1y_ago = strtotime('- 1 year'); $strtotime_1w_ago = strtotime('- 1 week'); $current_date = time(); $current_date_sufix = '_' . date('dmy', $current_date); //format:_270314 $statistics = array(); while ($users = freelancer::GetPrjRecps($error, ++$page, 200, $uids)) { $this->recipient = array(); foreach ($users as $user) { //Если ли у фрилансера уточнение по категориям $is_mailer_str = strlen($user['mailer_str']) > 0; $subj = array(); if ($is_mailer_str) { foreach ($groups as $group) { if (freelancer::isSubmited($user['mailer_str'], array(array('category_id' => $group['id'])))) { $subj[$group['id']] = $group['name']; } } } $message_pro = ''; $cnt_pro = 0; $message = ''; $cnt = 0; $cnt_submited = 0; $cnt_user_submited = 0; foreach ($projects as $prj) { //Подписан ли фрилансер на специализацию к которой относится проект if ($is_mailer_str && !freelancer::isSubmited($user['mailer_str'], $prj['specs'])) { continue; } //Считаем все проекты по выбранным специализациям ++$cnt_submited; //Условия не попадания в письмо if ($prj['is_blocked'] == 't' || $prj['closed'] == 't' || $prj['state'] == projects::STATE_MOVED_TO_VACANCY || $prj['kind'] == projects::KIND_PERSONAL) { continue; } //Если у фрилансера ответ на проект то не добавляем его в рассылку if (isset($offers_exist[$prj['id']][$user['uid']])) { continue; } if ($prj['pro_only'] == 't') { if ($cnt_pro < $show_pro_limit) { $message_pro .= $prj['html']; ++$cnt_pro; } } else { if ($cnt < $show_limit) { $message .= $prj['html']; ++$cnt; } } ++$cnt_user_submited; } $message = $message_pro . $message; if (empty($message)) { continue; } if ($cnt_user_submited <= $show_pro_limit + $show_limit) { $cnt_submited = $cnt_user_submited; } //Формирует UTM метки аналитики $reg_date = strtotime($user['reg_date']); $reg_year = date('Y', $reg_date); $utm_content = $reg_date >= $strtotime_1w_ago ? '_new' : $reg_year; //$utm_content = ($user['reg_days_ago'] > 7)?$user['reg_date_year']:'_new'; $utm_param = $this->_addUtmUrlParams('email', 'free' . $utm_content, 'day_projects' . $current_date_sufix); $message = str_replace('%UTM_PARAM%', $utm_param, $message); //Собираем шаблон $message = Template::render($_SERVER['DOCUMENT_ROOT'] . '/templates/mail/new_projects/project_list.tpl.php', array('projects' => $message, 'spec_list' => implode(' / ', $subj), 'setup_url' => $GLOBALS['host'] . "/users/{$user['login']}/setup/mailer/", 'other_count' => $cnt_submited - $cnt_pro - $cnt, 'more_url' => $GLOBALS['host'] . $utm_param, 'banner_file' => $banner_file, 'banner_link' => $banner_link)); if (!$user['unsubscribe_key']) { $user['unsubscribe_key'] = users::GetUnsubscribeKey($user['login']); } /* $date = strtotime($projects[0]['post_date']); $date = date( 'j', $date ) . ' ' . monthtostr(date('n', $date),true); */ $projects_count_txt = $cnt_submited . ' ' . plural_form($cnt_submited, array('новый', 'новых', 'новых')) . ' ' . plural_form($cnt_submited, array('проект', 'проекта', 'проектов')); //$title = "{$projects_count_txt} за {$date}"; $last_time = strtotime($user['last_time']); if ($last_time < $strtotime_3y_ago) { $utm_content = '_3y'; } elseif ($last_time >= $strtotime_3y_ago && $last_time <= $strtotime_1y_ago) { $utm_content = '_1-3y'; } elseif ($reg_date < $strtotime_1w_ago) { $utm_content = '_1y'; } /* * @todo: EXTRACT медленней if($user['last_years_ago'] > 0){ $utm_content = ($user['last_years_ago'] > 3)?'_3y':'_1-3y'; }else{ $utm_content = ($user['reg_days_ago'] > 7)?'_1y':'_new'; } */ //Накапливаем статистику $stat_idx = $reg_date >= $strtotime_1w_ago ? 'new' : $reg_year; ++$statistics[$stat_idx]; $this->recipient[] = array('email' => $user['uname'] . ' ' . $user['usurname'] . ' [' . $user['login'] . '] <' . $user['email'] . '>', 'extra' => array('USER_NAME' => $user['uname'], 'USER_SURNAME' => $user['usurname'], 'USER_LOGIN' => $user['login'], 'MESSAGE' => $message, 'UNSUBSCRIBE_URL' => "/unsubscribe/?type=new_projects&ukey={$user['unsubscribe_key']}" . $this->_addUtmUrlParams('email', 'free' . $utm_content, 'unsubscr_day_projects' . $current_date_sufix), 'TITLE' => $projects_count_txt, 'TRACK_URL' => $GLOBALS['host'] . StatisticHelper::track_url(0, $stat_idx, $current_date, $user['login'] . $user['uid']))); ++$count; } $this->bind($massId, true); } //Собранную статистику отправляем в GA $statistics['total'] = $count; $ga = StatisticFactory::getInstance('GA'); $ga->newsletterNewProjectsFrl($statistics, $current_date); return $count; }
/** * Блокирование/разблокирование предложения по проекту * * @param int $offer_id ID предложения * @param int $user_id UID пользователя * @param int $project_id ID проекта * @param string $reason причина * @param int $reason_id ID причины, если она выбрана из списка (таблица admin_reasons, где act_id = 27) * @param string $reason_name Краткое описание причины действия (из селекта) для лога админских действий * @return object xajaxResponse */ function BlockedProjectOffer($offer_id, $user_id, $project_id, $reason, $reason_id = null, $reason_name = '') { session_start(); $objResponse = new xajaxResponse(); if (hasPermissions('projects')) { require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/projects_offers.php'; $projects_offers = new projects_offers(); $offer_id = intval($offer_id); $offer = $projects_offers->GetPrjOfferById($offer_id); if ($offer && $offer['id'] == $offer_id) { require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/users.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/projects.php'; $objUser = new users(); $objUser->GetUserByUID($offer['user_id']); // лог админских действий $projects = new projects(); $project = $projects->GetPrjCust($project_id); $sObjName = $project['name']; $sObjLink = getFriendlyURL('project', $project_id); $reason_id = $reason_id ? $reason_id : 0; $reason = str_replace('%USERNAME%', $objUser->uname . ' ' . $objUser->usurname, $reason); $reason = change_q($reason, FALSE, 0, TRUE); if ($offer['is_blocked'] == 't') { $projects_offers->UnBlocked($offer_id); // пишем лог админских действий admin_log::addLog(admin_log::OBJ_CODE_PROJ, admin_log::ACT_ID_PRJ_UNBLOCK_OFFER, $user_id, $offer_id, $project['name'], $sObjLink, 0, '', $reason_id, $reason); $objResponse->assign("project-offer-block-{$offer_id}", 'innerHTML', ' '); $objResponse->assign("project-offer-block-{$offer_id}", 'style.display', 'none'); $objResponse->assign("project-button-{$offer_id}", 'innerHTML', '<a class="admn" href="javascript:void(0);" onclick="banned.blockedProjectOffer(' . $offer_id . ',' . $user_id . ',' . $project_id . ')">Заблокировать</a>'); } else { $sBlockId = $projects_offers->Blocked($offer_id, $user_id, $project_id, $reason, $reason_id, $_SESSION['uid']); // пишем лог админских действий admin_log::addLog(admin_log::OBJ_CODE_PROJ, admin_log::ACT_ID_PRJ_BLOCK_OFFER, $user_id, $offer_id, $project['name'], $sObjLink, 0, '', $reason_id, $reason, $sBlockId); $reason = reformat($reason, 24, 0, 0, 1, 24); $html = BlockedProjectOfferHTML($reason, $_SESSION['login'], "{$_SESSION['name']} {$_SESSION['surname']}"); $objResponse->assign("project-offer-block-{$offer_id}", 'innerHTML', $html); $objResponse->assign("project-offer-block-{$offer_id}", 'style.display', 'block'); $objResponse->assign("project-button-{$offer_id}", 'innerHTML', '<a class="admn" href="javascript:void(0);" onclick="banned.unblockedProjectOffer(' . $offer_id . ',' . $user_id . ',' . $project_id . ')">Разблокировать</a>'); $objResponse->script("\$('ban_btn').addClass('b-button_rectangle_color_green').removeClass('b-button_rectangle_color_disable');"); } } else { $objResponse->alert('Несуществующее предложение'); } } return $objResponse; }
/** * Возврат ответов в случае блокировки проекта. * * @param int $project_id - ID проекта * * @return mixed - сообщение об ошибке или 0 в случае успеха */ public function ReturnAnswers($project_id) { global $DB; $descr = 'Возврат ответа на проект в связи с блокировкой проекта'; $op_code = $this->return_op_code; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/projects_offers.php'; $of = new projects_offers(); $offers = $of->GetPrjOffers($count, $project_id, 'ALL', 0, 0, true); if (!$count) { return; } require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/account.php'; $account = new account(); foreach ($offers as $offer) { $uid = $offer['user_id']; if ($offer['type'] == 0) { continue; } $transaction_id = $account->start_transaction($uid); $error = $account->Buy($billing_id, $transaction_id, $op_code, $uid, $descr, $descr, 0, 0); if ($error) { return $error; } if ($offer['type'] == 2) { $DB->query('UPDATE projects_offers_answers SET pay_offers = pay_offers + 1 WHERE uid = ?', $uid); } else { $free_cnt = self::FREE_ANSWERS_CNT; $DB->query("UPDATE projects_offers_answers \n SET free_offers = free_offers + (CASE WHEN free_offers < {$free_cnt} THEN 1 ELSE 0 END) WHERE uid = ?", $uid); } $account->commit_transaction($transaction_id, $uid, $billing_id); } }
$hash = __paramInit('string', 'hash', 'hash', NULL); $current_hash = projects_helper::getStatusHash(array('project_id' => $project_id, 'status' => $status)); //Проверка корректности входных параметров по хешу if ($hash !== $current_hash) { header("Location: /404.php"); exit; } $obj_project = new projects(); $project = $obj_project->GetPrjCust($project_id); //Если нет такого проекта или юзер непричастен к нему то 404 if (!$project || $project['user_id'] != $uid && $project['exec_id'] != $uid) { header("Location: /404.php"); exit; } $is_emp = is_emp(); $attr = array('is_emp' => $is_emp, 'project' => $project); $offer = array(); if ($project['exec_id']) { $obj_offer = new projects_offers(); $offer = $obj_offer->GetPrjOffer($project['id'], $project['exec_id']); if (!$offer) { header("Location: /404.php"); exit; } $attr['offer'] = $offer; } $projectsStatus = new projects_status(); $projectsStatus->attributes($attr); $projectsStatus->changeStatus($status); header("Location: " . getFriendlyURL("project", $project)); exit;
<?php require_once $_SERVER['DOCUMENT_ROOT'] . "/xajax/projects.common.php"; $xajax->printJavascript('/xajax/'); $uid = get_uid(); // Предложения по проектам. $obj_offer = new projects_offers(); $po_waste = projects_offers::GetFrlOffersWaste($uid); $pocnt[0] = $po_summary['total'] - (int) $po_waste['total']; $pocnt[2] = $po_summary['selected'] - (int) $po_waste['selected']; $pocnt[3] = $po_summary['executor_2'] - (int) $po_waste['executor']; $pocnt[4] = $po_summary['refused'] - (int) $po_waste['refused']; $pocnt[5] = (int) $po_waste['total']; $pocnt[1] = $pocnt[0] - $pocnt[2] - $pocnt[3] - $pocnt[4] - $pocnt[6]; $page = __paramInit('int', 'page', 'page', 1); $pages = 1; $prj_count = 0; //Получаем количество заказов по ТУ require_once $_SERVER['DOCUMENT_ROOT'] . '/tu/models/TServiceOrderModel.php'; $tu_cnts = TServiceOrderModel::model()->getCounts($uid, FALSE); ?> <h1 class="b-page__title" id="prj_name_<?php echo $project['id']; ?> "><?php echo $sBox1; echo reformat($sTitle, 30, 0, 1); ?> </h1> <ul class="frl-prj-sort"> <?php
/** * возвращает подсказку для кнопки "Проекты" для фрилансера * в виде массива ((int)count, (string)tip) * null - в случае ошибки */ public static function getProjectsTipFrl() { $uid = get_uid(0); if (!$uid) { return null; } $newEventsCount = $newMessCount = 0; // количество новых событий $newEventsCount = projects_offers::GetNewFrlEventsCount($uid, false); // сколько новых сообщений $newMessCount = projects_offers_dialogue::CountMessagesForFrl($uid, true, false); if ($newEventsCount === null || $newMessCount === null) { return array('count' => 0, 'tip' => 'Список проектов', 'link' => '/proj/?p=list'); } $newAnsCount = $newEventsCount + $newMessCount; if ((int) $newMessCount === 0 && (int) $newEventsCount === 1) { $tip = 'Новое событие к вашему ответу в проекте'; } elseif ((int) $newMessCount === 1 && (int) $newEventsCount === 0) { $tip = "Новое сообщение к вашему ответу в проекте"; } elseif ($newMessCount + $newEventsCount > 0) { $tip = ""; $tip .= $newMessCount > 0 ? $newMessCount . ending($newMessCount, " новое сообщение", " новых сообщения", " новых сообщений") : ""; $tip .= $newMessCount > 0 && $newEventsCount > 0 ? " и " : ""; $tip .= $newEventsCount > 0 ? $newEventsCount . ending($newEventsCount, " новое событие", " новых события", " новых событий") : ""; $tip .= $newEventsCount > 0 ? " к вашим ответам в проектах" : " на ваши ответы в проектах"; } return array('count' => $newAnsCount, 'tip' => $tip, 'link' => '/proj/?p=list'); }
/** * Увеличивает количество автоответов для всех предложений проекта. * * @param type $project_id * * @return type */ public function increaseByProject($project_id) { $projects_offers = new projects_offers(); $offers = $projects_offers->getPrjOffersLite($project_id); if (!is_array($offers) || !count($offers)) { return; } foreach ($offers as $offer) { if ($offer['auto'] > 0) { $this->increase($offer['auto']); } } }
/** * Генерация rss для bicotender.ru * @param $date datetime в Y-m-d H:i:s */ public static function bicotenderGenerateRss($date) { if (!preg_match("#^[0-9]{4}\\-[0-9]{2}\\-[0-9]{2}\\s[0-9]{2}:[0-9]{2}:[0-9]{2}\$#", $date, $m)) { $date = date("Y-m-d 00:00:00"); } global $DB; $cache_expire = 900; $sql = "SELECT p.kind, p.name, p.descr, p.id, p.post_date, p.end_date, p.cost, p.currency, p.edit_date, p.exec_id,\n e.login, e.uname, e.usurname, e.compname, e.phone_1 AS phis_phone, e.second_email AS phis_email, e.site,\n fin.form_type, fin._1_inn, fin._2_inn, fin._2_address_fct, fin._1_address, fin._2_phone AS jur_phone, fin._2_email AS jur_email, fin._2_bossname AS boss, fin._2_full_name,\n country.country_name, city.city_name, groups.name AS category, professions.name AS prof\n FROM projects p\n INNER JOIN\n employer e\n ON e.uid = p.user_id\n AND e.is_banned = '0'\n LEFT JOIN projects_blocked pb ON pb.project_id = p.id\n LEFT JOIN sbr_reqv AS fin ON fin.user_id = e.uid\n LEFT JOIN country ON country.id = e.country \n LEFT JOIN city ON city.id = e.city\n LEFT JOIN project_to_spec AS pts ON pts.project_id = p.id\n LEFT JOIN prof_group AS groups ON pts.category_id = groups.id\n LEFT JOIN professions ON pts.subcategory_id = professions.id\n WHERE pb.project_id IS NULL\n /*AND (p.moderator_status > 0 OR e.is_pro = TRUE)*/\n AND p.post_date >= '{$date}'\n AND p.closed = false \n AND p.kind = 7\n ORDER BY p.kind, p.post_date DESC"; $nodes = array(); $project_exRates = project_exrates::GetAll(); $translate_exRates = array(0 => 2, 1 => 3, 2 => 4, 3 => 1); $rows = $DB->cache($cache_expire)->rows($sql); foreach ($rows as $row) { $rubprice = preg_replace('/.00$/', '', sprintf("%.2f", round($row['cost'] * $project_exRates[trim($translate_exRates[$row['currency']]) . '4'], 2))); $boss = $compname = $row['uname'] . " " . $row['usurname']; $inn = $row['_1_inn']; $address = $row['_1_address']; $phone = $row['phis_phone']; $email = $row['phis_email']; $url = $row['site']; $postPosition = ''; $editDate = $row["edit_date"]; if (!$editDate) { $editDate = $row["post_date"]; } if ($row['form_type'] == 2) { $compname = $row['_2_full_name'] ? $row['_2_full_name'] : $row['compname']; $inn = $row['_2_inn']; $address = $row['_2_address_fct']; $phone = $row['jur_phone']; $email = $row['jur_email']; $url = $row['site']; $boss = $row['boss']; $postPosition = 'Генеральный директор'; } $filesData = self::getAllAttach($row['id']); $files = ''; if (count($filesData)) { $files = array(); foreach ($filesData as $file) { $files[] = "<file ID=\"{$file['file_id']}\">\n\t <url>{$file_url}</url>\n\t <name>{$file['name']}</name>\n\t <type>Документация</type>\n\t <lastUpdate>{$row['modified']}</lastUpdate>\n\t </file>"; } $files = "<files>" . join("\n", $files) . "</files>"; } $offers = ''; if (count($filesData)) { $offersData = projects_offers::GetPrjOffers($c, $row['id'], 'ALL'); $offers = array(); foreach ($offersData as $offer) { $winner = "isWinner='1"; $status = "Исполнитель"; if ($row['exec_id'] != $offer['uid']) { $winner = ""; if ($offer['refused'] == 't') { $status = "Отказано"; } elseif ($offer['selected'] == 't') { $status = "Кандидат"; } } $cost = preg_replace('/.00$/', '', sprintf("%.2f", round($offer['cost_from'] * $project_exRates[trim($translate_exRates[$offer['cost_type']]) . '4'], 2))); $lancer = $offer['uname'] . " " . $offer['usurname']; $offers[] = "<competitor ID=\"1\" {$winner}>\n\t <name>{$lancer}</name>\n\t <cost>{$cost}</cost> \n\t <rating>{$offer['rating']}</rating>\n\t <status>{$status}</status>\n\t </competitor>"; } $offers = "<competitors>" . join("\n", $offers) . "</competitors>"; } $nodes[] = " <tender ID=\"{$row['id']}\" editDate = '{$editDate}'>\n <name>{$row['name']}</name>\n <type>Открытый конкурс</type>\n <dateStart>{$row['post_date']}</dateStart>\n <dateStop>{$row['end_date']}</dateStop>\n <text>{$row['descr']}</text>\n <cost>{$rubprice}</cost>\n <country>{$row['country_name']}</country>\n <address>Адрес проведения тендера</address>\n <field name='{$row['category']}'>\n <subfield>{$row['prof']}</subfield>\n </field>\n <company>\n <name>{$compname}</name>\n <inn>{$inn}</inn>\n <address>{$address}</address>\n <phone>{$phone}</phone>\n <email>{$email}</email>\n <url>{$url}</url>\n </company>\n\n <contact>\n <name>{$boss}</name>\n <position>{$postPosition}</position>\n </contact>\n {$files}\n {$offers}\n </tender>"; } $tenders = "<?xml version=\"1.0\" encoding=\"utf-8\"?> \n<tenders>" . join("\n", $nodes) . "</tenders>"; return iconv("WINDOWS-1251", "UTF-8//IGNORE", $tenders); }
function ReadOfferDialogue($po_id, $prj_id = 0, $fldr = '') { global $session; session_start(); $objResponse = new xajaxResponse(); $prj_offer = new projects_offers(); $po_id = intval($po_id); $prj_id = intval($prj_id); $user_id = get_uid(false); $pod = new projects_offers_dialogue(); if (hasPermissions('projects')) { $pod->markReadMod(array($po_id), $user_id); $objResponse->script('if($("new_msgs_' . $po_id . '").get("need_change")==1) { $("po_comments_' . $po_id . '").setStyle("background-color","#fff"); }'); } if (is_emp()) { $pod->markReadEmp(array($po_id), $user_id); $script = 'if($chk($("po_comments_' . $po_id . '"))) { ' . "if (\$('new_msgs_{$po_id}').get('need_change') == 1) {" . "\$('po_comments_{$po_id}').removeClass('po_comments_new_hide');" . "\$('po_comments_{$po_id}').addClass('po_comments'); } }"; $objResponse->script($script); switch ($fldr) { case 'o': list($po_offers_count, $msg_offers_count) = $prj_offer->CountPrjOffers($prj_id, 'offers'); if ($msg_offers_count > 0) { $objResponse->assign('op_count_offers_new_msgs', 'innerHTML', '<img src="/images/ico_envelop.gif" alt="" width="10" height="8" border="0"> ' . $msg_offers_count . ending($msg_offers_count, 'новое сообщение', 'новых сообщения', 'новых сообщений')); } else { // $objResponse->script($script); $objResponse->assign('op_count_offers_new_msgs', 'innerHTML', ''); } break; case 'i': list($po_executor_count, $msg_executor_count) = $prj_offer->CountPrjOffers($prj_id, 'executor'); if ($msg_executor_count > 0) { $objResponse->assign('op_count_executor_new_msgs', 'innerHTML', '<img src="/images/ico_envelop.gif" alt="" width="10" height="8" border="0"> ' . $msg_executor_count . ending($msg_executor_count, 'новое сообщение', 'новых сообщения', 'новых сообщений')); } else { // $objResponse->script($script); $objResponse->assign('op_count_executor_new_msgs', 'innerHTML', ''); } break; case 'c': list($po_candidate_count, $msg_candidate_count) = $prj_offer->CountPrjOffers($prj_id, 'candidate'); if ($msg_candidate_count > 0) { $objResponse->assign('op_count_candidate_new_msgs', 'innerHTML', '<img src="/images/ico_envelop.gif" alt="" width="10" height="8" border="0"> ' . $msg_candidate_count . ending($msg_candidate_count, 'новое сообщение', 'новых сообщения', 'новых сообщений')); } else { // $objResponse->script($script); $objResponse->assign('op_count_candidate_new_msgs', 'innerHTML', ''); } break; case 'r': list($po_refuse_count, $msg_refuse_count) = $prj_offer->CountPrjOffers($prj_id, 'refuse'); if ($msg_refuse_count > 0) { $objResponse->assign('op_count_refuse_new_msgs', 'innerHTML', '<img src="/images/ico_envelop.gif" alt="" width="10" height="8" border="0"> ' . $msg_refuse_count . ending($msg_refuse_count, 'новое сообщение', 'новых сообщения', 'новых сообщений')); } else { // $objResponse->script($script); $objResponse->assign('op_count_refuse_new_msgs', 'innerHTML', ''); } break; case 'fr': list($po_refuse_count, $msg_refuse_count) = $prj_offer->CountPrjOffers($prj_id, 'frl_refuse'); if ($msg_refuse_count > 0) { $objResponse->assign('op_count_frl_refuse_new_msgs', 'innerHTML', '<img src="/images/ico_envelop.gif" alt="" width="10" height="8" border="0"> ' . $msg_refuse_count . ending($msg_refuse_count, 'новое сообщение', 'новых сообщения', 'новых сообщений')); } else { $objResponse->assign('op_count_frl_refuse_new_msgs', 'innerHTML', ''); } break; } // Обновляем количество новых сообщений в заголовке. $cnt_emp_new_messages = projects_offers_dialogue::CountMessagesForEmp($_SESSION['uid'], true); if ($cnt_emp_new_messages > 0) { $last_emp_new_messages_pid = projects_offers_dialogue::FindLastMessageProjectForEmp($_SESSION['uid']); } else { $last_emp_new_messages_pid = false; } $ndm_html = ''; $sScript = "\$\$('.b-userbar__prjic').addClass('b-userbar__prjic_hide');\$\$('.b-userbar__icprj').removeClass('b-userbar__icprj_hide');"; if ($last_emp_new_messages_pid) { $ndm_html = '(<a class="b-userbar__toplink" href="/projects/?pid=' . $last_emp_new_messages_pid . '" title="Есть новые сообщения">' . $cnt_emp_new_messages . '</a>)'; $sScript = "\$\$('.b-userbar__prjic').removeClass('b-userbar__prjic_hide');\$\$('.b-userbar__icprj').addClass('b-userbar__icprj_hide');"; } $objResponse->assign('new_dialogue_messages', 'innerHTML', $ndm_html); $objResponse->script($sScript); } else { $pod->markReadFrl($po_id, $user_id); // обновляем мигающий значек проекта if (!projects_offers::CheckNewFrlEvents($user_id, false) && !projects_offers_dialogue::CountMessagesForFrl($user_id, true, false)) { $objResponse->script("\$('new_offers_messages').getElement('img').addClass('b-userbar__prjic_hide'); \n \$('new_offers_messages').getElement('i').removeClass('b-userbar__icprj_hide'); "); } if (hasPermissions('projects')) { $script = '$("po_comments_' . $po_id . '").setStyle("background-color","#fff"); if($chk($("po_comments_' . $po_id . '"))) { ' . "if (\$('new_msgs_{$po_id}').get('need_change') == 1) {" . "\$('new_msgs_{$po_id}').set('need_change', 0); dialogue_toggle({$po_id}); } }"; $objResponse->script($script); } } if (defined('NEO')) { $objResponse->script('Page.checkNotifications(true)'); } else { $objResponse->script('Notification()'); } return $objResponse; }
/** * Отправляет фрилансеру сообщение о том, что его выбрали кандидатом * * @param string|array $ids * @param resource $connect * @return integer количество отправленных уведомлений. */ function ProjectsOfferSelected($ids, $connect = NULL) { require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/projects_offers.php'; $offers = new projects_offers(); if (!($data = $offers->getSelectedProjectOffers($ids, $connect))) { return NULL; } foreach ($data as $offer) { //if (substr($offer['subscr'], 4, 1) != '1' || $offer['is_banned'] == '1') continue; // если не нужны уведомления пропускаем отсылку $uname = $offer['uname']; $usurname = $offer['usurname']; $login = $offer['login']; $email = $offer['email']; $project_name = $offer['project_name']; $project_id = $offer['project_id']; $this->subject = "Вас выбрали кандидатом в проекте «" . html_entity_decode($project_name) . "»"; $project_name = htmlspecialchars($project_name, ENT_QUOTES, 'CP1251', false); $body = "Вас выбрали кандидатом в проекте «<a href=\"" . $GLOBALS['host'] . getFriendlyURL("project", $project_id) . $this->_addUrlParams('f') . "\">" . $project_name . "</a>»."; $body .= "<br/><br/>Желаем вам удачи!<br/>"; $this->recipient = "{$uname} {$usurname} [{$login}] <" . $email . ">"; $this->message = $this->GetHtml($uname, $body, array('header' => 'simple', 'footer' => 'frl_simple_projects'), array('login' => $offer['login'])); $this->SmtpMail('text/html'); } return $this->sended; }
$name = trim($_GET['user']); $user_obj = new users(); $user_obj->GetUser($name); $uid = $user_obj->GetUid($error, $name); $proj = array(); $proj = (array) $user_obj; // Проект. $obj_project = new projects(); $project = $obj_project->GetPrjCust($pid); if (!$project || !$user_obj->uid) { $fpath = '../'; include '../404.php'; exit; } else { // Предложения по данному проекту. $obj_offer = new projects_offers(); $offer = $obj_offer->GetPrjOffer($pid, $user_obj->uid); $width = $height = 0; if (!$offer) { $fpath = '../'; include '../404.php'; exit; } else { if ($project['kind'] == 2) { $pict_name = ''; foreach ($offer['attach'] as $key => $value) { if ($value['id'] == $wid) { $pict_name = $value['pict']; } } if ($pict_name == '') {
Максим Россошанский<br /> Руководитель проекта <a href='http://www.dizkon.ru/?utm_source=flnwsldiz&utm_medium=email&utm_campaign=dizkonvsjob' >DizKon.ru</a><br /> <a href='mailto:maxim@dizkon.ru'>maxim@dizkon.ru</a><br /> "; // текст письма */ $mail->recipient = "{$employer->login} <" . $employer->email . ">"; // получатель $mail->send('text/html'); // отправляем письмо как plain/text } } if (!$is_edit && $is_personal) { //Добавляем ответ фрилансера //$message = 'Я получил' . ($sex == 'f' ? 'а' : '') . ' ваше предложение о проекте, в скором времени отвечу на него.'; $message = ''; $obj_offer = new projects_offers(); $obj_offer->AddOffer($freelancer->uid, $proj['id'], '', '', 2, '', '', 0, $message, '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', false, 0, 1); $tmpPrj->SetExecutor($proj['id'], $freelancer->uid, $employer->uid); //Отправляем СМС Фрилансеру require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/projects_sms.php"; ProjectsSms::model($freelancer->uid)->sendStatus(0, $proj['id'], 9); } if (hasPermissions("projects")) { $inspect_user_session = new session(); $inspect_user_session->UpdateProEndingDate($view_user_login); } if (!$is_edit) { $_SESSION['new_public'] = 1; } $drafts->DeleteDraft($draft_id, $uid, 1); if ($is_edit) {
/** * Переход проекта в другой возможный стастус * * @param string $new_status * @return boolean */ public function changeStatus($new_status) { $list = $this->is_emp ? $this->STATUS_EMP_LIST : $this->STATUS_FRL_LIST; $next = $this->STATUS_NEXT; //Существует ли новый статус if (!isset($list[$new_status])) { return FALSE; } $status = $list[$new_status]; //Есть ли принадлежность для него? if (!isset($this->current_table[$status])) { return FALSE; } $prop = $this->current_table[$status][1]; $current_status = @$this->{$prop}['status']; //Есть ли текущий статус и возможен ли переход в новый if (!isset($next[$current_status]) || !in_array($list[$new_status], $next[$current_status])) { return FALSE; } $data = array('status' => $status); $time = time(); //Действия перед сменой статуса switch ($status) { case self::STATUS_DECLINE: case self::STATUS_CANCEL: //Нельзя отказаться если уже согласился if ($this->project['status'] == self::STATUS_ACCEPT) { return FALSE; } //Убираем из исполнителей $obj_project = new projects(); $err = $obj_project->ClearExecutor($this->project['id'], $this->project['user_id']); if (!empty($err)) { return FALSE; } $obj_offer = new projects_offers(); if ($this->project['kind'] == 9) { //У персонального проекта переводим в отказ if ($status == self::STATUS_CANCEL) { $obj_offer->SetRefused($this->offer['id'], $this->project['id'], $this->project['exec_id']); } else { $this->db()->update(self::TABLE_OFFERS, array('status' => -1), 'id = ?i', $this->offer['id']); } } else { //Переводим в кандидаты $obj_offer->SetSelected($this->offer['id'], $this->project['id'], $this->project['exec_id'], true); } $this->project['exec_id'] = NULL; //Если это персональный проект //то закрываем его после отказа if ($this->project['kind'] == 9) { $this->project['close_date'] = date('Y-m-d H:i:s', $time); $this->project['closed'] = TRUE; $this->db()->update(self::TABLE_PROJECTS, array('close_date' => $this->project['close_date'], 'closed' => $this->project['closed']), 'id = ?i', $this->project['id']); } break; case self::STATUS_ACCEPT: $now = date("Y-m-d H:i:s"); $this->db()->update(self::TABLE_OFFERS, array('status' => 0), 'id = ?i', $this->offer['id']); $this->db()->update(self::TABLE_PROJECTS, array('accept_date' => $now), 'id = ?i', $this->project['id']); $this->offer['status'] = 0; //@todo: как снять проект с публикации??? //будем учитывать этатус = 0 в выборках break; case self::STATUS_EMPCLOSE: case self::STATUS_FRLCLOSE: $data['close_date'] = date('Y-m-d H:i:s', $time); $data['closed'] = TRUE; $this->project['close_date'] = $data['close_date']; $this->project['closed'] = $data['closed']; break; } $table = $this->current_table[$status][0]; $id = @$this->{$prop}['id']; $is_ok = $this->db()->update($table, $data, 'id = ?i', $id); if ($is_ok) { $this->{$prop}['status'] = $status; //Высылаем уведомления о смене статуса $mes = new projects_smail(); //Действия после успешной смены статуса switch ($status) { case self::STATUS_ACCEPT: $mes->onStartWorking($this->project, $this->offer); break; case self::STATUS_CANCEL: $mes->onRefuseFrl($this->project, $this->offer); break; case self::STATUS_DECLINE: $mes->onRefuseEmp($this->project, $this->offer); break; case self::STATUS_EMPCLOSE: case self::STATUS_FRLCLOSE: //Нет смысла тут пытаться уведомлять не имея еще отзыва! //$mes->onFinish($this->project, $this->is_emp); break; } } return $is_ok; }
/** * Смена статуса проекта. * * @param array $params * * @return \xajaxResponse */ function changeProjectStatus($params) { $objResponse =& new xajaxResponse(); $uid = get_uid(false); $project_id = intval(@$params['project_id']); $status = @$params['status']; $feedback = @$params['feedback']; $rating = @$params['rating']; $hash = @$params['hash']; unset($params['hash'], $params['u_token_key'], $params['feedback'], $params['rating']); $current_hash = projects_helper::getStatusHash($params); if (!($uid > 0) || $hash !== $current_hash) { return $objResponse; } // Проект. $obj_project = new projects(); //$project = $obj_project->GetPrjCust($project_id); //Сделал отдельный метод получающий только то что нам нужно //лучше так делать а то далеко не всегда существующие методы оптимальны //в них выбирается много лишнего $project = $obj_project->getProjectWithFeedback($project_id); if (!$project || !in_array($project['kind'], array(1, 5, 9))) { return $objResponse; } $is_project_owner = $project['user_id'] == $uid; $is_exec = $project['exec_id'] == $uid; if (!($is_project_owner || $is_exec)) { return $objResponse; } //Сохраним текущий статус $old_status = $project['status']; $is_emp = is_emp(); $attr = array('is_emp' => $is_emp, 'project' => $project); $offer = array(); if ($project['exec_id']) { $obj_offer = new projects_offers(); $offer = $obj_offer->GetPrjOffer($project['id'], $project['exec_id']); if (!$offer) { return $objResponse; } $attr['offer'] = $offer; } $projectsStatus = new projects_status(); $projectsStatus->attributes($attr); $projectsStatus->changeStatus($status); $project = $projectsStatus->getProject(); $offer = $projectsStatus->getOffer(); if ($project['status'] > projects_status::STATUS_ACCEPT && !empty($feedback)) { //Время вышло if (!projects_feedback::isAllowFeedback($project['close_date'])) { return $objResponse; } //Если отзыв от работодателя и положительный то в зависимости от статуса ПРО фрилансера отзыв скрывается либо публикуется //Если отзыв от фрилансера то всегда публикуется $is_show = $is_emp && $rating > 0 ? $offer['is_pro'] == 't' : true; $obj_feedback = new projects_feedback(); $is_valid = $obj_feedback->attributes(array('feedback' => $feedback, 'rating' => $rating, 'is_emp' => $is_emp, 'user_id' => $uid, 'show' => $is_show, 'touser_id' => $is_emp ? $project['exec_id'] : $project['user_id'])); if (!$is_valid || !$obj_feedback->addFeedback($project_id)) { return $objResponse; } $prefix = $is_emp ? 'emp' : 'frl'; $attributes = $obj_feedback->attributes(); $project[$prefix . '_feedback'] = $attributes['feedback']; $project[$prefix . '_rating'] = $attributes['rating']; } if ($project['status'] > projects_status::STATUS_ACCEPT) { // Отправляем письма об отзывах $mes = new projects_smail(); if ($old_status != $project['status']) { //была смена статуса на закрытие $mes->onFinish($project, $is_emp); } else { $mes->onFeedback($project, $is_emp); } } if ($project['status'] == projects_status::STATUS_EMPCLOSE) { //$objResponse->remove('project_public_agane')->remove('project_edit'); $objResponse->script("\$\$('.__project_close_hide').destroy();"); } $sHtml = projects_helper::renderStatus($project, $offer); $objResponse->assign('project_status_' . $project_id, 'innerHTML', $sHtml); if ($project['kind'] == 9 && $offer['status'] == projects_status::STATUS_DECLINE) { $objResponse->script('window.location.reload()'); } return $objResponse; }
/** * Проверка показывать ли индикацию Проектов в шапке */ function getProjectIndication() { define('LAST_REFRESH_DISABLE', 1); session_start(); $aRes = array(); $nCountM = $nCountE = 0; if (isset($_SESSION['uid'])) { require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/projects_offers.php"; require_once $_SERVER['DOCUMENT_ROOT'] . "/classes/projects_offers_dialogue.php"; if (is_emp()) { $nCountE = projects_offers::CheckNewEmpEvents($_SESSION['uid']); $nCountM = projects_offers_dialogue::CountMessagesForEmp($_SESSION['uid'], true, false); if ($nCountM != $_SESSION['lst_emp_new_messages']['cnt']) { $last_emp_new_messages_pid = projects_offers_dialogue::FindLastMessageProjectForEmp($_SESSION['uid']); } else { $last_emp_new_messages_pid = $_SESSION['lst_emp_new_messages']['pid']; } $_SESSION['lst_emp_new_messages']['cnt'] = $nCountM; } else { if (!($nCountE = projects_offers::CheckNewFrlEvents($_SESSION['uid'], false))) { $nCountM = projects_offers_dialogue::CountMessagesForFrl($_SESSION['uid'], true, false); } } if ($nCountM === NULL || $nCountE === NULL) { $aRes['success'] = false; } else { $aRes['success'] = true; $aRes['count'] = $nCountM + $nCountE; if ($nCountM > 0 && is_emp()) { $aRes['count_msg'] = $nCountM; $aRes['last_emp_new_message'] = $last_emp_new_messages_pid; } $aRes['time'] = PRJ_CHECK_DELAY; } } else { $aRes['success'] = false; } echo json_encode($aRes); }
/** * Получение одного проекта * * @param array $aParams массив входящих данных * @return array $aResult ответ */ protected function x____projects_get($aParams = array()) { $this->_validDevice($aParams); $sId = __paramValue('int', $aParams['id'], null, true); if (!empty($sId)) { require_once ABS_PATH . '/classes/projects.php'; $oPrj = new new_projects(); $aProject = $oPrj->GetPrjCust($sId); $aAttaches = $oPrj->getAllAttach($sId); if (!empty($aProject)) { if ($aProject['is_banned'] || $aProject['is_blocked']) { // работодатель или проест заблокированы $this->error(EXTERNAL_ERR_PROJECT_NOT_FOUND); } $aResult = array('item' => $this->_getProjectData($aProject)); $nUid = get_uid(false); $aSpecs = new_projects::getSpecs($sId); if (is_array($aSpecs) && $aSpecs) { $aResult['item']['category_id'] = $aSpecs[0]['category_id']; $aResult['item']['subcategory_id'] = $aSpecs[0]['subcategory_id']; } $aResult['item']['attaches'] = array(); if ($aAttaches) { foreach ($aAttaches as $attach) { $aResult['item']['attaches'][] = array("url" => WDCPREFIX . '/' . $attach['path'], "file" => $attach['name']); } } $aResult['item']['responses'] = array(); if ($aProject['kind'] == 7) { // конкурс require_once ABS_PATH . '/classes/contest.php'; $oContest = new contest($sId, $nUid, is_emp(), $aProject['user_id'] == $nUid, false, is_pro()); $oContest->GetOffers(); if (is_array($oContest->offers) && $oContest->offers) { foreach ($oContest->offers as $aOne) { $aResult['item']['responses'][] = $this->_getContestOfferData($aOne); } } } else { // проект require_once ABS_PATH . '/classes/projects_offers.php'; require_once ABS_PATH . '/classes/projects_offers_dialogue.php'; $oPrjOffers = new projects_offers(); $obj_dialogue = new projects_offers_dialogue(); $nOffersCnt = 0; if (is_emp()) { // залогинен работодатель $aOffers = $oPrjOffers->GetPrjOffers($nOffersCnt, $sId, 'ALL', 0, $nUid, $aProject['user_id'] == $nUid, 'date', $aProject['user_id'] == $nUid ? 'a' : 'nor'); } else { $aOffers = $oPrjOffers->GetPrjOffers($nOffersCnt, $sId, 'ALL', 0, $nUid, false, null, 'nor'); } // Диалоги по предложениям к данному проекту и все остальное if (is_array($aOffers) && $aOffers) { foreach ($aOffers as $key => $value) { $aOffers[$key]['exec_id'] = $aProject['exec_id']; $aOffers[$key]['emp_uid'] = $aProject['user_id']; $aOffers[$key]['dialogue'] = $obj_dialogue->GetDialogueForOffer($value['id']); $aResult['item']['responses'][] = $this->_getProjectOfferData($aOffers[$key]); } } $aResult['item']['responses_count'] = $nOffersCnt; $aResult['item']['is_responses_exists'] = $oPrjOffers->OfferExist($sId, $nUid) ? 1 : 2; // Наличие предложения данного юзера по данному проекту if ($aResult['item']['is_responses_exists'] == 1) { // Предложение данного пользователя по данному проекту $user_offer = $oPrjOffers->GetPrjOffer($sId, $nUid); $user_offer['exec_id'] = $aProject['exec_id']; $user_offer['emp_uid'] = $aProject['user_id']; // Диалог по предложению данного пользователя $user_offer['dialogue'] = $obj_dialogue->GetDialogueForOffer($user_offer['id']); $aResult['item']['responses'][] = $this->_getProjectOfferData($user_offer); } } } else { $this->error(EXTERNAL_ERR_PROJECT_NOT_FOUND); } } else { $this->error(EXTERNAL_ERR_EMPTY_PROJECT_ID); } return $aResult; }