$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 == '') { $fpath = '../';
/** * Установка исполнителя проекта. * * @param integer $po_id id предложения к проекту * @param unknown_type $prj_id id проекта * @param unknown_type $user_id id юзера-исполнителя * * @return xajax response */ function SelectProjectExecutor($po_id, $prj_id, $user_id, $type, $exec_po_id = 0) { session_start(); $user = new users(); $prj = new projects(); $prj_offer = new projects_offers(); $po_id = intval($po_id); $prj_id = intval($prj_id); $exec_po_id = intval($exec_po_id); $user_id = intval($user_id); $user_name = $user->GetName($user_id, $error); $emp_id = get_uid(false); $emp_name = $user->GetName($emp_id, $error); $objResponse = new xajaxResponse(); $pod = new projects_offers_dialogue(); $pod->markReadEmp(array($po_id), $emp_id); //Не позволяем производить действия с заблокированным проектом if (projects::CheckBlocked(intval($prj_id))) { $objResponse->script("document.location.href='/projects/index.php?pid=" . intval($prj_id) . "'"); return $objResponse; } $project = $prj->GetPrj($emp_id, $prj_id, 1); if (tservices_helper::isAllowOrderReserve()) { //@todo: отправляем на форму нового заказа на базе проекта для текущего предложения фрилансера $objResponse->script("document.location.href='/new-project-order/{$po_id}/'"); return $objResponse; } if ($error = $prj->SetExecutor($prj_id, $user_id, $emp_id)) { $objResponse->alert($error); return $objResponse; } $project['exec_id'] = $user_id; //Отправляем уведомления участникам сделки $smail = new projects_smail(); $smail->onSetExecutorFrl($project); $smail->onSetExecutorEmp($project); //Отправляем СМС уведомление ProjectsSms::model($project['exec_id'])->sendStatus($project['status'], $project['id'], $project['kind']); require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/external/base.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/external/api/api.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/external/api/mobile.php'; externalApi_Mobile::addPushMsg($user_id, 'prj_select_performer', array('from_user_id' => $project['user_id'], 'name' => $project['name'], 'project_id' => $project['id'])); // Если находимся в "Не определен", тогда предыдущий исполнитель (если он был) сам попадает в "Не определен". // Перезагружаем в этом случае страницу. if ($type == 'o' && $project['exec_id']) { $objResponse->script("document.location.href=document.location.href.replace(/(&v=\\d*)?#offers\$/,'&v=" . mt_rand(1, 99999) . "#offers')"); return $objResponse; } list($po_offers_count, $msg_offers_count) = $prj_offer->CountPrjOffers($prj_id, 'offers'); $objResponse->assign('po_offers_count', 'innerHTML', $po_offers_count); 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->assign('op_count_offers_new_msgs', 'innerHTML', ''); if ($type == 'o') { $objResponse->remove('sort_box'); } } list($po_executor_count, $msg_executor_count) = $prj_offer->CountPrjOffers($prj_id, 'executor'); $objResponse->assign('po_executor_count', 'innerHTML', $po_executor_count); 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->assign('op_count_executor_new_msgs', 'innerHTML', ''); if ($type == 'i') { $objResponse->remove('sort_box'); } } list($po_candidate_count, $msg_candidate_count) = $prj_offer->CountPrjOffers($prj_id, 'candidate'); $objResponse->assign('po_candidate_count', 'innerHTML', $po_candidate_count); 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->assign('op_count_candidate_new_msgs', 'innerHTML', ''); if ($type == 'c') { $objResponse->remove('sort_box'); } } list($po_refuse_count, $msg_refuse_count) = $prj_offer->CountPrjOffers($prj_id, 'refuse'); $objResponse->assign('po_refuse_count', 'innerHTML', $po_refuse_count); 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->assign('op_count_refuse_new_msgs', 'innerHTML', ''); if ($type == 'r') { $objResponse->remove('sort_box'); } } if ($exec_po_id > 0) { //$objResponse->assign("po_b_exec_" . $exec_po_id, "innerHTML", '<a id="po_img_exec_' . $exec_po_id . '" class="b-button-multi__link" onclick="xajax_SelectProjectExecutor(' . $exec_po_id . ', ' . $prj_id . ', ' . $user_id . ', ' . "'" . $type . "'" . ', ' . $po_id . ');" href="javascript:void(0)" title="Буду работать с этим человеком."><span class="b-button-multi__inner"><span class="b-button-multi__icon b-button-multi__icon_green"></span><span class="b-button-multi__txt">Исполнитель</span></span></a>'); } //$objResponse->assign("po_b_exec_" . $po_id, "innerHTML", '<a id="po_img_exec_' . $po_id . '" class="b-button-multi__link" href="javascript:void(0)" title="Буду работать с этим человеком."><span class="b-button-multi__inner"><span class="b-button-multi__icon b-button-multi__icon_green"></span><span class="b-button-multi__txt">Исполнитель</span></span></a>'); //$objResponse->assign("po_b_select_" . $po_id, "innerHTML", '<a id="po_img_select_' . $po_id . '" class="b-button-multi__link" onclick="xajax_SelectProjectOffer(' . $po_id . ', ' . $prj_id . ', ' . $user_id . ', ' . "'" . $type . "'" . ');" href="javascript:void(0)" title="Прошел предварительный отбор. Может быть исполнителем"><span class="b-button-multi__inner"><span class="b-button-multi__icon b-button-multi__icon_blue"></span><span class="b-button-multi__txt">Кандидат</span></span></a>'); // $objResponse->assign("po_b_refuse_" . $po_id, "innerHTML", '<a id="po_img_refuse_' . $po_id . '" class="b-button-multi__link" onclick="show_fpopup(' . "'po_b_refuse_" . $po_id . "', 'po_m_refuse_" . $po_id . "'" . ');" href="javascript:void(0)" title="Этот человек мне не подходит. Может быть в следующий раз."><span class="b-button-multi__inner"><span class="b-button-multi__icon b-button-multi__icon_red"></span><span class="b-button-multi__txt">Отказать</span></span></a>'); $objResponse->script("removeNoteBar('{$user_name['login']}');"); $objResponse->remove('po_' . $po_id); $objResponse->remove('po_u_' . $po_id); $objResponse->remove('po_bar_' . $po_id); $offer = $prj_offer->GetPrjOffer($project['id'], $project['exec_id']); $sHtml = projects_helper::renderStatus($project, $offer); $objResponse->assign('project_status_' . $prj_id, 'innerHTML', $sHtml); --$_SESSION['offers_on_page']; if ($_SESSION['offers_on_page'] == 0) { $objResponse->script("document.location.href='/projects/index.php?pid=" . intval($prj_id) . '&type=' . $type . "'"); } return $objResponse; }
/** * Смена статуса проекта. * * @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; }
$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;
$prj_id = intvalPgSql((int) trim(str_replace('O', '0', $_GET['pid']))); $po_id = intval($_GET['id']); // Проект. $action = trim($_REQUEST['action']); $obj_project = new projects(); $project = $obj_project->GetPrjCust($prj_id); $pod = new projects_offers_dialogue(); if (is_emp()) { if ($project['user_id'] != get_uid(false)) { $content = '404.php'; include '../template2.php'; exit; } } else { $po = new projects_offers(); if (!$project || !$po->GetPrjOffer($prj_id, $user_id) || $cid && $pod->GetLastDialogueMessage($user_id, $po_id) != $cid) { $content = '404.php'; include '../template2.php'; exit; } } if ($cid) { $is_edit = true; $pod = new projects_offers_dialogue(); $project_dialogue = $pod->GetDialogueForOffer($po_id); $edit_dialog = $project_dialogue[count($project_dialogue) - 1]; } if ($action == 'create') { if (!trim($_POST['po_text'])) { $error = 'Невозможно отправить пустое сообщение.'; }
/** * Получение одного проекта * * @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; }