コード例 #1
0
/**
 * Установка исполнителя проекта.
 *
 * @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;
}
コード例 #2
0
 /**
  * Переход проекта в другой возможный стастус
  * 
  * @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;
 }
コード例 #3
0
/**
 * Смена статуса проекта.
 * 
 * @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;
}