Example #1
0
 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;
 }
Example #2
0
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;
}
Example #3
0
 /**
  * Аутентификация пользователя и заполнение его сессии необходимыми данными.
  *
  * @param string $login логин пользователя
  * @param string $pwd   пароль пользователя
  * @param array &params             данные пользователя
  * @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;
 }
Example #4
0
 /**
  * Предложения в проектах. Утверждение/удаление записи
  * 
  * @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;
 }
Example #5
0
     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 . ');');
}
Example #7
0
$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}
Example #8
0
 /**
  * Переносим ответы на проекты в работающие таблицы
  * 
  * @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;
 }
Example #9
0
 /**
  * @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;
 }
Example #10
0
/**
 * Блокирование/разблокирование предложения по проекту
 * 
 * @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', '&nbsp;');
                $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);
     }
 }
Example #12
0
$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;
Example #13
0
<?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 
Example #14
0
 /**
  * возвращает подсказку для кнопки "Проекты" для фрилансера
  * в виде массива ((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');
 }
Example #15
0
 /**
  * Увеличивает количество автоответов для всех предложений проекта.
  *
  * @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']);
         }
     }
 }
Example #16
0
 /**
  * Генерация 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);
 }
Example #17
0
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;
}
Example #18
0
 /**
  * Отправляет фрилансеру сообщение о том, что его выбрали кандидатом
  *
  * @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;
 }
Example #19
0
$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 == '') {
Example #20
0
         Максим Россошанский<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) {
Example #21
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;
 }
/**
 * Смена статуса проекта.
 * 
 * @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;
}
Example #23
0
/**
 * Проверка показывать ли индикацию Проектов в шапке
 */
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);
}
Example #24
0
 /**
  * Получение одного проекта
  * 
  * @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;
 }