/all/?mode=2'><b>Все (<?php echo $realCnt; ?> )</b></a> </td> </tr> <?php } ?> </table> <?php } ?> <?php $recs = $recoms->teamsFavorites($user->login, $error, true); //$notes = notes::GetNotes($_SESSION['uid'], "", $error); //var_dump($notes); if ($user->blocks[5] && $recs) { ?> <table width="100%" cellspacing="0" cellpadding="0" class="b-information-clause-title" > <tr> <td style="width:19px; height:20px" class="brdtop"> </td> <td class="brdtop">Избранные</td> <td style="width:19px; height:20px" class="brdtop"> </td> </tr> </table> <table width="100%" cellspacing="0" cellpadding="19" class="b-information-clause-content"> <tr> <td style="padding:19px"> <div class=" izbr">
/** * Возвращает список избранных фрилансеров. * * @param integer $prof_id id профессии (не используется, видимо оставлено для совместимости) * @param integer $uid id пользователя * @param boolean $filter_apply использовать фильтр? (временно не используется) * @param array $filter массив с данными для фильтра (временно не используется) * @return array массив избранных фрилансеров (id фрилансера) */ function GetFavorites($prof_id, $uid, $filter_apply = false, $filter = null) { require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/teams.php'; $teams = new teams(); $ret = $teams->teamsFavorites($uid, $error); /* if ($prof_id > 0) { require_once($_SERVER['DOCUMENT_ROOT'] . "/classes/professions.php"); $mirrored = professions::GetMirroredProfs($prof_id); $profs = "'" . implode("', '", $mirrored) . "'"; $sql = "SELECT ff.target_id FROM teams AS ff INNER JOIN portf_choise as pc ON (ff.target_id = pc.user_id) WHERE pc.prof_id IN ($profs) AND ff.user_id='$uid'"; } else { $sql = "SELECT ff.target_id FROM teams AS ff WHERE ff.user_id='$uid'"; } */ $out = array(); if ($ret) { foreach ($ret as $ikey => $value) { $out[] = $value['uid']; } } return $out; }
/** * Получение списка избранных пользователей * * @param array $aParams массив входящих данных * @return array $aResult ответ */ protected function x____users_favorites_list($aParams = array()) { $this->_validDevice($aParams); $aResult = array('favorites_list' => array()); require_once ABS_PATH . '/classes/teams.php'; $aUsers = teams::teamsFavorites($_SESSION['uid'], $error); if (is_array($aUsers) && $aUsers) { $aUids = array(); $aLogins = array(); $nCnt = 0; foreach ($aUsers as $aOne) { $aResult['favorites_list'][$nCnt] = $this->_getUserData($aOne); if (!is_emp($aOne['role'])) { $aUids[$aOne['uid']] =& $aResult['favorites_list'][$nCnt]; $aLogins[] = $aOne['login']; } $nCnt++; } if (is_array($aLogins) && $aLogins) { require_once ABS_PATH . '/classes/freelancer.php'; $aFree = freelancer::getFreelancerByLogin($aLogins); if (is_array($aFree) && $aFree) { foreach ($aFree as $aOne) { $aUids[$aOne['uid']]['spec'] = $aOne['spec']; } } } } return $aResult; }
/** * Получение списка предложений по конкретному проекту. * * @param integer $count возвращает количество предложений * @param integer $prj_id id проекта * @param string $show_all признак отображения всех (true) или только открытых (false) предложений проекта * @param string $sort сортировка списка предложений * @param string $type выбор предложений одного типа ('o' - все, 'c' - выбранных в кандидаты, 'r' - отказанных, 'nor' - все кроме отказавшихся, 'i' - исполнитель) * * @return array список предложений */ public function GetPrjOffers(&$count, $prj_id, $limit, $offset = 0, $user_id = 0, $show_all = false, $sort = 'date', $type = 'a') { global $DB; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/teams.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/notes.php'; $user_id = intval($user_id); $limit = $limit == 'ALL' ? $limit : intval($limit); $offset = intval($offset); $limit_str = " LIMIT {$limit} OFFSET {$offset}"; $bPermissions = hasPermissions('projects'); // исключаем заблокированные предложения $sel_blocked = ', pb.reason as blocked_reason, pb.blocked_time, COALESCE(pb.src_id::boolean, false) as is_blocked'; $join_blocked = 'LEFT JOIN projects_offers_blocked pb ON po.id = pb.src_id '; if ($bPermissions) { $sel_blocked .= ', admins.login as admin_login, admins.uname as admin_uname, admins.usurname as admin_usurname'; $join_blocked .= 'LEFT JOIN users as admins ON pb.admin = admins.uid '; $where_blocked = ''; $and_blocked = ''; } else { $where_blocked = " (po.user_id = {$user_id} OR pb.src_id IS NULL) "; $and_blocked = ' AND ' . $where_blocked; } //@todo: Рекомендуется вынести completed_cnt в users_counters таблицу и с ней соединяться //тем более, что в ней уже есть кол-во по новой БС reserves_completed_cnt //нужно добавить поле по старой БС и пересчитать туда if ($type == 'i') { $sql = "SELECT\n po.*,\n fl.uid, fl.login, fl.uname, fl.usurname, fl.photo, fl.photosm, fl.spec, fl.is_pro, fl.is_team, fl.is_pro_test, fl.is_profi, uc.ops_frl_plus as ops_plus, uc.ops_frl_null as ops_null, uc.ops_frl_minus as ops_minus, fl.role, fl.warn, fl.is_banned, fl.ban_where, rating_get(fl.rating, fl.is_pro, fl.is_verify, fl.is_profi) as rating, fl.is_verify, fl.reg_date, fl.modified_time, fl.photo_modified_time,\n p.name AS spec_name,\n cr.country_name,\n ct.city_name, \n COALESCE(sbr_meta.completed_cnt, 0) + COALESCE(uc.reserves_completed_cnt, 0) AS completed_cnt, -- старые БС + новые БС\n uc.ops_emp_plus + uc.ops_frl_plus as ops_all_plus, uc.ops_emp_null + uc.ops_frl_null as ops_all_null, uc.ops_emp_minus + uc.ops_frl_minus as ops_all_minus,\n uc.ops_emp_plus, uc.ops_emp_null, uc.ops_emp_minus,\n uc.sbr_opi_plus, uc.sbr_opi_null, uc.sbr_opi_minus,\n uc.paid_advices_cnt + uc.sbr_opi_plus + uc.ops_emp_plus + uc.tu_orders_plus + uc.projects_fb_plus as opinions_plus,\n uc.sbr_opi_minus + uc.ops_emp_minus + uc.tu_orders_minus + uc.projects_fb_minus as opinions_minus\n {$sel_blocked} \n FROM (SELECT por.*, exec_id, pr.user_id as p_user_id FROM projects AS pr\n LEFT JOIN projects_offers as por ON por.project_id=pr.id AND (pr.exec_id =por.user_id)\n WHERE pr.id = '{$prj_id}' AND (por.user_id > 0)" . ($show_all ? '' : " AND (por.only_4_cust='f')") . ') AS po INNER JOIN freelancer as fl ON (po.exec_id=fl.uid' . ($bPermissions ? '' : ' AND fl.is_banned::integer = 0') . ")\n {$join_blocked} \n LEFT JOIN professions p ON p.id=fl.spec\n LEFT JOIN users_counters uc ON uc.user_id = fl.uid\n LEFT JOIN sbr_meta ON sbr_meta.user_id = fl.uid -- старые БС\n LEFT JOIN country cr ON cr.id=fl.country\n LEFT JOIN city ct ON ct.id=fl.city\n " . ($user_id == 0 ? "WHERE {$where_blocked}" : 'WHERE (fl.uid<>' . $user_id . ") {$and_blocked}"); $ret = $DB->rows($sql); $error = $DB->error; if ($error) { $error = parse_db_error($error); } else { if ($ret) { foreach ($ret as &$value) { // Выбираем вложения. if ($value['id']) { $sql = 'SELECT a.id, a.prev_pict as prev, a.pict ' . 'FROM projects_offers_attach AS a ' . 'WHERE a.offer_id= ?i '; $value['attach'] = $DB->rows($sql, $value['id']); } } } } } else { switch ($sort) { default: case 'date': $order = ' ORDER BY (fl.is_verify AND fl.is_pro) DESC, fl.is_pro DESC, fl.is_verify DESC, post_date DESC'; break; case 'rating': $order = ' ORDER BY rating DESC, fl.is_pro DESC, post_date DESC'; break; case 'opinions': $order = ' ORDER BY ssum DESC, fl.is_pro DESC, post_date DESC'; break; case 'time': $order = ' ORDER BY (((time_from = 0) OR (time_from IS NULL)) AND ((time_to = 0) OR (time_to IS NULL))) ASC, time_from_days ASC, time_to_days ASC, is_pro DESC, post_date DESC'; break; case 'cost': $order = ' ORDER BY (((cost_from = 0) OR (cost_from IS NULL)) AND ((cost_to = 0) OR (cost_to IS NULL))) ASC, usd_cost_from DESC, usd_cost_to DESC, is_pro DESC, post_date DESC'; break; } switch ($type) { default: case 'a': $filter = ''; break; case 'o': $filter = ' AND NOT po.selected AND NOT po.refused AND NOT po.frl_refused AND COALESCE(pr.exec_id,0)<>fl.uid'; break; case 'c': $filter = ' AND po.selected'; break; case 'r': $filter = ' AND po.refused'; break; case 'nor': $filter = ' AND NOT po.frl_refused'; break; case 'fr': $filter = ' AND po.frl_refused'; break; } require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/project_exrates.php'; $project_exRates = project_exrates::GetAll(); $sql = "SELECT\n CASE po.cost_type\n WHEN 0 THEN po.cost_from\n WHEN 1 THEN po.cost_from*{$project_exRates[32]}\n WHEN 2 THEN po.cost_from*{$project_exRates[42]}\n WHEN 3 THEN po.cost_from*{$project_exRates[12]}\n END as usd_cost_from,\n CASE po.cost_type\n WHEN 0 THEN po.cost_to\n WHEN 1 THEN po.cost_to*{$project_exRates[32]}\n WHEN 2 THEN po.cost_to*{$project_exRates[42]}\n WHEN 3 THEN po.cost_to*{$project_exRates[12]}\n END as usd_cost_to,\n\n CASE po.time_type\n WHEN 0 THEN po.time_from\n WHEN 1 THEN po.time_from * 30\n WHEN 2 THEN po.time_from * 356\n ELSE po.time_from\n END as time_from_days,\n CASE po.time_type\n WHEN 0 THEN po.time_to\n WHEN 1 THEN po.time_to * 30\n WHEN 2 THEN po.time_to * 356\n ELSE po.time_to\n END as time_to_days,\n po.*, pr.user_id AS p_user_id,\n fl.uid, fl.login, fl.uname, fl.usurname, fl.photo, fl.photosm, fl.spec, fl.is_profi, fl.is_pro, fl.is_team, fl.is_pro_test, \n uc.ops_frl_plus as ops_plus, \n uc.ops_frl_null as ops_null, \n uc.ops_frl_minus as ops_minus, \n fl.role, fl.warn, fl.is_banned, fl.ban_where, \n rating_get(fl.rating, fl.is_pro, fl.is_verify, fl.is_profi) as rating, \n zin(uc.ops_emp_plus) + zin(uc.sbr_opi_plus) - zin(uc.ops_emp_minus) - zin(uc.sbr_opi_minus) as ssum, \n fl.is_verify, fl.reg_date, fl.modified_time, fl.photo_modified_time,\n p.name AS spec_name,\n cr.country_name,\n COALESCE(sbr_meta.completed_cnt, 0) + COALESCE(uc.reserves_completed_cnt, 0) AS completed_cnt, -- старые БС + новые БС\n ct.city_name,\n uc.ops_emp_plus + uc.ops_frl_plus as ops_all_plus, uc.ops_emp_null + uc.ops_frl_null as ops_all_null, uc.ops_emp_minus + uc.ops_frl_minus as ops_all_minus,\n uc.ops_emp_plus, uc.ops_emp_null, uc.ops_emp_minus,\n uc.sbr_opi_plus, uc.sbr_opi_null, uc.sbr_opi_minus,\n uc.paid_advices_cnt + uc.sbr_opi_plus + uc.ops_emp_plus + uc.tu_orders_plus + uc.projects_fb_plus as opinions_plus,\n uc.sbr_opi_minus + uc.ops_emp_minus + uc.tu_orders_minus + uc.projects_fb_minus as opinions_minus\n {$sel_blocked} \n FROM projects_offers AS po\n LEFT JOIN projects pr ON pr.id=po.project_id\n INNER JOIN freelancer as fl ON po.user_id=fl.uid\n {$join_blocked} \n LEFT JOIN users_counters uc ON uc.user_id = fl.uid\n LEFT JOIN professions p ON p.id=fl.spec\n LEFT JOIN country cr ON cr.id=fl.country\n LEFT JOIN city ct ON ct.id=fl.city\n LEFT JOIN sbr_meta ON sbr_meta.user_id = fl.uid -- старые БС\n WHERE (po.project_id = ?i ) AND (po.user_id > 0) {$and_blocked}" . ($bPermissions ? '' : ' AND fl.is_banned::integer = 0') . ($show_all ? '' : " AND (po.only_4_cust='f')") . ($user_id == 0 ? '' : ' AND (fl.uid<>' . $user_id . ')') . $filter . $order . $limit_str; $ret = $DB->rows($sql, $prj_id); $error = $DB->error; if ($error) { $error = parse_db_error($error); } else { //$ret = pg_fetch_all($res); $sql = "SELECT COUNT(*) as num\n FROM projects_offers AS po\n LEFT JOIN projects as pr ON po.project_id=pr.id\n INNER JOIN freelancer as fl ON po.user_id=fl.uid\n {$join_blocked} \n LEFT JOIN professions p ON p.id=fl.spec\n LEFT JOIN country cr ON cr.id=fl.country\n LEFT JOIN city ct ON ct.id=fl.city\n WHERE (po.project_id = ?i ) AND (po.user_id > 0) {$and_blocked}" . ($bPermissions ? '' : ' AND fl.is_banned::integer = 0') . ($show_all ? '' : " AND (po.only_4_cust='f')") . ($user_id == 0 ? '' : ' AND (fl.uid<>' . $user_id . ')') . $filter; $count = $DB->val($sql, $prj_id); if ($count && $ret) { foreach ($ret as &$value) { // Выбираем вложения. if ($value['id']) { $sql = 'SELECT a.id, a.prev_pict as prev, a.pict ' . 'FROM projects_offers_attach AS a ' . 'WHERE a.offer_id= ?i'; $value['attach'] = $DB->rows($sql, $value['id']); } } } } } // временное решение для plproxy. очень не красиво, но пока не перенесется большая часть таблиц, // придется видимо оставить так if (!empty($ret)) { $teams = new teams(); $notes = new notes(); $t = $teams->teamsFavorites($ret[0]['p_user_id'], $error); $n = $notes->GetNotes($ret[0]['p_user_id'], 0, $error); for ($i = 0; $i < count($ret); ++$i) { // избранные $ret[$i]['in_team'] = 0; for ($j = 0; $j < count($t); ++$j) { if ($t[$j]['uid'] == $ret[$i]['uid']) { $ret[$i]['in_team'] = $ret[$i]['uid']; break; } } // заметки $ret[$i]['n_text'] = ''; for ($j = 0; $j < count($n); ++$j) { if ($n[$j]['to_id'] == $ret[$i]['uid']) { $ret[$i]['n_text'] = $n[$j]['n_text']; break; } } } } return $ret; }
public function setSelectFilter($filter) { require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/professions.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/project_exrates.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/teams.php'; require_once $_SERVER['DOCUMENT_ROOT'] . '/classes/freelancer.php'; $project_exRates = project_exrates::GetAll(); $set_select[] = '*'; // Разделы/Подразделы if ($filter['prof']) { if (count($filter['prof'][0]) > 0) { $p1 = professions::getProfIdForGroups(array_keys($filter['prof'][0]), true); } if (count($filter['prof'][1]) > 0) { $p2 = professions::GetProfessionOrigin(implode(',', array_keys($filter['prof'][1]))); } $specs = explode(',', ($p2 ? $p2 : '') . ($p1 && $p2 ? ', ' : '') . ($p1 ? $p1 : '')); $this->_engine->setFilter('specs', $specs); $this->_sortby = 'is_pro DESC, spec_origin IN (' . implode(',', $specs) . ') rating DESC, @id'; } //Стоимость if ($filter['cost']) { foreach ($filter['cost'] as $val) { if ($val['cost_from'] || $val['cost_to']) { switch ($val['type_date']) { default: case 4: if ($prof_id) { $cf = 'pcost_hour'; $ct = 'pcost_type_hour'; } else { $cf = 'cost_hour'; $ct = 'cost_type_hour'; } break; case 3: $cf = 'cost_from'; $ct = 'cost_type'; break; case 1: $cf = 'cost_month'; $ct = 'cost_type_month'; break; case 2: $cf = 'cost_1000'; $ct = 'cost_type'; break; } $cr = (int) $val['cost_type']; $cex = array(freelancer::USD => project_exrates::USD, freelancer::EUR => project_exrates::EUR, freelancer::RUR => project_exrates::RUR, freelancer::FM => project_exrates::FM); if (($cost_from = (double) $val['cost_from']) < 0) { $cost_from = 0; } if (($cost_to = (double) $val['cost_to']) < 0) { $cost_to = 0; } if ($cost_to < $cost_from && $cost_to != 0) { $cost_to = $cost_from; } if ($cost_to || $cost_from) { $cost_sql = ''; for ($i = 0; $i < 4; ++$i) { $exfr = round($cost_from * $project_exRates[$cex[$cr] . $cex[$i]], 4); $exto = round($cost_to * $project_exRates[$cex[$cr] . $cex[$i]], 4); $cost[] = "({$ct} = {$i} AND {$cf} >= {$exfr}" . ($cost_to ? " AND {$cf} <= {$exto}" : '') . ')'; } $select[] = implode(' OR ', $cost); } } } if ($select) { $set_select[] = 'IF( ( ' . implode(' OR ', $select) . ' ), 1, 0) as cost_filter'; unset($select); $this->_engine->setFilter('cost_filter', array(1)); } } // Опыт работы if ($filter['exp'][0] > 0 || $filter['exp'][1] > 0) { if ($filter['exp'][1] == 0 && $filter['exp'][0] > 0) { $select[] = "( exp >= {$filter['exp'][0]} )"; } elseif ($filter['exp'][1] > 0 && $filter['exp'][0] == 0) { $select[] = "( exp <= {$filter['exp'][1]} )"; } else { $select[] = "( exp >= {$filter['exp'][0]} AND exp <= {$filter['exp'][1]} )"; } $set_select[] = 'IF( ( ' . implode(' OR ', $select) . ' ), 1, 0) as exp_filter'; unset($select); $this->_engine->setFilter('exp_filter', array(1)); } //Возраст if ($filter['age'][1] > 0 || $filter['age'][0] > 0) { $age_from = $filter['age'][0]; $age_to = $filter['age'][1]; if ($age_to == 0 && $age_from > 0) { $select[] = "( age >= {$age_from} )"; } elseif ($age_to > 0 && $age_from == 0) { $select[] = "( age <= {$age_to} )"; } else { $select[] = "( age >= {$age_from} AND age <= {$age_to} )"; } $set_select[] = 'IF( ( ' . implode(' OR ', $select) . ' ), 1, 0) as age_filter'; unset($select); $this->_engine->setFilter('age_filter', array(1)); } // Местоположение if ($filter['country']) { $this->_engine->setFilter('country', array($filter['country'])); } if ($filter['city']) { $this->_engine->setFilter('city', array($filter['city'])); } // Ищет работу в офисе if ($filter['in_office']) { $this->_engine->setFilter('in_office', array(1)); } // У меня в избранных if ($filter['in_fav']) { $teams = new teams(); if ($tt = $teams->teamsFavorites($uid, $error)) { foreach ($tt as $t) { $select[] = " ( uid = {$t['uid']} ) "; } $set_select[] = 'IF(( ' . implode(' OR ', $select) . ' ), 1, 0) as is_fav'; unset($select); $this->_engine->setFilter('is_fav', array(1)); } } //С PRO аккаунтом if ($filter['is_pro']) { $this->_engine->setFilter('is_pro', array(1)); } //С положительными рекомендациями if ($filter['sbr_is_positive']) { $select[] = '( sbr_opi_plus > 0 )'; $set_select[] = 'IF(( ' . implode(' OR ', $select) . ' ), 1, 0) as sbr_positive_filter'; unset($select); $this->_engine->setFilter('sbr_positive_filter', array(1)); } //Без отрицательных рекомендаций if ($filter['sbr_not_negative']) { $select[] = '( sbr_opi_minus = 0 )'; $set_select[] = 'IF(( ' . implode(' OR ', $select) . ' ), 1, 0) as sbr_not_negative_filter'; unset($select); $this->_engine->setFilter('sbr_not_negative_filter', array(1)); } //С положительными мнениями /*if($filter['opi_is_positive']) { $select[] = '( ops_emp_plus > 0 )'; $set_select[] = "IF(( ".implode(" OR ", $select)." ), 1, 0) as opi_positive_filter"; unset($select); $this->_engine->setFilter("opi_positive_filter", array(1)); } //Без отрицательных мнений if($filter['opi_not_negative']) { $select[] = '( ops_emp_minus = 0 )'; $set_select[] = "IF(( ".implode(" OR ", $select)." ), 1, 0) as opi_not_negative_filter"; unset($select); $this->_engine->setFilter("opi_not_negative_filter", array(1)); }*/ // Только с примерами работ if ($filter['is_preview']) { $select[] = '( o_wrk_factor_a > 0 )'; $set_select[] = 'IF(( ' . implode(' OR ', $select) . ' ), 1, 0) as preview_filter'; unset($select); $this->_engine->setFilter('preview_filter', array(1)); } // Только свободные if ($filter['only_free']) { $select[] = '( status_type = 0)'; $set_select[] = 'IF(( ' . implode(' OR ', $select) . ' ), 1, 0) as onlyfree_filter'; unset($select); $this->_engine->setFilter('onlyfree_filter', array(1)); } //С успешным СБР if ($filter['success_sbr'][0] == 1) { $select[] = '( sbr_sum > 0 )'; for ($i = 1; $i < 4; ++$i) { if ($filter['success_sbr'][$i] == 1) { $rank[] = "( rank = {$i} )"; } } if ($rank) { $select[] = '( ' . implode(' OR ', $rank) . ' )'; } $set_select[] = 'IF(( ' . implode(' AND ', $select) . ' ), 1, 0) as sbr_rank_filter'; unset($select); $this->_engine->setFilter('sbr_rank_filter', array(1)); } if ($set_select) { $this->_engine->setSelect(implode(', ', $set_select)); } }