Joywork/engine/classes/AutoSearch.php
2026-05-22 21:21:54 +03:00

7494 lines
302 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
class AutoSearch {
public $errors = [];
public $enabled = true;
private $db = null;
private $_user;
private $_filter;
private static $_fields = [
"deal_type" => [
"label" => "Тип операции",
"type" => "select",
"multiple" => false,
"column" => "operation_type",
"reverse_search" => true,
"main_field" => true
],
"object_type" => [
"label" => "Тип объекта",
"type" => "select",
"multiple" => false,
"column" => "type",
"reverse_search" => true,
"main_field" => true
],
"object_source" => [
"label" => "Источник",
"type" => "select",
"multiple" => false,
"column" => null,
"reverse_search" => true,
"main_field" => true
],
"category_type" => [
"label" => "Категория",
"type" => "select",
"multiple" => true,
"column" => "type_category",
"reverse_search" => true,
"main_field" => true
],
"stoim" => [
"label" => "Цена",
"type" => "number",
"column" => "stoim",
"reverse_search" => true,
"main_field" => true
],
"stoim_ot" => [
"label" => "Цена, от",
"type" => "number",
"column" => null,
"reverse_search" => true,
"main_field" => true
],
"stoim_do" => [
"label" => "Цена, до",
"type" => "number",
"column" => null,
"reverse_search" => true,
"main_field" => true
],
/*"komn" => [
"label" => "Комнат",
"type" => "number",
"column" => "komnat",
"reverse_search" => true,
"main_field" => true
],
"komn_ot" => [
"label" => "Комнат, от",
"type" => "number",
"column" => null,
"reverse_search" => true,
"main_field" => true
],
"komn_do" => [
"label" => "Комнат, до",
"type" => "number",
"column" => null,
"reverse_search" => true,
"main_field" => true
],*/
"rooms" => [
"label" => "Комнат",
"type" => "select",
"multiple" => true,
"reverse_search" => true,
"main_field" => true
],
"sq_all" => [
"label" => "Общая площадь",
"type" => "number",
"column" => "ploshad",
"reverse_search" => true,
"main_field" => true
],
"sq_all_ot" => [
"label" => "Общая площадь, от",
"type" => "number",
"column" => null,
"reverse_search" => true,
"main_field" => true
],
"sq_all_do" => [
"label" => "Общая площадь, до",
"type" => "number",
"column" => null,
"reverse_search" => true,
"main_field" => true
],
"ploshad_k" => [
"label" => "Площадь кухни",
"type" => "number",
"column" => "ploshad_k",
"reverse_search" => true,
"main_field" => true
],
"ploshad_k_ot" => [
"label" => "Площадь кухни, от",
"type" => "number",
"column" => null,
"reverse_search" => true,
"main_field" => true
],
"ploshad_k_do" => [
"label" => "Площадь кухни, до",
"type" => "number",
"column" => null,
"reverse_search" => true,
"main_field" => true
],
"rent_srok" => [
"label" => "Срок аренды объекта",
"type" => "select",
"multiple" => false,
"column" => "srok",
"reverse_search" => true,
"main_field" => true
],
"metro_stations" => [
"label" => "Ближ. станции метро",
"type" => "select",
"multiple" => true,
"column" => "id_metro",
"reverse_search" => true,
"main_field" => true
],
"do_metro" => [ // должен быть выше ["regions" => ...]
"label" => "Время до метро",
"type" => "number",
"column" => ["peshkom", "transport"],
"reverse_search" => true,
"main_field" => true
],
"do_metro_type" => [
"label" => "До метро",
"type" => "select",
"multiple" => false,
"column" => "do_metro_type",
"reverse_search" => true,
"main_field" => true
],
"regions" => [
"label" => "Регион(ы) объекта",
"type" => "select",
"multiple" => true,
"column" => "id_rf_region",
"reverse_search" => true,
"main_field" => true
],
"rayons" => [
"label" => "Район(ы) объекта",
"type" => "select",
"multiple" => true,
"column" => "rayon",
"reverse_search" => true,
"main_field" => true
],
"etazhnost" => [
"label" => "Не первый/последний этаж",
"type" => "checkbox",
"column" => null,
"reverse_search" => true,
"main_field" => true
],
"newbilding_date" => [
"label" => "Срок сдачи новостроя",
"type" => "date",
"column" => null
],
"ipoteka" => [
"label" => "Ипотека",
"type" => "checkbox",
"column" => null
],
"use_area_price" => [
"label" => "Цена за квадратный метр",
"type" => "checkbox",
"column" => null
],
"voen_ipoteka" => [
"label" => "Воен. ипотека",
"type" => "checkbox",
"column" => null
],
"subsidya" => [
"label" => "Субсидия",
"type" => "checkbox",
"column" => null
],
"mather_kapital" => [
"label" => "Материнский капитал",
"type" => "checkbox",
"column" => null
],
"house_type" => [
"label" => "Тип дома",
"type" => "select",
"multiple" => false,
"column" => "house_type"
],
"house_material" => [
"label" => "Материал дома",
"type" => "select",
"multiple" => false,
"column" => "house_material"
],
"build_year" => [
"label" => "Год постройки",
"type" => "select",
"multiple" => false,
"column" => "build_year"
],
"tax_number" => [
"label" => "Номер налоговой",
"type" => "text",
"multiple" => false,
"column" => "tax_number"
],
"legal_address" => [
"label" => "Юридический адрес",
"type" => "select",
"multiple" => false,
"column" => "legal_address"
],
"etazh_all" => [
"label" => "Всего этажей",
"type" => "number",
"column" => null,
"reverse_search" => true,
"main_field" => true
],
"etazh" => [
"label" => "Этаж",
"type" => "number",
"column" => "etazh",
"reverse_search" => true,
"main_field" => true
],
"etazh_ot" => [
"label" => "Этаж, от",
"type" => "number",
"column" => null,
"reverse_search" => true,
"main_field" => true
],
"etazh_do" => [
"label" => "Этаж, до",
"type" => "number",
"column" => null,
"reverse_search" => true,
"main_field" => true
],
"etazhnost_ot" => [
"label" => "Этажность, от",
"type" => "number",
"column" => null,
"reverse_search" => true,
"main_field" => true
],
"etazhnost_do" => [
"label" => "Этажность, до",
"type" => "number",
"column" => null,
"reverse_search" => true,
"main_field" => true
],
"is_occupied" => [
"label" => "Помещение занято",
"type" => "select",
"multiple" => false,
"column" => "isOccupied"
],
"layout_id" => [
"label" => "Планировка",
"type" => "select",
"multiple" => false,
"column" => "layout_id"
],
"wet_spots" => [
"label" => "Мокрых точек",
"type" => "select",
"multiple" => false,
"column" => "number_wet_spots"
],
"el_power" => [
"label" => "Эл. мощность",
"type" => "number",
"column" => "electricity_power"
],
"el_power_ot" => [
"label" => "Эл. мощность, от",
"type" => "number",
"column" => null
],
"el_power_do" => [
"label" => "Эл. мощность, до",
"type" => "number",
"column" => null
],
"commer_condition" => [
"label" => "Состояние",
"type" => "select",
"multiple" => false,
"column" => "commer_condition"
],
"is_furniture" => [
"label" => "Мебель",
"type" => "select",
"multiple" => false,
"column" => "isFurniture"
],
"commer_access" => [
"label" => "Доступ",
"type" => "select",
"multiple" => false,
"column" => "commer_access"
],
"parking_types" => [
"label" => "Тип парковки",
"type" => "select",
"multiple" => true,
"column" => null
],
"parking_id" => [
"label" => "Парковка",
"type" => "select",
"multiple" => true,
"column" => "parking_type_id"
],
"parking_price" => [
"label" => "Стоимость парковки",
"type" => "number",
"column" => "parking_price"
],
"parking_price_free" => [
"label" => "Бесплатная парковка",
"type" => "checkbox",
"multiple" => false,
"column" => "parkingIsFree"
],
"ceiling_height" => [
"label" => "Высота потолков",
"type" => "number",
"column" => "ceiling_height"
],
"ceiling_height_ot" => [
"label" => "Высота потолков, от",
"type" => "number",
"column" => null
],
"ceiling_height_do" => [
"label" => "Высота потолков, до",
"type" => "number",
"column" => null
],
"column_grid" => [
"label" => "Сетка колон",
"type" => "text",
"column" => "column_grid"
],
"vat_type_id" => [
"label" => "Налог",
"type" => "select",
"multiple" => false,
"column" => "vat_type_id"
],
"commerc_site" => [
"label" => "Участок",
"type" => "number",
"column" => "commerc_site"
],
"commerc_owned1" => [
"label" => "Участок в собственности",
"type" => "checkbox",
"column" => "commerc_owned"
],
"commerc_owned2" => [
"label" => "Участок в аренде",
"type" => "checkbox",
"column" => "commerc_owned2"
],
"floor_material_id" => [
"label" => "Материал пола",
"type" => "select",
"multiple" => false,
"column" => "floor_material_id"
],
"commerc_portal_id" => [
"label" => "Ворота",
"type" => "select",
"multiple" => false,
"column" => "commerc_portal_id"
],
"commerc_purpose" => [
"label" => "Назначение",
"type" => "select",
"multiple" => true,
"column" => "commerc_purpose"
],
"commerc_land_category_id" => [
"label" => "Категория земли",
"type" => "select",
"multiple" => true,
"column" => "commerc_land_category_id"
],
"commerc_permitted_use_id" => [
"label" => "Вид разрешенного использования",
"type" => "select",
"multiple" => true,
"column" => "commerc_permitted_use_id"
],
"commerc_electricity_id" => [
"label" => "Электричество",
"type" => "select",
"multiple" => false,
"column" => "commerc_electricity_id"
],
"can_electricity" => [
"label" => "Можно подключить электричество",
"type" => "checkbox",
"column" => "can_electricity"
],
"commerc_gas_id" => [
"label" => "Газ",
"type" => "select",
"multiple" => false,
"column" => "commerc_gas_id"
],
"can_gas" => [
"label" => "Можно подключить газ",
"type" => "checkbox",
"column" => "can_gas"
],
"commerc_water_id" => [
"label" => "Вода",
"type" => "select",
"multiple" => false,
"column" => "commerc_water_id"
],
"can_water" => [
"label" => "Можно подключить воду",
"type" => "checkbox",
"column" => "can_water"
],
"commerc_sewage_id" => [
"label" => "Канализация",
"type" => "select",
"multiple" => false,
"column" => "commerc_sewage_id"
],
"can_sewage" => [
"label" => "Можно подключить канализацию",
"type" => "checkbox",
"column" => "can_sewage"
],
"commerc_driveways" => [
"label" => "Подъездные пути",
"type" => "select",
"multiple" => false,
"column" => "commerc_driveways_id"
],
"commerc_year" => [
"label" => "Год постройки",
"type" => "number",
"column" => "commerc_year"
],
"commerc_year_ot" => [
"label" => "Год постройки, от",
"type" => "number",
"column" => null
],
"commerc_year_do" => [
"label" => "Год постройки, до",
"type" => "number",
"column" => null
],
"commerc_building_type_id" => [
"label" => "Тип здания",
"type" => "select",
"multiple" => true,
"column" => "commerc_building_type_id"
],
"commerc_building_class_id" => [
"label" => "Класс здания",
"type" => "select",
"multiple" => true,
"column" => "commerc_building_class_id"
],
"building_area" => [
"label" => "Площадь здания",
"type" => "number",
"column" => "building_area"
],
"building_area_ot" => [
"label" => "Площадь здания, от",
"type" => "number",
"column" => null
],
"building_area_do" => [
"label" => "Площадь здания, до",
"type" => "number",
"column" => null
],
"commerc_houseline_type_id" => [
"label" => "Линия домов",
"type" => "select",
"multiple" => true,
"column" => "commerc_houseLineType_id"
],
"commerc_building_category_id" => [
"label" => "Категория",
"type" => "select",
"multiple" => false,
"column" => "commerc_building_category_id"
],
"commerc_opened_id" => [
"label" => "Вход",
"type" => "select",
"multiple" => true,
"column" => "commerc_opened_id"
],
"commerc_building_ventilation" => [
"label" => "Вентиляция",
"type" => "select",
"multiple" => false,
"column" => "commerc_building_ventilation"
],
"commerc_building_conditioning" => [
"label" => "Кондиционирование",
"type" => "select",
"multiple" => false,
"column" => "commerc_building_conditioning"
],
"commerc_building_heating" => [
"label" => "Отопление",
"type" => "select",
"multiple" => false,
"column" => "commerc_building_heating"
],
"commerc_building_fire" => [
"label" => "Система пожаротуш-я",
"type" => "select",
"multiple" => false,
"column" => "commerc_building_fire"
],
"garage_type_id" => [
"label" => "Тип",
"type" => "select",
"multiple" => false,
"column" => "garage_type_id"
],
"garage_vid_id" => [
"label" => "Тип гаража",
"type" => "select",
"multiple" => false,
"column" => "garage_vid_id"
],
"boks_vid_id" => [
"label" => "Тип бокса",
"type" => "select",
"multiple" => false,
"column" => "boks_vid_id"
],
"commerc_status_id" => [
"label" => "Статус",
"type" => "select",
"multiple" => false,
"column" => "commerc_status_id"
],
"commerc_specifications" => [
"label" => "Технические хар-ки",
"type" => "select",
"multiple" => true,
"column" => "commerc_specifications"
],
"commerc_infrastructure" => [
"label" => "Инфраструктура",
"type" => "select",
"multiple" => true,
"column" => "commerc_infrastructure"
],
"commerc_infrastructure1" => [
"label" => "Инфраструктура",
"type" => "select",
"multiple" => true,
"column" => "commerc_infrastructure1"
],
"commerc_infrastructure2" => [
"label" => "Инфраструктура",
"type" => "select",
"multiple" => true,
"column" => "commerc_infrastructure2"
],
"commerc_lift1" => [
"label" => "Грузовой лифт",
"type" => "number",
"column" => "commerc_lift1"
],
"lift1_carrying" => [
"label" => "Грузовой лифт, грузоподъемность",
"type" => "number",
"column" => "lift1_carrying"
],
"commerc_lift2" => [
"label" => "Тельфер",
"type" => "number",
"column" => "commerc_lift2"
],
"lift2_carrying" => [
"label" => "Тельфер, грузоподъемность",
"type" => "number",
"column" => "lift2_carrying"
],
"commerc_lift3" => [
"label" => "Пассажирский лифт",
"type" => "number",
"column" => "commerc_lift3"
],
"lift3_carrying" => [
"label" => "Пассажирский лифт, грузоподъемность",
"type" => "number",
"column" => "lift3_carrying"
],
"commerc_crane1" => [
"label" => "Мостовой кран",
"type" => "number",
"column" => "commerc_crane1"
],
"crane1_carrying" => [
"label" => "Мостовой кран, грузоподъемность",
"type" => "number",
"column" => "crane1_carrying"
],
"commerc_crane2" => [
"label" => "Кран-балка",
"type" => "number",
"column" => "commerc_crane2"
],
"crane2_carrying" => [
"label" => "Кран-балка, грузоподъемность",
"type" => "number",
"column" => "crane2_carrying"
],
"commerc_crane3" => [
"label" => "Ж/д кран",
"type" => "number",
"column" => "commerc_crane3"
],
"crane3_carrying" => [
"label" => "Ж/д кран, грузоподъемность",
"type" => "number",
"column" => "crane3_carrying"
],
"commerc_crane4" => [
"label" => "Козловой кран",
"type" => "number",
"column" => "commerc_crane4"
],
"crane4_carrying" => [
"label" => "Козловой кран, грузоподъемность",
"type" => "number",
"column" => "crane4_carrying"
],
"opis" => [
"label" => "Слова в описании",
"type" => "textarea",
"column" => "opis"
],
"comment" => [
"label" => "Комментарий",
"type" => "textarea",
"column" => null
]
];
private $viewed_limit = 5000;
private $ignored_limit = 1000;
private $favoured_limit = 1000;
private $sended_limit = 1000;
public function __construct($db = null)
{
if (isset($_SESSION['id'])) {
if (!isset($user) || is_null($user)) {
$user_id = intval($_SESSION['id']);
$user = new User;
$user->get($user_id);
$this->_user = $user;
} else {
$this->_user = $user;
}
} else {
$this->_user = null;
}
if (!is_null($db)) {
$this->db = $db;
} else {
//$this->db = new MysqlPdo(hstsph, null, null, null, true, '9306');
$pdo = new MysqlPdo(hstsph, ndb, user, pass, true, '9306');
$pdo->query("SET NAMES 'utf8'");
$this->db = $pdo;
}
}
private function getViewedObjects($filter_id = null) {
if (!$filter_id)
return false;
$sql = "SELECT `object_id` FROM `autosearch_viewed` WHERE `filter_id` = '$filter_id' LIMIT $this->viewed_limit";
if ($query = mysql_query($sql)) {
if (mysql_num_rows($query)) {
$objects_id = [];
while ($row = mysql_fetch_assoc($query)) {
$objects_id[] = (int)$row['object_id'];
}
return array_unique($objects_id);
} else {
return [];
}
}
return false;
}
private function getIgnoredObjects($filter_id = null) {
if (!$filter_id)
return false;
$sql = "SELECT `object_id` FROM `autosearch_ignored` WHERE `filter_id` = '$filter_id' LIMIT $this->ignored_limit";
if ($query = mysql_query($sql)) {
if (mysql_num_rows($query)) {
$objects_id = [];
while ($row = mysql_fetch_assoc($query)) {
$objects_id[] = (int)$row['object_id'];
}
return array_unique($objects_id);
} else {
return [];
}
}
return false;
}
private function getFavouredObjects($filter_id = null) {
if (!$filter_id)
return false;
$sql = "SELECT af.`object_id` FROM `autosearch_favoured` af JOIN `objects` o on o.`id` = af.`object_id` WHERE af.`filter_id` = '$filter_id' LIMIT $this->favoured_limit";
if ($query = mysql_query($sql)) {
if (mysql_num_rows($query)) {
$objects_id = [];
while ($row = mysql_fetch_assoc($query)) {
$objects_id[] = (int)$row['object_id'];
}
return array_unique($objects_id);
} else {
return [];
}
}
return false;
}
private function getSendedObjects($filter_id = null) {
if (!$filter_id)
return false;
$sql = "SELECT `object_id` FROM `autosearch_sended` WHERE `filter_id` = '$filter_id' LIMIT $this->sended_limit";
if ($query = mysql_query($sql)) {
if (mysql_num_rows($query)) {
$objects_id = [];
while ($row = mysql_fetch_assoc($query)) {
$objects_id[] = (int)$row['object_id'];
}
return array_unique($objects_id);
} else {
return [];
}
}
return false;
}
public function getFilter($id = null, $user_id = null, $only_active = true, $formatDate = false) {
if (!is_null($id)) {
$sql = "SELECT `filters`.*,
`filters`.`telegram_notify` AS `telegram_notify`,
`req`.`name` AS `req`,
`req`.`type_id` AS `req_type_id`,
`req`.`asfilter_id` AS `asfilter_id`,
`req`.`who_work` AS `who_work`,
`client`.`fio` AS `client_fio`,
`client`.`id` AS `client_id`,
`client`.`phone` AS `client_phone`,
`client`.`email` AS `client_email`,
DATE_FORMAT(`filters`.`newbilding_date`, '%d.%m.%Y') as `newbilding_date`,
DATE_FORMAT(`filters`.`build_year`, '%Y') as `build_year`,
COALESCE(MAX(`results`.`processed_at`) , '0000-00-00 00:00:00') AS `processed_at`,
SUM(`results`.`count`) AS `count`,
`results`.`total` AS `total`,
GROUP_CONCAT(`results`.`error` SEPARATOR '|') AS `errors`
FROM `autosearch_filters` AS `filters`
LEFT JOIN `requisitions` AS `req` ON `req`.`id` = `filters`.`req_id`
LEFT JOIN `clients` AS `client` ON `client`.`id` = `req`.`client_id`
LEFT JOIN `autosearch_results` AS `results` ON `results`.`filter_id` = `filters`.`id`
WHERE `filters`.`id` = '$id' ";
$agents_ids = [];
if ($user_id) {
$agents_ids[] = $user_id;
$user = new \User;
$agency_id = $user->getAgencyIdForUser($user_id);
if (!empty($agency_id)) {
$agents_ids[] = $agency_id;
$sql_users = "SELECT id FROM users WHERE id = '$user_id' or id in (select id from users where id=$agency_id or id_manager=$agency_id or id_manager in
(select id from users where id_manager=$agency_id or id_manager in
(select id from users where id_manager=$agency_id)))";
$query = mysql_query($sql_users);
while ($row = mysql_fetch_assoc($query)) {
$agents_ids[] = (int)$row['id'];
}
$agents_ids = array_unique($agents_ids);
}
}
/*if (count($agents_ids) > 0)
$sql .= " AND (`filters`.`created_by` IN (".implode(',', $agents_ids).") OR `filters`.`updated_by` IN (".implode(',', $agents_ids)."))";
else if (isset($_SESSION['id']))
$sql .= " AND (`filters`.`created_by` = '$_SESSION[id]' OR `filters`.`updated_by` = '$_SESSION[id]')";*/
if ($only_active)
$sql .= " AND `filters`.`is_active` = '1'";
$sql .= " ORDER BY `processed_at` LIMIT 1";
if ($query = mysql_query($sql)) {
if (mysql_num_fields($query))
$this->_filter = mysql_fetch_assoc($query);
if ($formatDate) {
if (in_array($this->_filter['newbilding_date'], ['0000-00-00 00:00:00', '1970-01-01 00:00:00', '00.00.0000 00:00:00', '01.01.1970 00:00:00']))
$this->_filter['newbilding_date'] = null;
else
$this->_filter['newbilding_date'] = self::formatRusDatetime($this->_filter['newbilding_date'], true, true, true, false);
if (in_array($this->_filter['build_year'], ['0000-00-00 00:00:00', '1970-01-01 00:00:00', '00.00.0000 00:00:00', '01.01.1970 00:00:00', '01.01.1970', '1970']))
$this->_filter['build_year'] = null;
else
$this->_filter['build_year'] = self::formatRusDatetime($this->_filter['build_year'], true, false, false, false);
} else {
if (in_array($this->_filter['newbilding_date'], ['0000-00-00 00:00:00', '1970-01-01 00:00:00', '00.00.0000 00:00:00', '01.01.1970 00:00:00']))
$this->_filter['newbilding_date'] = null;
else
$this->_filter['newbilding_date'] = date('Y-m-d', strtotime($this->_filter['newbilding_date']));
if (in_array($this->_filter['build_year'], ['0000-00-00 00:00:00', '1970-01-01 00:00:00', '00.00.0000 00:00:00', '01.01.1970 00:00:00', '01.01.1970', '1970']))
$this->_filter['build_year'] = null;
/*else
$this->_filter['build_year'] = date('Y', strtotime($this->_filter['build_year']));*/
}
if ($this->_filter['newbilding_date'] == "01.01.1970" || $this->_filter['newbilding_date'] == "1970-01-01")
$this->_filter['newbilding_date'] = null;
if ($this->_filter['build_year'] == "01.01.1970" || $this->_filter['build_year'] == "1970-01-01" || $this->_filter['build_year'] == "1970")
$this->_filter['build_year'] = null;
if (!empty($this->_filter['rooms']))
$this->_filter['rooms'] = $this->_filter['rooms'];
else
$this->_filter['rooms'] = '[]';
if (!empty($this->_filter['geo']))
$this->_filter['geo'] = str_replace(',,', ',', str_replace(' ', ',', $this->_filter['geo']));
$this->_filter['error'] = '';
if (!empty($this->_filter['errors'])) {
$errors = explode('|', $this->_filter['errors']);
$this->_filter['error'] = array_pop($errors);
}
if (intval($this->_filter['count'])){
$meta = self::getMetaResults($this->_filter['id']);
$viewed_ids = array_unique(array_map('intval', $meta['viewed']));
$ignored_ids = array_unique(array_map('intval', $meta['ignored']));
$ids = array_diff(array_unique(array_map('intval', $meta['results']['match'])), $ignored_ids);
$this->_filter['count'] = !empty($ids) ? count(array_diff($ids, $viewed_ids)) : 0;
}
return $this->_filter;
} else {
return mysql_error();
}
}
return null;
}
public function getFilterByReq($req_id = null, $user_id = null, $only_active = true, $formatDate = false, $is_list_req = false) {
if (!is_null($req_id) && $req_id > 0) {
$sql = "SELECT `filters`.*,
`filters`.`telegram_notify` AS `telegram_notify`,
`req`.`name` AS `req`,
`req`.`type_id` AS `req_type_id`,
`req`.`asfilter_id` AS `asfilter_id`,
`req`.`who_work` AS `who_work`,
`client`.`fio` AS `client_fio`,
`client`.`id` AS `client_id`,
`client`.`phone` AS `client_phone`,
`client`.`email` AS `client_email`,
DATE_FORMAT(`filters`.`newbilding_date`, '%d.%m.%Y') as `newbilding_date`,
DATE_FORMAT(`filters`.`build_year`, '%Y') as `build_year`,
COALESCE(MAX(`results`.`processed_at`) , '0000-00-00 00:00:00') AS `processed_at`,
SUM(`results`.`count`) AS `count`,
`results`.`total` AS `total`,
GROUP_CONCAT(`results`.`error` SEPARATOR '|') AS `errors`
FROM `autosearch_filters` AS `filters`
LEFT JOIN `requisitions` AS `req` ON `req`.`id` = `filters`.`req_id`
LEFT JOIN `clients` AS `client` ON `client`.`id` = `req`.`client_id`
LEFT JOIN `autosearch_results` AS `results` ON `results`.`filter_id` = `filters`.`id`
WHERE `filters`.`req_id` = '$req_id' ";
$agents_ids = [];
if ($user_id) {
$agents_ids[] = $user_id;
$user = new \User;
$agency_id = $user->getAgencyIdForUser($user_id);
if (!empty($agency_id)) {
$agents_ids[] = $agency_id;
// $sql_users = "SELECT id FROM users WHERE id = '$user_id' or id in (select id from users where id=$agency_id or id_manager=$agency_id or id_manager in
// (select id from users where id_manager=$agency_id or id_manager in
// (select id from users where id_manager=$agency_id)))";
$sql_users = "SELECT id FROM users WHERE company_id = $agency_id";
$query = mysql_query($sql_users);
while ($row = mysql_fetch_assoc($query)) {
$agents_ids[] = (int)$row['id'];
}
$agents_ids = array_unique($agents_ids);
}
}
/*if (count($agents_ids) > 0)
$sql .= " AND (`filters`.`created_by` IN (".implode(',', $agents_ids).") OR `filters`.`updated_by` IN (".implode(',', $agents_ids)."))";
else if (isset($_SESSION['id']))
$sql .= " AND (`filters`.`created_by` = '$_SESSION[id]' OR `filters`.`updated_by` = '$_SESSION[id]')";*/
if ($only_active)
$sql .= " AND `filters`.`is_active` = '1'";
$sql .= " ORDER BY `processed_at` LIMIT 1";
if ($query = mysql_query($sql)) {
if (mysql_num_fields($query))
$this->_filter = mysql_fetch_assoc($query);
if ($formatDate) {
if (in_array($this->_filter['newbilding_date'], ['0000-00-00 00:00:00', '1970-01-01 00:00:00', '00.00.0000 00:00:00', '01.01.1970 00:00:00']))
$this->_filter['newbilding_date'] = null;
else
$this->_filter['newbilding_date'] = self::formatRusDatetime($this->_filter['newbilding_date'], true, true, true, false);
if (in_array($this->_filter['build_year'], ['0000-00-00 00:00:00', '1970-01-01 00:00:00', '00.00.0000 00:00:00', '01.01.1970 00:00:00']))
$this->_filter['build_year'] = null;
else
$this->_filter['build_year'] = self::formatRusDatetime($this->_filter['build_year'], true, false, false, false);
} else {
if (in_array($this->_filter['newbilding_date'], ['0000-00-00 00:00:00', '1970-01-01 00:00:00', '00.00.0000 00:00:00', '01.01.1970 00:00:00']))
$this->_filter['newbilding_date'] = null;
else
$this->_filter['newbilding_date'] = date('Y-m-d', strtotime($this->_filter['newbilding_date']));
if (in_array($this->_filter['build_year'], ['0000-00-00 00:00:00', '1970-01-01 00:00:00', '00.00.0000 00:00:00', '01.01.1970 00:00:00']))
$this->_filter['build_year'] = null;
/*else
$this->_filter['build_year'] = date('Y', strtotime($this->_filter['build_year']));*/
}
if ($this->_filter['newbilding_date'] == "01.01.1970" || $this->_filter['newbilding_date'] == "1970-01-01")
$this->_filter['newbilding_date'] = null;
if ($this->_filter['build_year'] == "01.01.1970" || $this->_filter['build_year'] == "1970-01-01")
$this->_filter['build_year'] = null;
if (!empty($this->_filter['rooms']))
$this->_filter['rooms'] = $this->_filter['rooms'];
else
$this->_filter['rooms'] = '[]';
if (!empty($this->_filter['geo']))
$this->_filter['geo'] = str_replace(',,', ',', str_replace(' ', ',', $this->_filter['geo']));
$this->_filter['error'] = '';
if (!empty($this->_filter['errors'])) {
$errors = explode('|', $this->_filter['errors']);
$this->_filter['error'] = array_pop($errors);
}
// $viewed_count = 0;
// if ($viewed = $this->getViewedObjects($this->_filter['id'])) {
// $viewed_count = count($viewed);
// }
if (intval($this->_filter['count'])){
if( !$is_list_req)
$meta = self::getMetaResults($this->_filter['id']);
$viewed_ids = array_unique(array_map('intval', $meta['viewed']));
$ignored_ids = array_unique(array_map('intval', $meta['ignored']));
$ids = array_diff(array_unique(array_map('intval', $meta['results']['match'])), $ignored_ids);
$this->_filter['count'] = !empty($ids) ? count(array_diff($ids, $viewed_ids)) : 0;
// $this->_filter['count'] = abs(intval($this->_filter['count']) - $viewed_count);
}
return $this->_filter;
} else {
return mysql_error();
}
}
return null;
}
public function getFiltersByReqs($req_ids, $agents_ids, $only_active = true) {
$req_ids = implode(',', array_map('intval', $req_ids));
$agents_ids = implode(',', array_map('intval', $agents_ids));
$sql = "
SELECT `filters`.*
FROM `autosearch_filters` AS `filters`
WHERE `filters`.`req_id` IN ($req_ids)
AND (`filters`.`created_by` IN ($agents_ids) OR `filters`.`updated_by` IN ($agents_ids))
";
if ($only_active) {
$sql .= " AND `filters`.`is_active` = '1'";
}
$result = mysql_query($sql);
$filters = [];
while ($row = mysql_fetch_assoc($result)) {
$filters[$row['req_id']] = $row;
}
if (empty($filters)) return [];
$filter_ids = implode(',', array_column($filters, 'id'));
$sql_stats = "
SELECT filter_id,
COALESCE(MAX(processed_at), '0000-00-00 00:00:00') AS processed_at,
SUM(`count`) AS `count`,
`total`,
GROUP_CONCAT(`error` SEPARATOR '|') AS errors
FROM `autosearch_results`
WHERE filter_id IN ($filter_ids)
GROUP BY filter_id
";
$stats = [];
$result = mysql_query($sql_stats);
while ($row = mysql_fetch_assoc($result)) {
$stats[$row['filter_id']] = $row;
}
foreach ($filters as &$filter) {
$stat = isset($stats[$filter['id']]) ? $stats[$filter['id']] : [
'processed_at' => '0000-00-00 00:00:00',
'count' => 0,
'total' => 0,
'errors' => ''
];
$filter += $stat;
}
return $filters;
}
public function getFilterByClient($client_id = null, $user_id = null, $only_active = true) {
$agency_id = User::getUserAgencyID();
$sql_req = "SELECT id FROM `requisitions`
WHERE `client_id` = '".intval($client_id)."' AND
(`type_id` = '1' or `type_id` in (SELECT id FROM requisitions_type WHERE agency_id = {$agency_id} and heir=1)) AND
`deleted` <> 1
LIMIT 1";
$req_id = (int)mysql_fetch_assoc(mysql_query($sql_req))['id'];
return self::getFilterByReq($req_id, $user_id, $only_active);
}
public function buildFilterInput($filter = null, $field_id = null, $with_label = false) {
if (is_null($filter) || is_null($field_id))
return null;
$html = '';
$wrap = true;
$input_id = strtolower(str_replace('_', '-', $field_id));
$input_name = strtolower($field_id);
$field_id = trim($field_id);
switch ($field_id) {
case 'deal_type' :
$html = '';
$list = AutoSearch::getCommonFields('deal_type', $filter['deal_type']);
foreach ($list as $key => $item) {
$html .= '<option value="'.$item['value'].'" '. ((intval($item['value']) == $filter['deal_type']) ? 'selected' : '') .'>'.$item['label'].'</option>';
}
$html = '<select id="asfiltr-' . $input_id . '" name="' . $input_name . '">' . $html . '</select>';
$wrap = false;
break;
case 'object_type' :
$html = '';
$list = AutoSearch::getCommonFields('object_type', $filter['object_type']);
foreach ($list as $key => $item) {
$html .= '<option value="'.$item['value'].'" '. ((intval($item['value']) == $filter['object_type']) ? 'selected' : '') .'>'.$item['label'].'</option>';
}
$html = '<select id="asfiltr-' . $input_id . '" name="' . $input_name . '">' . $html . '</select>';
$wrap = false;
break;
case 'object_source' :
$html = '';
$list = AutoSearch::getCommonFields('object_source', $filter['object_source']);
foreach ($list as $key => $item) {
$html .= '<option value="'.$item['value'].'" '. ((intval($item['value']) == $filter['object_source']) ? 'selected' : '') .'>'.$item['label'].'</option>';
}
$html = '<select id="asfiltr-' . $input_id . '" name="' . $input_name . '">' . $html . '</select>';
$wrap = false;
break;
case 'stoim' :
case 'stoim_ot' :
case 'stoim_do' :
$html = '<input name="stoim_ot" type="number" min="0" max="99999000" placeholder="от" value="' . $filter['stoim_ot'] .'" class="number text small-input no-mrg-left">';
$html .= '<span class="form-label floor-label">&nbsp;из&nbsp;</span>';
$html .= '<input name="stoim_do" type="number" min="0" max="99999000" placeholder="до" value="' . $filter['stoim_do'] .'" class="number text small-input">';
$html .= '<span class="form-label with-pad">&nbsp;руб.</span>';
break;
case 'komn' :
case 'komn_ot' :
case 'komn_do' :
$html = '<input name="komn_ot" type="number" min="0" max="50" placeholder="от" value="' . $filter['komn_ot'] .'" class="number text small-input no-mrg-left">';
$html .= '<span class="form-label floor-label">&nbsp;~&nbsp;</span>';
$html .= '<input name="komn_do" type="number" min="0" max="50" placeholder="до" value="' . $filter['komn_do'] .'" class="number text small-input">';
break;
case 'sq_all' :
case 'sq_all_ot' :
case 'sq_all_do' :
$html = '<input name="sq_all_ot" type="number" min="0" max="1000" placeholder="от" value="' . $filter['sq_all_ot'] .'" class="number text small-input no-mrg-left">';
$html .= '<span class="form-label floor-label">&nbsp;~&nbsp;</span>';
$html .= '<input name="sq_all_do" type="number" min="0" max="1000" placeholder="до" value="' . $filter['sq_all_do'] .'" class="number text small-input">';
$html .= '<span class="form-label with-pad">&nbsp;м. кв</span>';
break;
case 'ploshad_k' :
case 'ploshad_k_ot' :
case 'ploshad_k_do' :
$html = '<input name="ploshad_k_ot" type="number" min="0" max="1000" placeholder="от" value="' . $filter['ploshad_k_ot'] .'" class="number text small-input no-mrg-left">';
$html .= '<span class="form-label floor-label">&nbsp;~&nbsp;</span>';
$html .= '<input name="ploshad_k_do" type="number" min="0" max="1000" placeholder="до" value="' . $filter['ploshad_k_do'] .'" class="number text small-input">';
$html .= '<span class="form-label with-pad">&nbsp;м. кв</span>';
break;
case 'rent_srok' :
$html = '';
$list = AutoSearch::getCommonFields('rent_srok', $filter['rent_srok']);
foreach ($list as $key => $item) {
$html .= '<option value="'.$item['value'].'" '. ((intval($item['value']) == $filter['rent_srok']) ? 'selected' : '') .'>'.$item['label'].'</option>';
}
$html = '<select id="asfiltr-' . $input_id . '" name="' . $input_name . '">' . $html . '</select>';
$wrap = false;
break;
case 'regions' :
$html = '';
$list = AutoSearch::getCommonFields('regions', $filter['regions']);
foreach ($list as $key => $item) {
$html .= '<option value="'.$item['value'].'" '. (in_array(intval($item['value']), json_decode($filter['regions'])) ? 'selected' : '') .'>'.$item['label'].'</option>';
}
$html = '<select id="asfiltr-' . $input_id . '" name="' . $input_name . '" multiple>' . $html . '</select>';
$wrap = false;
break;
case 'rayons' :
$html = '';
$list = AutoSearch::getCommonFields('rayons', $filter['rayons']);
foreach ($list as $key => $item) {
$html .= '<option value="'.$item['value'].'" '. (in_array(intval($item['value']), json_decode($filter['rayons'])) ? 'selected' : '') .'>'.$item['label'].'</option>';
}
$html = '<select id="asfiltr-' . $input_id . '" name="' . $input_name . '" multiple>' . $html . '</select>';
$wrap = false;
break;
case 'metro_stations' :
$html = '';
$list = AutoSearch::getCommonFields('metro_stations', $filter['metro_stations']);
foreach ($list as $key => $item) {
$html .= '<option value="'.$item['value'].'" '. (in_array(intval($item['value']), json_decode($filter['metro_stations'])) ? 'selected' : '') .'>'.$item['label'].'</option>';
}
$html = '<select id="asfiltr-' . $input_id . '" name="' . $input_name . '" multiple>' . $html . '</select>';
$wrap = false;
break;
case 'do_metro' :
$html = '<input name="do_metro" type="text" id="asfiltr-metro-minut" placeholder="не более" value="' . $filter['do_metro'] . '" class="text minut small-input no-mrg-left">';
$html .= '<span class="form-label with-pad">минут, если: </span>';
$html .= '<select name="do_metro_type"><option value="1">пешком</option> <option value="2">на транспорте</option></select>';
break;
case 'etazh_all' :
case 'etazhnost_ot' :
case 'etazhnost_do' :
$html = '<input name="etazhnost_ot" type="number" placeholder="от" value="' . $filter['etazhnost_ot'] .'" class="number text small-input no-mrg-left">';
$html .= '<span class="form-label floor-label">&nbsp;~&nbsp;</span>';
$html .= '<input name="etazhnost_do" type="number" placeholder="до" value="' . $filter['etazhnost_do'] .'" class="number text small-input">';
break;
case 'etazhnost' :
$html = '<div class="checkbox small" style="margin-bottom: 0;">';
$html .= '<input id="asfiltr-' . $input_id . '" name="' . $input_name . '" type="checkbox" value="1" ' . (boolval($filter['etazhnost']) ? " checked" : "") . ' />';
$html .= '<label for="asfiltr-' . $input_id . '"></label>';
$html .= '</div>';
$wrap = false;
break;
/*case 'order_type' :
$html = '';
$list = AutoSearch::getCommonFields('order_type', $filter['order_type']);
foreach ($list as $key => $item) {
$html .= '<option value="'.$item['value'].'" '. ((intval($item['value']) == $filter['order_type']) ? 'selected' : '') .'>'.$item['label'].'</option>';
}
$html = '<select id="asfiltr-' . $input_id . '" name="' . $input_name . '">' . $html . '</select>';
$wrap = false;
break;*/
case 'newbilding_date' :
$html = '<input id="asfiltr-' . $input_id . '" name="' . $input_name . '" type="text" value="'.$filter['newbilding_date'].'" class="datepicker-here2 text medium-input no-mrg-left">';
$wrap = false;
break;
case 'ipoteka' :
$html = '<div class="checkbox small" style="margin-bottom: 0;">';
$html .= '<input id="asfiltr-' . $input_id . '" name="' . $input_name . '" type="checkbox" value="1" ' . (boolval($filter['ipoteka']) ? " checked" : "") . ' />';
$html .= '<label for="asfiltr-' . $input_id . '"></label>';
$html .= '</div>';
$wrap = false;
break;
case 'use_area_price' :
$html = '<div class="checkbox small" style="margin-bottom: 0;">';
$html .= '<input id="asfiltr-' . $input_id . '" name="' . $input_name . '" type="checkbox" value="1" ' . (boolval($filter['use_area_price']) ? " checked" : "") . ' />';
$html .= '<label for="asfiltr-' . $input_id . '"></label>';
$html .= '</div>';
$wrap = false;
break;
case 'voen_ipoteka' :
$html = '<div class="checkbox small" style="margin-bottom: 0;">';
$html .= '<input id="asfiltr-' . $input_id . '" name="' . $input_name . '" type="checkbox" value="1" ' . (boolval($filter['voen_ipoteka']) ? " checked" : "") . ' />';
$html .= '<label for="asfiltr-' . $input_id . '"></label>';
$html .= '</div>';
$wrap = false;
break;
case 'subsidya' :
$html = '<div class="checkbox small" style="margin-bottom: 0;">';
$html .= '<input id="asfiltr-' . $input_id . '" name="' . $input_name . '" type="checkbox" value="1" ' . (boolval($filter['subsidya']) ? " checked" : "") . ' />';
$html .= '<label for="asfiltr-' . $input_id . '"></label>';
$html .= '</div>';
$wrap = false;
break;
case 'mather_kapital' :
$html = '<div class="checkbox small" style="margin-bottom: 0;">';
$html .= '<input id="asfiltr-' . $input_id . '" name="' . $input_name . '" type="checkbox" value="1" ' . (boolval($filter['mather_kapital']) ? " checked" : "") . ' />';
$html .= '<label for="asfiltr-' . $input_id . '"></label>';
$html .= '</div>';
$wrap = false;
break;
case 'house_type' :
$html = '';
$list = AutoSearch::getCommonFields('house_type', $filter['house_type']);
foreach ($list as $key => $item) {
$html .= '<option value="'.$item['value'].'" '. ((intval($item['value']) == $filter['house_type']) ? 'selected' : '') .'>'.$item['label'].'</option>';
}
$html = '<select id="asfiltr-' . $input_id . '" name="' . $input_name . '">' . $html . '</select>';
$wrap = false;
break;
case 'house_material' :
$html = '';
$list = AutoSearch::getCommonFields('house_material', $filter['house_material']);
foreach ($list as $key => $item) {
$html .= '<option value="'.$item['value'].'" '. ((intval($item['value']) == $filter['house_material']) ? 'selected' : '') .'>'.$item['label'].'</option>';
}
$html = '<select id="asfiltr-' . $input_id . '" name="' . $input_name . '">' . $html . '</select>';
$wrap = false;
break;
case 'build_year' :
$html = '';
$list = AutoSearch::getCommonFields('build_year', $filter['build_year']);
foreach ($list as $key => $item) {
$html .= '<option value="'.$item['value'].'" '. ((intval($item['value']) == $filter['build_year']) ? 'selected' : '') .'>'.$item['label'].'</option>';
}
$html = '<select id="asfiltr-' . $input_id . '" name="' . $input_name . '">' . $html . '</select>';
$wrap = false;
break;
case 'rooms' :
$html = '';
$list = AutoSearch::getCommonFields('rooms', $filter['rooms']);
foreach ($list as $key => $item) {
$html .= '<option value="'.$item['value'].'" '. (in_array($item['value'], $filter['rooms']) ? 'selected' : '') .'>'.$item['label'].'</option>';
}
$html = '<select id="asfiltr-' . $input_id . '" name="' . $input_name . '" multiply multiple>' . $html . '</select>';
$wrap = false;
break;
case 'etazh' :
case 'etazh_ot' :
case 'etazh_do' :
$html = '<input name="etazh_ot" type="number" placeholder="от" value="' . $filter['ploshad_k_ot'] .'" class="number text small-input no-mrg-left">';
$html .= '<span class="form-label floor-label">&nbsp;~&nbsp;</span>';
$html .= '<input name="etazh_do" type="number" placeholder="до" value="' . $filter['ploshad_k_do'] .'" class="number text small-input">';
break;
case 'el_power' :
case 'el_power_ot' :
case 'el_power_do' :
$html = '<input name="el_power_ot" type="number" placeholder="от" value="' . $filter['ploshad_k_ot'] .'" class="number text small-input no-mrg-left">';
$html .= '<span class="form-label floor-label">&nbsp;~&nbsp;</span>';
$html .= '<input name="el_power_do" type="number" placeholder="до" value="' . $filter['ploshad_k_do'] .'" class="number text small-input">';
$html .= '<span class="form-label with-pad">&nbsp;кВт</span>';
break;
case 'ceiling_height' :
case 'ceiling_height_ot' :
case 'ceiling_height_do' :
$html = '<input name="ceiling_height_ot" type="number" placeholder="от" value="' . $filter['ploshad_k_ot'] .'" class="number text small-input no-mrg-left">';
$html .= '<span class="form-label floor-label">&nbsp;~&nbsp;</span>';
$html .= '<input name="ceiling_height_do" type="number" placeholder="до" value="' . $filter['ploshad_k_do'] .'" class="number text small-input">';
$html .= '<span class="form-label with-pad">&nbsp;м</span>';
break;
case 'commerc_year' :
case 'commerc_year_ot' :
case 'commerc_year_do' :
$html = '<input name="commerc_year_ot" type="number" placeholder="от" value="' . $filter['ploshad_k_ot'] .'" class="number text small-input no-mrg-left">';
$html .= '<span class="form-label floor-label">&nbsp;~&nbsp;</span>';
$html .= '<input name="commerc_year_do" type="number" placeholder="до" value="' . $filter['ploshad_k_do'] .'" class="number text small-input">';
break;
case 'building_area' :
case 'building_area_ot' :
case 'building_area_do' :
$html = '<input name="building_area_ot" type="number" placeholder="от" value="' . $filter['ploshad_k_ot'] .'" class="number text small-input no-mrg-left">';
$html .= '<span class="form-label floor-label">&nbsp;~&nbsp;</span>';
$html .= '<input name="building_area_do" type="number" placeholder="до" value="' . $filter['ploshad_k_do'] .'" class="number text small-input">';
break;
case 'opis' :
$html = '<textarea id="asfiltr-' . $input_id . '" name="' . $input_name . '" rows="4" class="text" style="width: 400px;">'.$filter['opis'].'</textarea>';
$wrap = false;
break;
case 'comment' :
$html = '<textarea id="asfiltr-' . $input_id . '" name="' . $input_name . '" rows="4" class="text" style="width: 400px;">'.$filter['comment'].'</textarea>';
$wrap = false;
break;
default :
$fields = self::getFields();
if (array_key_exists($field_id, $fields)) {
if ($fields[$field_id]['type'] == "text") {
$html = '<input type="text" name="' . $input_name . '" value="' . $filter[$field_id] .'" class="text no-mrg-left" />';
} if ($fields[$field_id]['type'] == "checkbox") {
$html = '<div class="checkbox small" style="margin-bottom: 0;">';
$html .= '<input id="asfiltr-' . $input_id . '" name="' . $input_name . '" type="checkbox" value="1" ' . (boolval($filter[$field_id]) ? " checked" : "") . ' />';
$html .= '<label for="asfiltr-' . $input_id . '"></label>';
$html .= '</div>';
$wrap = false;
} else if ($fields[$field_id]['type'] == "select") {
$html = '';
$list = AutoSearch::getCommonFields($field_id, $filter[$field_id]);
if ($fields[$field_id]['multiple']) {
foreach ($list as $key => $item) {
$html .= '<option data-key="'.$key.'" value="'.$item['value'].'" '. (in_array(intval($item['value']), json_decode($filter[$field_id])) ? 'selected' : '') .'>'.$item['label'].'</option>';
}
$html = '<select id="asfiltr-' . $input_id . '" name="' . $input_name . '" multiple>' . $html . '</select>';
} else {
$html .= '<option value="0" '. ((0 == $filter[$field_id]) ? 'selected' : '') .'>Не выбрано</option>';
foreach ($list as $key => $item) {
$html .= '<option data-key="'.$key.'" value="'.$item['value'].'" '. ((intval($item['value']) == $filter[$field_id]) ? 'selected' : '') .'>'.$item['label'].'</option>';
}
$html = '<select id="asfiltr-' . $input_id . '" name="' . $input_name . '">' . $html . '</select>';
}
$wrap = false;
} else if ($fields[$field_id]['type'] == "date") {
$html = '<input id="asfiltr-' . $input_id . '" name="' . $input_name . '" type="text" value="'.$filter[$field_id].'" class="datepicker-here2 text medium-input no-mrg-left">';
$wrap = false;
} else if ($fields[$field_id]['type'] == "textarea") {
$html = '<textarea id="asfiltr-' . $input_id . '" name="' . $input_name . '" rows="4" class="text" style="width: 400px;">'.$filter[$field_id].'</textarea>';
$wrap = false;
}
}
}
$label = '';
if ($with_label && isset($fields[$field_id]['label']))
$label = '<div class="form-search__main-label"><label for="asfiltr-' . $input_id . '">'.$fields[$field_id]['label'].':</label></div>';
if ($wrap) {
$html = '<div id="asfiltr-' . $input_id . '" class="input-group">' . $html . '</div>';
$html = '<div class="control-inputs">' . $html . '</div>';
} else {
$html = '<div class="control-inputs"><div class="input-group">' . $html . '</div></div>';
}
if (!empty($label)) {
return [
'label' => $label,
'input_id' => 'asfiltr-'.$input_id,
'html' => $label . $html,
'field_id' => $field_id
];
} else {
return [
'label' => $fields[$field_id]['label'],
'input_id' => 'asfiltr-'.$input_id,
'html' => $html,
'field_id' => $field_id
];
}
}
public function saveFilterFields($id = null, $user_id = null, $fields = null) {
if (is_null($id) || is_null($fields))
return null;
if (is_null($user_id))
$user_id = $this->_user['id'];
if (!is_null($user_id) && is_array($fields)) {
$query = "";
$isError = false;
$errorText = '';
foreach ($fields as $field => $value) {
if ($field == 'req_id' && self::isEmpty($value)) {
$isError = true;
$errorText .= "<p>Не указан ИД заявки</p>";
}
if ($field == 'deal_type' && self::isEmpty($value)) {
$isError = true;
$errorText .= "<p>Не указан тип сделки</p>";
}
if ($field == 'object_type' && self::isEmpty($value)) {
$isError = true;
$errorText .= "<p>Не указан тип объекта</p>";
}
if ($field == 'object_source' && self::isEmpty($value)) {
$isError = true;
$errorText .= "<p>Не указан источник поиска</p>";
}
if ($field == 'regions' && self::isEmpty($value)) {
$isError = true;
$errorText .= "<p>Не указан регион(ы)</p>";
}
if ($fields['deal_type'] == 1 && $field == 'rent_srok' && self::isEmpty($value)) {
$isError = true;
$errorText .= "<p>Не указан срок аренды</p>";
}
if ($fields['object_type'] == 4 && $field == 'category_type' && self::isEmpty($value)) {
$isError = true;
$errorText .= "<p>Не указан тип помещения</p>";
}
if ($field == 'rooms' && !is_array($value))
$value = array((string)$value);
if ($field == 'rooms' && is_array($value))
$value = array_map('strval', $value);
if ($field == 'geo' && !is_array($value))
$value = json_encode($value);
if (is_array($value)) {
$value = json_encode($value);
} else {
if ($field == 'newbilding_date')
$value = date('Y-m-d H:i:s', strtotime($value));
if ($field == 'build_year')
$value = date('Y-m-d H:i:s', strtotime($value.'-01-01'));
}
if (!empty($query))
$query .= ", `$field` = '" . $value . "'";
else
$query .= "`$field` = '" . $value . "'";
}
if (!empty($query) && !$isError) {
$sql = "UPDATE `autosearch_filters` SET $query, `updated_by` = $user_id
WHERE id=$id AND (
created_by=$user_id
OR updated_by=$user_id
OR EXISTS (
SELECT 1 FROM requisitions
WHERE requisitions.id = autosearch_filters.req_id
AND requisitions.who_work = $user_id
)
)";
if (mysql_query($sql) && $this->clearAllResults($id))
return ['success' => true, 'error' => false];
else
return ['success' => false, 'error' => mysql_error()];
} else {
return ['success' => false, 'error' => $errorText];
}
}
return false;
}
public static function getFields($reverse = false) {
if ($reverse) {
$output = [];
$fields = self::$_fields;
foreach ($fields as $field => $options) {
if (is_array($options['column'])) {
foreach ($options['column'] as $column) {
$output[$column] = array_merge($options, ['column' => $field]);
}
} else {
$key = $options['column'];
$output[$key] = array_merge($options, ['column' => $field]);
}
}
return $output;
} else {
return self::$_fields;
}
}
public static function formatRusDatetime($datetime, $year = true, $month = true, $day = true, $time = true) {
list($date, $time) = explode(" ", $datetime);
list($d, $m, $y) = explode(".", $date);
$date_tmp = "";
if ($year)
$date_tmp = $y."г";
if ($month)
$date_tmp = getRusMonth($m)." ".$date_tmp;
if ($d)
$date_tmp = $d." ".$date_tmp;
if ($time)
$date_tmp = $date_tmp. " в ".$time;
return $date_tmp;
}
public static function getCommonFields($key, $selected = false, $cond = null) {
$commons = [];
switch ($key) {
case 'deal_type' :
$DEAL_TYPES = [
1 => "Аренда",
2 => "Покупка",
3 => "Новостройки",
];
foreach($DEAL_TYPES as $key => $value) {
$commons[$key] = [
'value' => $key,
'label' => $value,
'selected' => ($key == $selected) ? true : false,
];
}
break;
case 'rooms' :
case 'rooms_counts' :
$ROOMS_COUNT = [
1 => "1 комн.",
2 => "2 комн.",
3 => "3 комн.",
4 => "4+ комн.",
5 => "Студия",
];
foreach($ROOMS_COUNT as $key => $value) {
$commons[$key] = [
'value' => $key,
'label' => $value,
'selected' => in_array($key, $selected) ? true : false,
];
}
break;
case 'object_type' :
global $OBJECT_TYPES;
foreach($OBJECT_TYPES as $key => $value) {
$commons[$key] = [
'value' => $key,
'label' => $value,
'selected' => ($key == $selected) ? true : false,
];
}
break;
case 'object_source' :
global $SEARCH_TARGETS;
foreach($SEARCH_TARGETS as $key => $value) {
if ($key == 4) // Архив собственников
continue;
$commons[$key] = [
'value' => $key,
'label' => $value,
'selected' => ($key == $selected) ? true : false,
];
}
$commons[5] = [
'value' => 5,
'label' => 'Объекты компании'
];
$commons[6] = [
'value' => 6,
'label' => 'Собственники и объекты компании'
];
break;
case 'category_type' :
$selected = array_map(function($category) { return intval($category); }, (array)$selected); //
$categories = array();
$sql = "SELECT * FROM commercial_object";
if (!is_null($cond))
$sql .= " " . $cond;
$sql .= " ORDER BY name";
$rez = mysql_query($sql);
while ($category = mysql_fetch_assoc($rez)) {
$categories[$category['id']] = $category;
}
if (!empty($categories)) {
foreach($categories as $key => $category) {
$commons[$category['id']] = [
'value' => $category['id'],
'label' => $category['name'],
'selected' => (in_array($key, $selected)) ? true : false,
];
}
}
break;
case 'rent_srok' :
global $SROK_ARENDY_ASSOC;
foreach($SROK_ARENDY_ASSOC as $key => $value) {
$commons[$key] = [
'value' => $key,
'label' => $value,
'selected' => ($key == intval($selected)) ? true : false,
];
}
break;
case 'regions' :
$regions = array();
$sql_getRegion = "SELECT rf_regions.* FROM rf_regions as parent
JOIN rf_regions ON rf_regions.parent = parent.id
LEFT JOIN users ON users.region_rf_id = parent.id
ORDER BY code ASC";
$rezRegion = mysql_query($sql_getRegion);
while ($row = mysql_fetch_assoc($rezRegion)) {
$regions[] = $row;
}
if (empty($regions)) {
$sql_getRegion = "SELECT rf_regions.* FROM rf_regions
LEFT JOIN users ON users.region_rf_id = rf_regions.id
ORDER BY code ASC";
$rezRegion = mysql_query($sql_getRegion);
while ($row = mysql_fetch_assoc($rezRegion)){
$regions[] = $row;
}
}
if (empty($regions)) {
$regions[0] = array(
'id' => 50,
'name' => 'Ленинградская обл',
'kladr' => '4700000000000',
'parent' => 2,
'code' => 47
);
$regions[1] =array(
'id' => 81,
'name' => 'Санкт-Петербург',
'kladr' => '7800000000000',
'parent' => 2,
'code' => 78
);
}
if (!empty($regions)) {
foreach($regions as $key => $region) {
$commons[$region['id']] = [
'value' => $region['id'],
'label' => $region['name'],
'selected' => ($key == intval($selected)) ? true : false,
];
}
}
break;
case 'rayons' :
$rayons = array();
$sql = "SELECT * FROM rayon";
if (!is_null($cond))
$sql .= " " . $cond;
$sql .= " ORDER BY rayon";
$rez = mysql_query($sql);
while ($rayon = mysql_fetch_assoc($rez)) {
$rayons[$rayon['id']] = $rayon;
}
if (!empty($rayons)) {
foreach($rayons as $key => $rayon) {
$commons[$rayon['id']] = [
'value' => $rayon['id'],
'label' => $rayon['rayon'],
'selected' => ($key == intval($selected)) ? true : false,
];
}
}
break;
case 'metro_stations' :
$metro = array();
$sql = "SELECT * FROM metro";
if (!is_null($cond))
$sql .= " " . $cond;
$sql .= " ORDER BY metro";
$rez = mysql_query($sql);
if (mysql_num_rows($rez) > 0) {
while ($station = mysql_fetch_assoc($rez)) {
$metro[$station['id']] = $station;
}
}
if (!empty($metro)) {
foreach($metro as $key => $rayon) {
$commons[$rayon['id']] = [
'value' => $rayon['id'],
'label' => $rayon['metro'],
'selected' => ($key == intval($selected)) ? true : false,
];
}
}
break;
/*case 'order_type' :
$orders = array();
$sql = "SELECT * FROM deal_type";
if (!is_null($cond))
$sql .= " " . $cond;
$sql .= " ORDER BY name";
$rez = mysql_query($sql);
if (mysql_num_rows($rez) > 0) {
while ($deal = mysql_fetch_assoc($rez)) {
$orders[$deal['id']] = $deal;
}
}
if (!empty($orders)) {
foreach($orders as $key => $order) {
$commons[$order['id']] = [
'value' => $order['id'],
'label' => $order['name'],
'selected' => ($key == intval($selected)) ? true : false,
];
}
}
break;*/
case 'do_metro_type' :
$commons[1] = [
'value' => 1,
'label' => 'пешком',
'selected' => ($key == intval($selected)) ? true : false,
];
$commons[2] = [
'value' => 2,
'label' => 'на транспорте',
'selected' => ($key == intval($selected)) ? true : false,
];
break;
case 'build_year' :
$range = range(date('Y', strtotime('-75 year')), date('Y'));
foreach ($range as $key) {
$commons[] = [
'value' => $key,
'label' => $key,
'selected' => ($key == intval($selected)) ? true : false,
];
}
break;
case 'house_type' :
$types = array();
$sql = "SELECT * FROM house_type";
if (!is_null($cond))
$sql .= " " . $cond; //
$sql .= " ORDER BY name";
$rez = mysql_query($sql);
while ($houseType = mysql_fetch_assoc($rez)) {
$types[$houseType['id']] = $houseType;
}
if (!empty($types)) {
foreach($types as $key => $type) {
$commons[$key] = [
'value' => $type['id'],
'label' => $type['name'],
'selected' => ($key == intval($selected)) ? true : false,
];
}
}
break;
case 'house_material' :
$materials = array();
$sql = "SELECT * FROM house_material";
if (!is_null($cond))
$sql .= " " . $cond; //
$sql .= " ORDER BY name";
$rez = mysql_query($sql);
while ($houseMaterial = mysql_fetch_assoc($rez)) {
$materials[$houseMaterial['id']] = $houseMaterial;
}
if (!empty($materials)) {
foreach($materials as $key => $material) {
$commons[$key] = [
'value' => $material['id'],
'label' => $material['name'],
'selected' => ($key == intval($selected)) ? true : false,
];
}
}
break;
case 'legal_address' :
$commons = [
1 => [
'value' => 1,
'label' => "Предоставляется",
'selected' => (1 == intval($selected)) ? true : false,
],
2 => [
'value' => 2,
'label' => "Не предоставляется",
'selected' => (2 == intval($selected)) ? true : false,
],
];
break;
case 'is_occupied' :
$commons = [
1 => [
'value' => 1,
'label' => "Не занято",
'selected' => (1 == intval($selected)) ? true : false,
],
2 => [
'value' => 2,
'label' => "Занято",
'selected' => (2 == intval($selected)) ? true : false,
],
];
break;
case 'layout_id' :
$list = array();
$sql = "SELECT * FROM layout_object";
if (!is_null($cond))
$sql .= " " . $cond; //
$sql .= " ORDER BY name";
$rez = mysql_query($sql);
while ($source = mysql_fetch_assoc($rez)) {
$list[$source['id']] = $source;
}
if (!empty($list)) {
foreach($list as $key => $item) {
$commons[$key] = [
'value' => $item['id'],
'label' => $item['name'],
'selected' => ($key == intval($selected)) ? true : false,
];
}
}
break;
case 'wet_spots' :
$commons = [
1 => [
'value' => 1,
'label' => "1",
'selected' => (1 == intval($selected)) ? true : false,
], 2 => [
'value' => 2,
'label' => "2",
'selected' => (2 == intval($selected)) ? true : false,
], 3 => [
'value' => 3,
'label' => "3",
'selected' => (3 == intval($selected)) ? true : false,
], 4 => [
'value' => 4,
'label' => "4",
'selected' => (4 == intval($selected)) ? true : false,
], 5 => [
'value' => 5,
'label' => "Нет",
'selected' => (5 == intval($selected)) ? true : false,
],
];
break;
case 'commer_condition' :
$list = array();
$sql = "SELECT * FROM `commer_condition`";
if (!is_null($cond))
$sql .= " " . $cond; //
$sql .= " ORDER BY id";
$rez = mysql_query($sql);
while ($source = mysql_fetch_assoc($rez)) {
$list[$source['id']] = $source;
}
if (!empty($list)) {
foreach($list as $key => $item) {
$commons[$key] = [
'value' => $item['id'],
'label' => $item['name'],
'selected' => ($key == intval($selected)) ? true : false,
];
}
}
break;
case 'is_furniture' :
$commons = [
1 => [
'value' => 1,
'label' => "Нет",
'selected' => (1 == intval($selected)) ? true : false,
], 2 => [
'value' => 2,
'label' => "Есть",
'selected' => (2 == intval($selected)) ? true : false,
]
];
break;
case 'commer_access' :
$commons = [
1 => [
'value' => 1,
'label' => "Свободный",
'selected' => (1 == intval($selected)) ? true : false,
], 2 => [
'value' => 2,
'label' => "Пропускная система",
'selected' => (2 == intval($selected)) ? true : false,
]
];
break;
case 'parking_id' :
case 'parking_types' :
$list = array();
$sql = "SELECT * FROM parking_type";
if (!is_null($cond))
$sql .= " " . $cond; //
$sql .= " ORDER BY id";
$rez = mysql_query($sql);
while ($source = mysql_fetch_assoc($rez)) {
$list[$source['id']] = $source;
}
if (!empty($list)) {
foreach($list as $key => $item) {
$commons[$key] = [
'value' => $item['id'],
'label' => $item['name'],
'selected' => ($key == intval($selected)) ? true : false,
];
}
}
break;
case 'vat_type_id' :
$list = array();
$sql = "SELECT * FROM vat_type";
if (!is_null($cond))
$sql .= " " . $cond; //
$sql .= " ORDER BY id";
$rez = mysql_query($sql);
while ($source = mysql_fetch_assoc($rez)) {
$list[$source['id']] = $source;
}
if (!empty($list)) {
foreach($list as $key => $item) {
$commons[$key] = [
'value' => $item['id'],
'label' => $item['name'],
'selected' => ($key == intval($selected)) ? true : false,
];
}
}
break;
case 'floor_material_id' :
$list = array();
$sql = "SELECT * FROM floor_material";
if (!is_null($cond))
$sql .= " " . $cond; //
$sql .= " ORDER BY id";
$rez = mysql_query($sql);
while ($source = mysql_fetch_assoc($rez)) {
$list[$source['id']] = $source;
}
if (!empty($list)) {
foreach($list as $key => $item) {
$commons[$key] = [
'value' => $item['id'],
'label' => $item['name'],
'selected' => ($key == intval($selected)) ? true : false,
];
}
}
break;
case 'commerc_portal_id' :
$list = array();
$sql = "SELECT * FROM commerc_portal";
if (!is_null($cond))
$sql .= " " . $cond; //
$sql .= " ORDER BY id";
$rez = mysql_query($sql);
while ($source = mysql_fetch_assoc($rez)) {
$list[$source['id']] = $source;
}
if (!empty($list)) {
foreach($list as $key => $item) {
$commons[$key] = [
'value' => $item['id'],
'label' => $item['name'],
'selected' => ($key == intval($selected)) ? true : false,
];
}
}
break;
case 'commerc_purpose' :
$list = array();
$sql = "SELECT * FROM commerc_purpose";
if (!is_null($cond))
$sql .= " " . $cond; //
$sql .= " ORDER BY name";
$rez = mysql_query($sql);
while ($source = mysql_fetch_assoc($rez)) {
$list[$source['id']] = $source;
}
if (!empty($list)) {
foreach($list as $key => $item) {
$commons[$key] = [
'value' => $item['id'],
'label' => $item['name'],
'selected' => ($key == intval($selected)) ? true : false,
];
}
}
break;
case 'commerc_land_category_id' :
$list = array();
$sql = "SELECT * FROM commerc_land_category";
if (!is_null($cond))
$sql .= " " . $cond; //
$sql .= " ORDER BY id";
$rez = mysql_query($sql);
while ($source = mysql_fetch_assoc($rez)) {
$list[$source['id']] = $source;
}
if (!empty($list)) {
foreach($list as $key => $item) {
$commons[$key] = [
'value' => $item['id'],
'label' => $item['name'],
'selected' => ($key == intval($selected)) ? true : false,
];
}
}
break;
case 'commerc_permitted_use_id' :
$list = array();
$sql = "SELECT * FROM commerc_permitted_use";
if (!is_null($cond))
$sql .= " " . $cond; //
$sql .= " ORDER BY id";
$rez = mysql_query($sql);
while ($source = mysql_fetch_assoc($rez)) {
$list[$source['id']] = $source;
}
if (!empty($list)) {
foreach($list as $key => $item) {
$commons[$key] = [
'value' => $item['id'],
'label' => $item['name'],
'selected' => ($key == intval($selected)) ? true : false,
];
}
}
break;
case 'commerc_electricity_id' :
$list = array();
$sql = "SELECT * FROM commerc_electricity";
if (!is_null($cond))
$sql .= " " . $cond; //
$sql .= " ORDER BY id";
$rez = mysql_query($sql);
while ($source = mysql_fetch_assoc($rez)) {
$list[$source['id']] = $source;
}
if (!empty($list)) {
foreach($list as $key => $item) {
$commons[$key] = [
'value' => $item['id'],
'label' => $item['name'],
'selected' => ($key == intval($selected)) ? true : false,
];
}
}
break;
case 'commerc_gas_id' :
$list = array();
$sql = "SELECT * FROM commerc_gas";
if (!is_null($cond))
$sql .= " " . $cond; //
$sql .= " ORDER BY id";
$rez = mysql_query($sql);
while ($source = mysql_fetch_assoc($rez)) {
$list[$source['id']] = $source;
}
if (!empty($list)) {
foreach($list as $key => $item) {
$commons[$key] = [
'value' => $item['id'],
'label' => $item['name'],
'selected' => ($key == intval($selected)) ? true : false,
];
}
}
break;
case 'commerc_water_id' :
$list = array();
$sql = "SELECT * FROM commerc_gas";
if (!is_null($cond))
$sql .= " " . $cond; //
$sql .= " ORDER BY id";
$rez = mysql_query($sql);
while ($source = mysql_fetch_assoc($rez)) {
$list[$source['id']] = $source;
}
if (!empty($list)) {
foreach($list as $key => $item) {
$commons[$key] = [
'value' => $item['id'],
'label' => $item['name'],
'selected' => ($key == intval($selected)) ? true : false,
];
}
}
break;
case 'commerc_sewage_id' :
$list = array();
$sql = "SELECT * FROM commerc_gas";
if (!is_null($cond))
$sql .= " " . $cond; //
$sql .= " ORDER BY id";
$rez = mysql_query($sql);
while ($source = mysql_fetch_assoc($rez)) {
$list[$source['id']] = $source;
}
if (!empty($list)) {
foreach($list as $key => $item) {
$commons[$key] = [
'value' => $item['id'],
'label' => $item['name'],
'selected' => ($key == intval($selected)) ? true : false,
];
}
}
break;
case 'commerc_driveways' :
$list = array();
$sql = "SELECT * FROM commerc_driveways";
if (!is_null($cond))
$sql .= " " . $cond; //
$sql .= " ORDER BY id";
$rez = mysql_query($sql);
while ($source = mysql_fetch_assoc($rez)) {
$list[$source['id']] = $source;
}
if (!empty($list)) {
foreach($list as $key => $item) {
$commons[$key] = [
'value' => $item['id'],
'label' => $item['name'],
'selected' => ($key == intval($selected)) ? true : false,
];
}
}
break;
case 'commerc_building_type_id' :
$list = array();
$sql = "SELECT * FROM commerc_building_type";
if (!is_null($cond))
$sql .= " " . $cond; //
$sql .= " ORDER BY id";
$rez = mysql_query($sql);
while ($source = mysql_fetch_assoc($rez)) {
$list[$source['id']] = $source;
}
if (!empty($list)) {
foreach($list as $key => $item) {
$commons[$key] = [
'value' => $item['id'],
'label' => $item['name'],
'selected' => ($key == intval($selected)) ? true : false,
];
}
}
break;
case 'commerc_building_class_id' :
$list = array();
$sql = "SELECT * FROM commerc_building_class";
if (!is_null($cond))
$sql .= " " . $cond; //
$sql .= " ORDER BY id";
$rez = mysql_query($sql);
while ($source = mysql_fetch_assoc($rez)) {
$list[$source['id']] = $source;
}
if (!empty($list)) {
foreach($list as $key => $item) {
$commons[$key] = [
'value' => $item['id'],
'label' => $item['name'],
'selected' => ($key == intval($selected)) ? true : false,
];
}
}
break;
case 'commerc_houseline_type_id' :
$list = array();
$sql = "SELECT * FROM commerc_houselinetype";
if (!is_null($cond))
$sql .= " " . $cond; //
$sql .= " ORDER BY id";
$rez = mysql_query($sql);
while ($source = mysql_fetch_assoc($rez)) {
$list[$source['id']] = $source;
}
if (!empty($list)) {
foreach($list as $key => $item) {
$commons[$key] = [
'value' => $item['id'],
'label' => $item['name'],
'selected' => ($key == intval($selected)) ? true : false,
];
}
}
break;
case 'commerc_building_category_id' :
$list = array();
$sql = "SELECT * FROM commerc_building_category";
if (!is_null($cond))
$sql .= " " . $cond; //
$sql .= " ORDER BY id";
$rez = mysql_query($sql);
while ($source = mysql_fetch_assoc($rez)) {
$list[$source['id']] = $source;
}
if (!empty($list)) {
foreach($list as $key => $item) {
$commons[$key] = [
'value' => $item['id'],
'label' => $item['name'],
'selected' => ($key == intval($selected)) ? true : false,
];
}
}
break;
case 'commerc_opened_id' :
$list = array();
$sql = "SELECT * FROM commerc_opened";
if (!is_null($cond))
$sql .= " " . $cond; //
$sql .= " ORDER BY id";
$rez = mysql_query($sql);
while ($source = mysql_fetch_assoc($rez)) {
$list[$source['id']] = $source;
}
if (!empty($list)) {
foreach($list as $key => $item) {
$commons[$key] = [
'value' => $item['id'],
'label' => $item['name'],
'selected' => ($key == intval($selected)) ? true : false,
];
}
}
break;
case 'commerc_building_ventilation' :
$commons = [
1 => [
'value' => 1,
'label' => "Естественная",
'selected' => (1 == intval($selected)) ? true : false,
],
2 => [
'value' => 2,
'label' => "Приточная",
'selected' => (2 == intval($selected)) ? true : false,
],
];
break;
case 'commerc_building_conditioning' :
$commons = [
1 => [
'value' => 1,
'label' => "Местное",
'selected' => (1 == intval($selected)) ? true : false,
],
2 => [
'value' => 2,
'label' => "Центральное",
'selected' => (2 == intval($selected)) ? true : false,
],
];
break;
case 'commerc_building_heating' :
$commons = [
1 => [
'value' => 1,
'label' => "Автономное",
'selected' => (1 == intval($selected)) ? true : false,
],
2 => [
'value' => 2,
'label' => "Центральное",
'selected' => (2 == intval($selected)) ? true : false,
],
];
break;
case 'commerc_building_fire' :
$commons = [
1 => [
'value' => 1,
'label' => "Гидрантная",
'selected' => (1 == intval($selected)) ? true : false,
],
2 => [
'value' => 2,
'label' => "Спринклерная",
'selected' => (2 == intval($selected)) ? true : false,
],
3 => [
'value' => 3,
'label' => "Порошковая",
'selected' => (2 == intval($selected)) ? true : false,
],
4 => [
'value' => 4,
'label' => "Газовая",
'selected' => (2 == intval($selected)) ? true : false,
],
5 => [
'value' => 5,
'label' => "Сигнализация",
'selected' => (2 == intval($selected)) ? true : false,
]
];
break;
case 'garage_type_id' :
$list = array();
$sql = "SELECT * FROM garage_type";
if (!is_null($cond))
$sql .= " " . $cond; //
$sql .= " ORDER BY id";
$rez = mysql_query($sql);
while ($source = mysql_fetch_assoc($rez)) {
$list[$source['id']] = $source;
}
if (!empty($list)) {
foreach($list as $key => $item) {
$commons[$key] = [
'value' => $item['id'],
'label' => $item['name'],
'selected' => ($key == intval($selected)) ? true : false,
];
}
}
break;
case 'garage_vid_id' :
$list = array();
$sql = "SELECT * FROM garage_vid";
if (!is_null($cond))
$sql .= " " . $cond; //
$sql .= " ORDER BY id";
$rez = mysql_query($sql);
while ($source = mysql_fetch_assoc($rez)) {
$list[$source['id']] = $source;
}
if (!empty($list)) {
foreach($list as $key => $item) {
$commons[$key] = [
'value' => $item['id'],
'label' => $item['name'],
'selected' => ($key == intval($selected)) ? true : false,
];
}
}
break;
case 'boks_vid_id' :
$commons = [
1 => [
'value' => 1,
'label' => "Кирпичный",
'selected' => (1 == intval($selected)) ? true : false,
],
2 => [
'value' => 2,
'label' => "Металлический",
'selected' => (2 == intval($selected)) ? true : false,
]
];
break;
case 'commerc_status_id' :
$list = array();
$sql = "SELECT * FROM commerc_status";
if (!is_null($cond))
$sql .= " " . $cond; //
$sql .= " ORDER BY id";
$rez = mysql_query($sql);
while ($source = mysql_fetch_assoc($rez)) {
$list[$source['id']] = $source;
}
if (!empty($list)) {
foreach($list as $key => $item) {
$commons[$key] = [
'value' => $item['id'],
'label' => $item['name'],
'selected' => ($key == intval($selected)) ? true : false,
];
}
}
break;
case 'commerc_specifications' :
$list = array();
$sql = "SELECT * FROM commerc_specifications";
if (!is_null($cond))
$sql .= " " . $cond; //
$sql .= " ORDER BY id";
$rez = mysql_query($sql);
while ($source = mysql_fetch_assoc($rez)) {
$list[$source['id']] = $source;
}
if (!empty($list)) {
foreach($list as $key => $item) {
$commons[$key] = [
'value' => $item['id'],
'label' => $item['name'],
'selected' => ($key == intval($selected)) ? true : false,
];
}
}
break;
case 'commerc_infrastructure' :
$list = array();
$sql = "SELECT * FROM commerc_infrastructure";
if (!is_null($cond))
$sql .= " " . $cond; //
$sql .= " ORDER BY id";
$rez = mysql_query($sql);
while ($source = mysql_fetch_assoc($rez)) {
$list[$source['id']] = $source;
}
if (!empty($list)) {
foreach($list as $key => $item) {
$commons[$key] = [
'value' => $item['id'],
'label' => $item['name'],
'selected' => ($key == intval($selected)) ? true : false,
];
}
}
break;
}
return $commons;
}
public static function getFormattedValue($key, $value) {
switch ($key) {
case 'deal_type' :
$commons = AutoSearch::getCommonFields('deal_type');
$value = isset($commons[$value]) ? $commons[$value]['label'] : $value;
break;
case 'object_type' :
$commons = AutoSearch::getCommonFields('object_type');
$value = isset($commons[$value]) ? $commons[$value]['label'] : $value;
break;
case 'category_type' :
$commons = AutoSearch::getCommonFields('category_type');
$value = isset($commons[$value]) ? $commons[$value]['label'] : $value;
break;
case 'rent_srok' :
$commons = AutoSearch::getCommonFields('rent_srok');
$value = isset($commons[$value]) ? $commons[$value]['label'] : $value;
break;
case 'regions' :
$commons = AutoSearch::getCommonFields('regions');
$list = '';
foreach (json_decode($value) as $val) {
if (isset($commons[$val])) {
if (!empty($list))
$list .= ', ' . $commons[$val]['label'];
else
$list .= $commons[$val]['label'];
}
}
$value = !empty($list) ? $list : $value;
break;
case 'stoim' :
case 'parking_price' :
$value = $value . ' руб.';
break;
case 'ceiling_height' :
case 'ceiling_height_ot' :
case 'ceiling_height_do' :
$value = $value . ' м.';
break;
case 'el_power' :
case 'el_power_ot' :
case 'el_power_do' :
$value = $value . ' кВт';
break;
case 'commerc_lift1' :
case 'commerc_lift2' :
case 'commerc_lift3' :
case 'commerc_crane1' :
case 'commerc_crane2' :
case 'commerc_crane3' :
case 'commerc_crane4' :
$value = $value . ' шт';
break;
case 'lift1_carrying' :
case 'lift2_carrying' :
case 'lift3_carrying' :
case 'crane1_carrying' :
case 'crane2_carrying' :
case 'crane3_carrying' :
case 'crane4_carrying' :
$value = $value . ' т';
break;
case 'commerc_site' :
$value = $value . ' га';
break;
case 'do_metro_type' :
$commons = AutoSearch::getCommonFields('do_metro_type');
$value = isset($commons[$value]) ? $commons[$value]['label'] : $value;
break;
/*case 'order_type' :
$commons = AutoSearch::getCommonFields('order_type');
$value = isset($commons[$value]) ? $commons[$value]['label'] : $value;
break;*/
case 'parking_id' :
$commons = AutoSearch::getCommonFields('parking_id');
$value = isset($commons[$value]) ? $commons[$value]['label'] : $value;
break;
case 'rayons' :
$commons = AutoSearch::getCommonFields('rayons');
$list = '';
foreach (json_decode($value) as $val) {
if (isset($commons[$val])) {
if (!empty($list))
$list .= ', ' . $commons[$val]['label'];
else
$list .= $commons[$val]['label'];
}
}
$value = !empty($list) ? $list : $value;
break;
case 'metro_stations' :
$commons = AutoSearch::getCommonFields('metro_stations');
$list = '';
foreach (json_decode($value) as $val) {
if (isset($commons[$val])) {
if (!empty($list))
$list .= ', ' . $commons[$val]['label'];
else
$list .= $commons[$val]['label'];
}
}
$value = !empty($list) ? $list : $value;
break;
case 'rooms' :
$commons = AutoSearch::getCommonFields('rooms');
$list = '';
foreach (json_decode($value) as $val) {
if (isset($commons[$val])) {
if (!empty($list))
$list .= ', ' . $commons[$val]['label'];
else
$list .= $commons[$val]['label'];
}
}
$value = !empty($list) ? $list : $value;
break;
case 'newbilding_date' :
$value = 'не позднее '. $value . 'г.';
break;
case 'build_year' :
$value = 'не старше '. $value . 'г.';
break;
case 'stoim_ot' :
case 'stoim_do' :
$value = number_format($value,0 , '.', ' ') . ' руб.';
break;
case 'sq_all' :
case 'sq_all_ot' :
case 'sq_all_do' :
case 'ploshad_k' :
case 'ploshad_k_ot' :
case 'ploshad_k_do' :
case 'building_area' :
case 'building_area_ot' :
case 'building_area_do' :
$value = $value . ' кв.м';
break;
case 'ipoteka' :
case 'use_area_price':
case 'voen_ipoteka' :
case 'subsidya' :
case 'mather_kapital' :
case 'parking_price_free' :
case 'etazhnost' :
case 'is_occupied' :
case 'can_electricity' :
case 'can_gas' :
case 'can_water' :
case 'can_sewage' :
case 'commerc_owned1' :
case 'commerc_owned2' :
$value = boolval($value) ? 'да' : 'нет';
break;
case 'house_type' :
$commons = AutoSearch::getCommonFields('house_type');
$value = isset($commons[$value]) ? $commons[$value]['label'] : $value;
break;
case 'house_material' :
$commons = AutoSearch::getCommonFields('house_material');
$value = isset($commons[$value]) ? $commons[$value]['label'] : $value;
break;
default :
$fields = self::getFields();
if (array_key_exists($key, $fields)) {
if ($commons = AutoSearch::getCommonFields($key)) {
if (is_array($value)) {
$list = '';
foreach ($value as $val) {
if (isset($commons[$val])) {
if (!empty($list))
$list .= ', ' . $commons[$val]['label'];
else
$list .= $commons[$val]['label'];
}
}
$value = !empty($list) ? $list : $value;
} else if ($fields[$key]['type'] == 'select' && $fields[$key]['multiple']) {
$list = '';
$values = json_decode($value);
foreach ($values as $val) {
if (isset($commons[$val])) {
if (!empty($list))
$list .= ', ' . $commons[$val]['label'];
else
$list .= $commons[$val]['label'];
}
}
$value = !empty($list) ? $list : $value;
} else if ($fields[$key]['type'] == 'select') {
if ($fields[$key]['multiple']) {
$list = '';
$values = json_decode($value);
foreach ($values as $val) {
if (isset($commons[$val])) {
if (!empty($list))
$list .= ', ' . $commons[$val]['label'];
else
$list .= $commons[$val]['label'];
}
}
$value = !empty($list) ? $list : $value;
} else {
$value = (!empty($commons[$value]['label'])) ? $commons[$value]['label'] : $value;
}
} else if (isset($commons[$value])) {
$value = $commons[$value]['label'];
}
}
}
break;
}
return $value;
}
public function isEmpty($value = false) {
if (is_array($value)) {
if (count($value) > 0)
return false;
else
return true;
} else {
if (
!empty($value) &&
!is_null($value) &&
strtolower($value) !== "null" &&
strtolower($value) !== "false" &&
$value !== '0' &&
$value !== "Array" &&
$value !== "[]" &&
boolval($value)
)
return false;
else
return true;
}
}
public function getFilterInfo($filter = null, $extended = false, $noEmpty = true) {
if (!is_array($filter) && !is_null($this->_filter))
$filter = $this->_filter;
if (is_array($filter)) {
$info = [];
$fields = self::getFields();
foreach ($filter as $key => $value) {
if (in_array($key, ['build_year', 'newbilding_date']) && in_array($value, ['0000-00-00 00:00:00', '0000-00-00', '1970-01-01 00:00:00', '1970-01-01', '00.00.0000 00:00:00', '00.00.0000', '01.01.1970 00:00:00', '01.01.1970', '1970'])) {
$filter[$key] = null;
continue;
}
if ($noEmpty)
$proceed = !self::isEmpty($value);
else
$proceed = true;
if (
isset($fields[$key]['label']) && $proceed
) {
if ($key == "stoim_ot" && ($noEmpty && !self::isEmpty($filter['stoim_do']))) {
$key = "stoim";
$value2 = $filter['stoim_do'];
$value = $value . ' "~" ' . $value2;
$filter[$key] = $value;
}
if (isset($filter['stoim']) && $key == 'stoim_do')
continue;
if ($key == "komn_ot" && ($noEmpty && !self::isEmpty($filter['komn_do']))) {
$key = "komn";
$value2 = $filter['komn_do'];
$value = $value . ' "~" ' . $value2;
$filter[$key] = $value;
}
if (isset($filter['komn']) && $key == 'komn_do')
continue;
if ($key == "sq_all_ot" && ($noEmpty && !self::isEmpty($filter['sq_all_do']))) {
$key = "sq_all";
$value2 = $filter['sq_all_do'];
$value = $value . ' "~" ' . $value2;
$filter[$key] = $value;
}
if (isset($filter['sq_all']) && $key == 'sq_all_do')
continue;
if ($key == "ploshad_k_ot" && ($noEmpty && !self::isEmpty($filter['ploshad_k_do']))) {
$key = "ploshad_k";
$value2 = $filter['ploshad_k_do'];
$value = $value . ' "~" ' . $value2;
$filter[$key] = $value;
}
if (isset($filter['category_type']) && $key == 'category_type') {
$value = json_decode($value, true);
if (count($value)) {
$sql = "SELECT `name` FROM commercial_object WHERE id IN (". implode(', ', $value) .")";
$rez = mysql_query($sql);
$value = [];
while ($category = mysql_fetch_assoc($rez)) {
$value[] = $category['name'];
}
$value = implode(', ', $value);
}
}
if (isset($filter['ploshad_k']) && $key == 'ploshad_k_do')
continue;
if ($key == "etazh_ot" && ($noEmpty && !self::isEmpty($filter['etazh_do']))) {
$key = "etazh";
$value2 = $filter['etazh_do'];
$value = $value . ' ~ ' . $value2;
$filter[$key] = $value;
}
if (isset($filter['etazh']) && $key == 'etazh_do')
continue;
if ($key == "etazhnost_ot" && ($noEmpty && !self::isEmpty($filter['etazhnost_do']))) {
$key = "etazh_all";
$value2 = $filter['etazhnost_do'];
$value = $value . ' ~ ' . $value2;
$filter[$key] = $value;
}
if (isset($filter['etazh_all']) && $key == 'etazhnost_do')
continue;
if ($key == "el_power_ot" && ($noEmpty && !self::isEmpty($filter['el_power_do']))) {
$key = "el_power";
$value2 = $filter['el_power_do'];
$value = $value . ' ~ ' . $value2;
$filter[$key] = $value;
}
if (isset($filter['el_power']) && $key == 'el_power_do')
continue;
if ($key == "el_power_ot" && ($noEmpty && !self::isEmpty($filter['el_power_do']))) {
$key = "el_power";
$value2 = $filter['el_power_do'];
$value = $value . ' ~ ' . $value2;
$filter[$key] = $value;
}
if (isset($filter['el_power']) && $key == 'el_power_do')
continue;
if ($key == "ceiling_height_ot" && ($noEmpty && !self::isEmpty($filter['ceiling_height_do']))) {
$key = "ceiling_height";
$value2 = $filter['ceiling_height_do'];
$value = $value . ' ~ ' . $value2;
$filter[$key] = $value;
}
if (isset($filter['ceiling_height']) && $key == 'ceiling_height_do')
continue;
if ($key == "commerc_year_ot" && ($noEmpty && !self::isEmpty($filter['commerc_year_do']))) {
$key = "commerc_year";
$value2 = $filter['commerc_year_do'];
$value = $value . ' ~ ' . $value2;
$filter[$key] = $value;
}
if (isset($filter['commerc_year']) && $key == 'commerc_year_do')
continue;
if ($key == "building_area_ot" && ($noEmpty && !self::isEmpty($filter['building_area_do']))) {
$key = "building_area";
$value2 = $filter['building_area_do'];
$value = $value . ' ~ ' . $value2;
$filter[$key] = $value;
}
if (isset($filter['building_area']) && $key == 'building_area_do')
continue;
if ($key == "do_metro" && ($noEmpty && !self::isEmpty($filter['do_metro_type']))) {
$key = "do_metro";
$value = $value . ' мин. ' . self::getFormattedValue('do_metro_type', $filter['do_metro_type']);
$filter[$key] = $value;
}
if (isset($filter['do_metro']) && $key == 'do_metro_type')
continue;
$label = $fields[$key]['label'];
$value = self::getFormattedValue($key, $value);
if (!empty($value)) {
if ($extended) {
$info[$key] = [
'id' => $key,
'label' => $label,
'value' => $value
];
} else {
$info[$label] = $value;
}
}
}
if ($key == 'geo' && !empty($filter['geo'])) {
$geo = (array)json_decode($filter['geo'], true);
$geo = array_filter(array_map(function($item) {
return !empty($item);
}, $geo));
$value = declOfNum(count($geo), ['%d уточнение', '%d уточнения', '%d уточнений']);
$info['geo'] = [
'id' => $key,
'label' => 'Гео',
'value' => $value
];
}
}
return $info;
}
return null;
}
public function unsetFilterField($id = null, $user_id = null, $field_id = null) {
if (is_null($id))
return null;
if (is_null($user_id))
$user_id = $this->_user['id'];
$sql = "UPDATE `autosearch_filters` SET `$field_id` = NULL
WHERE `id` = '$id' AND (
`created_by` = $user_id
OR `updated_by` = $user_id
OR EXISTS (
SELECT 1 FROM requisitions
WHERE requisitions.id = autosearch_filters.req_id
AND requisitions.who_work = $user_id
)) LIMIT 1";
if (mysql_query($sql) && $this->clearAllResults($id))
return true;
else
return mysql_error();
}
private function processGeoData($geo = null, $geopoly2d = false) {
$geo_data = [];
/*if ($_SESSION['id'] == 6635)
var_export([$geo, $geopoly2d]) && die();*/
if (!is_null($geo)) {
if (!empty($geo[0])) {
$cords = '';
if ($geopoly2d) {
$poly = explode(' ', trim($geo[0]));
foreach($poly as $cord) {
$cords .= $cord . ",";
}
$cords = str_replace(',,', ',', $cords);
} else {
$i = 1;
$poly = explode(',', trim($geo[0]));
foreach($poly as $cord) {
if ((boolean)($i % 2))
$cords .= $cord . " ";
else
$cords .= $cord . ", ";
$i++;
}
$cords = ltrim(rtrim($cords, ', '), ',');
}
if (!empty($cords))
$geo_data["poly1"] = $cords;
}
if (!empty($geo[1])) {
$cords = '';
if ($geopoly2d) {
$poly = explode(' ', trim($geo[1]));
foreach($poly as $cord) {
$cords .= $cord . ",";
}
$cords = str_replace(',,', ',', $cords);
} else {
$i = 1;
$poly = explode(',', trim($geo[1]));
foreach ($poly as $cord) {
if ((boolean)($i % 2))
$cords .= $cord . " ";
else
$cords .= $cord . ", ";
$i++;
}
$cords = ltrim(rtrim($cords, ', '), ',');
}
if (!empty($cords))
$geo_data["poly2"] = $cords;
}
if (!empty($geo[2])) {
$cords = '';
if ($geopoly2d) {
$poly = explode(' ', trim($geo[2]));
foreach($poly as $cord) {
$cords .= $cord . ",";
}
$cords = str_replace(',,', ',', $cords);
} else {
$i = 1;
$poly = explode(',', trim($geo[2]));
foreach($poly as $cord) {
if ((boolean)($i % 2))
$cords .= $cord . " ";
else
$cords .= $cord . ", ";
$i++;
}
$cords = ltrim(rtrim($cords, ', '), ',');
}
if (!empty($cords))
$geo_data["poly3"] = $cords;
}
if (!empty($geo[3])) {
$cords = '';
if ($geopoly2d) {
$poly = explode(' ', trim($geo[3]));
foreach($poly as $cord) {
$cords .= $cord . ",";
}
$cords = str_replace(',,', ',', $cords);
} else {
$i = 1;
$poly = explode(',', trim($geo[3]));
foreach($poly as $cord) {
if ((boolean)($i % 2))
$cords .= $cord . " ";
else
$cords .= $cord . ", ";
$i++;
}
$cords = ltrim(rtrim($cords, ', '), ',');
}
if (!empty($cords))
$geo_data["poly4"] = $cords;
}
}
return $geo_data;
}
public function addEditFilter($id = null, $post = null, $newReq = true, $onlyReverse = false) {
// var_dump($post['category_type']);die;
/*if ($_SESSION['id'] == 5427) {
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', 1);
}*/
if (is_null($post))
return null;
if ($post['newbilding_date'] && !empty($post['newbilding_date']) && $post['newbilding_date'] != "0" && strtoupper($post['newbilding_date']) != "NULL")
$post['newbilding_date'] = date('Y-m-d 00:00:00', strtotime($post['newbilding_date']));
else
$post['newbilding_date'] = 'NULL';
if ($post['build_year'] && !empty($post['build_year']) && $post['build_year'] != "0" && strtoupper($post['build_year']) != "NULL")
$post['build_year'] = $post['build_year'] . "-01-01";
else
$post['build_year'] = 'NULL';
$req_id = intval($post['req_id']);
if ($req_id == 0) {
$post['req_id'] = 'NULL';
$newReq = true;
} else {
$newReq = false;
}
$oldValues = [];
$deleteAll = false;
$fields = $this->getFields(false);
if (intval($id) > 0) {
$oldValues = $this->getFilter($id, $_SESSION['id'], false, false);
}
foreach ($post as $key => $value) {
if ($key == 'geo' || $key == 'rooms' || $key == 'category_type')
continue;
if (intval($id) > 0) {
if (!is_null($fields[$key]['main_field']) || !is_null($oldValues[$key])) {
if ($fields[$key]['main_field'] && $value !== $oldValues[$key]) {
$deleteAll = true;
}
}
}
if ($key === 'is_active' || $key === 'telegram_notify') {
$post[$key] = "'" . intval($value) . "'";
} else {
if ($this->isEmpty($value)) {
$post[$key] = 'NULL';
} else {
$post[$key] = "'" . $post[$key] . "'";
}
}
}
$isError = false;
$errorText = '';
if (self::isEmpty($post['deal_type'])) {
$isError = true;
$errorText .= "\r\n<p>Не указан тип сделки</p>";
}
if (self::isEmpty($post['object_type'])) {
$isError = true;
$errorText .= "\r\n<p>Не указан тип объекта</p>";
}
if (!is_null($this->_user) && $this->_user->can('autosearch')){
if (self::isEmpty($post['object_source'])) {
$isError = true;
$errorText .= "\r\n<p>Не указан источник поиска</p>";
}
}
if (self::isEmpty($post['regions'])) {
$isError = true;
$errorText .= "\r\n<p>Не указан регион(ы)</p>";
}
if ($post['deal_type'] == 1 && self::isEmpty($post['rent_srok'])) {
$isError = true;
$errorText .= "\r\n<p>Не указан срок аренды</p>";
}
if ($post['object_type'] == 4 && self::isEmpty($post['category_type'])) {
$isError = true;
$errorText .= "\r\n<p>Не указан тип помещения</p>";
}
$user_id = $_SESSION['id'];
if (!$isError) {
$values = [];
$fields_list = [
'deal_type',
'object_type',
'object_source',
'category_type',
'stoim_ot',
'stoim_do',
'komn_ot',
'komn_do',
'sq_all_ot',
'sq_all_do',
'ploshad_k_ot',
'ploshad_k_do',
'rent_srok',
'regions',
'rayons',
'metro_stations',
'do_metro',
'do_metro_type',
'etazhnost',
'newbilding_date',
'ipoteka',
'use_area_price',
'voen_ipoteka',
'subsidya',
'mather_kapital',
'house_type',
'house_material',
'build_year',
'tax_number',
'legal_address',
'etazh_ot',
'etazh_do',
'etazhnost_ot',
'etazhnost_do',
'is_occupied',
'layout_id',
'wet_spots',
'el_power_ot',
'el_power_do',
'commer_condition',
'is_furniture',
'commer_access',
'parking_types',
'parking_id',
'parking_price',
'parking_price_free',
'ceiling_height_ot',
'ceiling_height_do',
'column_grid',
'vat_type_id',
'commerc_site',
'commerc_owned1',
'commerc_owned2',
'floor_material_id',
'commerc_portal_id',
'commerc_purpose',
'commerc_land_category_id',
'commerc_permitted_use_id',
'commerc_electricity_id',
'can_electricity',
'commerc_gas_id',
'can_gas',
'commerc_water_id',
'can_water',
'commerc_sewage_id',
'can_sewage',
'commerc_driveways',
'commerc_year_ot',
'commerc_year_do',
'commerc_building_type_id',
'commerc_building_class_id',
'building_area_ot',
'building_area_do',
'commerc_houseline_type_id',
'commerc_building_category_id',
'commerc_opened_id',
'commerc_building_ventilation',
'commerc_building_conditioning',
'commerc_building_heating',
'commerc_building_fire',
'garage_type_id',
'garage_vid_id',
'boks_vid_id',
'commerc_status_id',
'commerc_specifications',
'commerc_infrastructure',
'commerc_infrastructure1',
'commerc_infrastructure2',
'commerc_lift1',
'lift1_carrying',
'commerc_lift2',
'lift2_carrying',
'commerc_lift3',
'lift3_carrying',
'commerc_crane1',
'crane1_carrying',
'commerc_crane2',
'crane2_carrying',
'commerc_crane3',
'crane3_carrying',
'commerc_crane4',
'crane4_carrying',
'opis',
'comment',
'is_active',
'telegram_notify',
'geo',
];
if (intval($id) > 0) {
// Сбрасываем параметры района и метро, если переданы гео-уточнения
if (isset($post['geo'])) {
unset($post['rayons']);
unset($post['metro_stations']);
unset($post['do_metro']);
unset($post['do_metro_type']);
}
foreach ($fields_list as $field_name) {
if ($field_name == 'req_id' || $field_name == 'rooms' || $field_name == 'geo' || $field_name == 'category_type')
continue;
if (isset($post[$field_name])) {
$values[] = "`$field_name` = {$post[$field_name]}";
} else {
$values[] = "`$field_name` = NULL";
}
}
if (isset($post['geo'])) {
$geo_data = $this->processGeoData($post['geo']);
$values[] = "`geo` = '" . json_encode($geo_data, JSON_UNESCAPED_UNICODE) . "'";
$values[] = "`rayons` = NULL";
$values[] = "`metro_stations` = NULL";
$values[] = "`do_metro` = NULL";
$values[] = "`do_metro_type` = NULL";
} else {
$values[] = "`geo` = NULL";
}
if (isset($post['rooms']) && $post['rooms'] != 'null')
$values[] = "`rooms` = '" . json_encode(array_map('strval', $post['rooms']), JSON_UNESCAPED_UNICODE) . "'";
else
$values[] = "`rooms` = NULL";
if (isset($post['category_type']) && $post['category_type'] != 'null')
$values[] = "`category_type` = '" . json_encode(array_map('intval', $post['category_type']), JSON_UNESCAPED_UNICODE) . "'";
else
$values[] = "`category_type` = NULL";
$values[] = "`updated_by` = '$user_id'";
if ($onlyReverse) {
$values[] = "`is_search` = '0'";
$values[] = "`is_reverse` = '1'";
} else {
$values[] = "`is_search` = '1'";
$values[] = "`is_reverse` = '1'";
}
$values = array_unique($values);
$sql = "UPDATE `autosearch_filters` SET " . implode(',', $values) . " WHERE `id` = '$id'";
if (isset($post['req_id']) && is_string($post['req_id']))
$sql .= " AND `req_id` = $post[req_id]";
else if (isset($post['req_id']))
$sql .= " AND `req_id` = '$req_id'";
else if ($newReq)
$sql .= " AND `req_id` IS NULL";
$agents_ids = [];
if ($user_id) {
$agency_id = User::getUserAgencyID();
$agents_ids[] = $agency_id;
$sql_users = "SELECT id FROM users WHERE id in (select id from users where id=$agency_id or id_manager=$agency_id or id_manager in
(select id from users where id_manager=$agency_id or id_manager in
(select id from users where id_manager=$agency_id)))";
$query = mysql_query($sql_users);
while ($row = mysql_fetch_assoc($query)) {
$agents_ids[] = (int)$row['id'];
}
$agents_ids = array_merge($agents_ids, [$user_id]);
$agents_ids = array_unique($agents_ids);
}
if (!empty($agents_ids))
//$sql .= " AND (`created_by` IN (".implode(',', $agents_ids).") OR `updated_by` IN (".implode(',', $agents_ids).")) LIMIT 1";
$sql .= " AND (
`created_by` IN (".implode(',', $agents_ids).")
OR `updated_by` IN (".implode(',', $agents_ids).")
OR EXISTS (
SELECT 1 FROM requisitions
WHERE requisitions.id = autosearch_filters.req_id
AND requisitions.who_work = $user_id
)) LIMIT 1";
else
$sql .= " LIMIT 1";
if (mysql_query($sql) && $this->clearAllResults($id, $deleteAll)) {
if ($req_id > 0)
$this->setReqToFilter($req_id, $id, (int)$_SESSION['id']);
return ['success' => true, 'id' => $id, 'sql' => $sql];
} else {
return ['success' => false, 'error' => mysql_error(), 'sql' => $sql];
}
} else {
// Сбрасываем параметры района и метро, если переданы гео-уточнения
if (isset($post['geo'])) {
unset($post['rayons']);
unset($post['metro_stations']);
unset($post['do_metro']);
unset($post['do_metro_type']);
}
foreach ($fields_list as $field_name) {
if ($field_name == 'rooms' || $field_name == 'geo' || $field_name == 'category_type')
continue;
if (isset($post[$field_name])) {
$values['`'.$field_name.'`'] = $post[$field_name];
} else {
$values['`'.$field_name.'`'] = 'NULL';
}
}
if (isset($post['rooms']))
$values['`rooms`'] = "'" . json_encode($post['rooms'], JSON_UNESCAPED_UNICODE) . "'";
else
$values['`rooms`'] = "NULL";
if (isset($post['category_type']))
$values['`category_type`'] = "'" . json_encode($post['category_type'], JSON_UNESCAPED_UNICODE) . "'";
else
$values['`category_type`'] = "`category_type` = NULL";
if (isset($post['geo'])) {
$geo_data = $this->processGeoData($post['geo']);
$values['`geo`'] = "'" . json_encode($geo_data, JSON_UNESCAPED_UNICODE) . "'";
$values['`rayons`'] = "NULL";
$values['`metro_stations`'] = "NULL";
$values['`do_metro`'] = "NULL";
$values['`do_metro_type`'] = "NULL";
} else {
$values['`geo`'] = "NULL";
}
$values['`created_by`'] = "'$user_id'";
if ($onlyReverse) {
if (intval($post['req_id'])) {
$this->deleteFilterByReq(intval($post['req_id']));
}
$values['`is_search`'] = "'0'";
$values['`is_reverse`'] = "'1'";
} else {
$values['`is_search`'] = "'1'";
$values['`is_reverse`'] = "'0'";
}
$sql = "INSERT INTO `autosearch_filters` (" . implode(',', array_keys($values)) . ")
VALUES (" . implode(',', $values) . ")";
if (mysql_query($sql)) {
$id = mysql_insert_id();
if ($req_id > 0)
$this->setReqToFilter($req_id, $id, (int)$_SESSION['id']);
return ['success' => true, 'id' => $id, 'sql' => $sql];
} else {
return ['success' => false, 'error' => mysql_error(), 'sql' => $sql];
}
}
}
return ['success' => false, 'error' => $errorText];
}
public function setReqToFilter($req_id = null, $filter_id = null, $user_id = null) {
if (is_null($req_id) || is_null($filter_id))
return null;
if (is_null($user_id))
$user_id = $this->_user['id'];
$sql1 = "UPDATE `requisitions` SET `asfilter_id`='$filter_id' WHERE `id` = '$req_id' LIMIT 1";
$sql2 = "UPDATE `autosearch_filters` SET `req_id`='$req_id' WHERE `id` = '$filter_id' AND (`created_by` = $user_id OR `updated_by` = $user_id) LIMIT 1";
if (mysql_query($sql1) && mysql_query($sql2))
return ['success' => true, 'filter_id' => $filter_id, 'req_id' => $req_id];
else
return mysql_error();
}
public function unsetReqToFilter($req_id = null, $filter_id = null) {
if (is_null($req_id) && is_null($filter_id))
return null;
$sql1 = 'true';
$sql2 = 'true';
if (!is_null($req_id))
$sql1 = "UPDATE `requisitions` SET `asfilter_id`=NULL WHERE `id` = '$req_id' LIMIT 1";
if (!is_null($filter_id))
$sql2 = "UPDATE `requisitions` SET `asfilter_id`=NULL WHERE `asfilter_id` = '$filter_id' LIMIT 1";
if (mysql_query($sql1) && mysql_query($sql2))
return true;
else
return mysql_error();
}
public function deleteFilter($filter_id = null, $user_id = null) {
if (is_null($filter_id))
return null;
if (is_null($user_id))
$user_id = $this->_user['id'];
$agents_ids = [];
$agents_ids[] = $user_id;
if ($user_id) {
$agency_id = User::getUserAgencyID();
$agents_ids[] = $agency_id;
$sql_users = "SELECT id FROM users WHERE id in (select id from users where id=$agency_id or id_manager=$agency_id or id_manager in
(select id from users where id_manager=$agency_id or id_manager in
(select id from users where id_manager=$agency_id)))";
$query = mysql_query($sql_users);
while ($row = mysql_fetch_assoc($query)) {
$agents_ids[] = (int)$row['id'];
}
$agents_ids = array_merge($agents_ids, [$user_id]);
$agents_ids = array_unique($agents_ids);
}
$sql = "DELETE `filters`,
`results`
FROM `autosearch_filters` AS `filters`
INNER JOIN `autosearch_results` AS `results` ON `results`.filter_id = `filters`.`id`
WHERE `filters`.`id`='$filter_id' AND
(`filters`.`created_by` IN (".implode(',', $agents_ids).") OR `filters`.`updated_by` IN (".implode(',', $agents_ids)."))";
if (mysql_query($sql) && $this->clearAllResults($filter_id, true)) {
self::unsetReqToFilter(null, $filter_id);
mysql_query("DELETE * FROM `autosearch_viewed` WHERE `filter_id`='$filter_id'");
mysql_query("DELETE * FROM `autosearch_ignored` WHERE `filter_id`='$filter_id'");
mysql_query("DELETE * FROM `autosearch_favoured` WHERE `filter_id`='$filter_id'");
mysql_query("DELETE * FROM `autosearch_sended` WHERE `filter_id`='$filter_id'");
return true;
} else {
return mysql_error();
}
}
public function deleteFilterByReq($req_id = null, $user_id = null) {
if (is_null($req_id))
return null;
if (is_null($user_id))
$user_id = $this->_user['id'];
$agents_ids = [];
$agents_ids[] = $user_id;
if ($user_id) {
$agency_id = User::getUserAgencyID();
$agents_ids[] = $agency_id;
$sql_users = "SELECT id FROM users WHERE id in (select id from users where id=$agency_id or id_manager=$agency_id or id_manager in
(select id from users where id_manager=$agency_id or id_manager in
(select id from users where id_manager=$agency_id)))";
$query = mysql_query($sql_users);
while ($row = mysql_fetch_assoc($query)) {
$agents_ids[] = (int)$row['id'];
}
$agents_ids = array_merge($agents_ids, [$user_id]);
$agents_ids = array_unique($agents_ids);
}
$sql = "DELETE FROM `autosearch_viewed` AS `viewed`
INNER JOIN `autosearch_filters` AS `filters` ON `filters`.`id` = `viewed`.`filter_id`
WHERE `filters`.`req_id`='$req_id' AND
(`filters`.`created_by` IN (".implode(',', $agents_ids).") OR `filters`.`updated_by` IN (".implode(',', $agents_ids)."))";
$sql2 = "DELETE FROM `autosearch_ignored` AS `ignored`
INNER JOIN `autosearch_filters` AS `filters` ON `filters`.`id` = `ignored`.`filter_id`
WHERE `filters`.`req_id`='$req_id' AND
(`filters`.`created_by` IN (".implode(',', $agents_ids).") OR `filters`.`updated_by` IN (".implode(',', $agents_ids)."))";
$sql3 = "DELETE FROM `autosearch_favoured` AS `favoured`
INNER JOIN `autosearch_filters` AS `filters` ON `filters`.`id` = `favoured`.`filter_id`
WHERE `filters`.`req_id`='$req_id' AND
(`filters`.`created_by` IN (".implode(',', $agents_ids).") OR `filters`.`updated_by` IN (".implode(',', $agents_ids)."))";
$sql4 = "DELETE FROM `autosearch_sended` AS `sended`
INNER JOIN `autosearch_filters` AS `filters` ON `filters`.`id` = `sended`.`filter_id`
WHERE `filters`.`req_id`='$req_id' AND
(`filters`.`created_by` IN (".implode(',', $agents_ids).") OR `filters`.`updated_by` IN (".implode(',', $agents_ids)."))";
$sql5 = "DELETE FROM `autosearch_filters` AS `filters`
INNER JOIN `autosearch_results` AS `results` ON `results`.filter_id = `filters`.`id`
WHERE `filters`.`req_id`='$req_id' AND
(`filters`.`created_by` IN (".implode(',', $agents_ids).") OR `filters`.`updated_by` IN (".implode(',', $agents_ids)."))";
if (mysql_query($sql) && mysql_query($sql2) && mysql_query($sql3) && mysql_query($sql4) && mysql_query($sql5)) {
self::unsetReqToFilter($req_id);
return true;
} else {
return mysql_error();
}
}
private function cleanUpResults($filter_id = null, $delete_all = false) {
if (is_null($filter_id))
return false;
if ($delete_all) {
$sqld_1 = "DELETE FROM `autosearch_ignored` WHERE `filter_id` = '$filter_id'";
$sqld_2 = "DELETE FROM `autosearch_sended` WHERE `filter_id` = '$filter_id'";
$sqld_3 = "DELETE FROM `autosearch_viewed` WHERE `filter_id` = '$filter_id'";
$sqld_4 = "DELETE FROM `autosearch_favoured` WHERE `filter_id` = '$filter_id'";
$sqld_5 = "DELETE FROM `autosearch_results` WHERE `filter_id` = '$filter_id'";
if (mysql_query($sqld_1) && mysql_query($sqld_2) && mysql_query($sqld_3) && mysql_query($sqld_4) && mysql_query($sqld_5))
return true;
else
return mysql_error();
} else {
// Чистим фильтры старше, старше 1 часа, которые не привязались к заявками
$datetime = date('Y-m-d H:i:s', strtotime('-1 hour'));
$sql = "DELETE FROM `autosearch_filters`
WHERE ((`id` = '$filter_id' AND `req_id` IS NULL) OR
`req_id` IS NULL) AND
`created_at` < '$datetime'";
// Чистим все результаты старше 30 дней
$datetime = date('Y-m-d H:i:s', strtotime('-30 days'));
$sql1 = "DELETE FROM `autosearch_results`
WHERE `filter_id` = '$filter_id' AND
`processed_at` < '$datetime'";
// Чистим все пустые результаты старше 7 дней
$datetime = date('Y-m-d H:i:s', strtotime('-7 days'));
$sql2 = "DELETE FROM `autosearch_results`
WHERE `filter_id` = '$filter_id' AND
`match_ids` IS NULL AND
`similar_ids` IS NULL AND
`processed_at` < '$datetime'";
// Чистим пустые результаты за сегодня, но старше 30 мин. назад, т.к. другие необходимы
// при составлении очереди по крону (processed_at), если интервал 15 мин.
$datetime = date('Y-m-d H:i:s', strtotime('-30 minutes'));
$sql3 = "DELETE FROM `autosearch_results`
WHERE `filter_id` = '$filter_id' AND
`match_ids` IS NULL AND
`similar_ids` IS NULL AND
`count` IS NULL AND
`total` IS NULL AND
`processed_at` < '$datetime'";
// Очищаем результаты подбора автопоиска (кроме избранных, игнорируемых, просмотренных и отправленных в PDF)
$sql4 = "UPDATE `autosearch_results`
SET `count` = 0
WHERE ((`match_ids` IS NULL AND
`similar_ids` IS NULL) OR
`count` < 0) AND
`filter_id` = '$filter_id'";
if (mysql_query($sql) && mysql_query($sql1) && mysql_query($sql2) && mysql_query($sql3) && mysql_query($sql4))
return true;
else
return mysql_error();
}
}
private function buildSearchQuery($filter = null, $sphinx = true, $strict = true) {
if (!is_array($filter) && !is_null($this->_filter))
$filter = $this->_filter;
if (is_array($filter)) {
$query = [];
$proccessed = [];
$fields = self::getFields();
$is_geo = false;
$geo_data = null;
if (!empty($filter['geo'])) {
$is_geo = true;
$geo_data = array_values((array)json_decode($filter['geo']));
}
foreach ($filter as $key => $value) {
if (isset($fields[$key]) && !self::isEmpty($value) && !in_array($key, $proccessed)) {
if ($fields[$key]['type'] == "number")
$value = intval($value);
$proccessed[] = $key;
switch (strtolower($key)) {
case 'id' :
case 'req_id' :
break;
case 'deal_type' :
if ($value == 2)
$value = 1; // Покупка (продажа)
else if ($value == 1)
$value = 0; // Аренда
else if ($value == 3)
$value = 2; // Новостройки
if ($sphinx)
$query['where'][] = "operation_type=" . $value;
else
$query['where'][] = "`objects`.`operation_type` = '" . $value . "'";
break;
case 'object_type' :
if ($sphinx)
$query['where'][] = "type=" . $value;
else
$query['where'][] = "`objects`.`type` = '" . $value . "'";
break;
case 'object_source' :
if ($value == 1) { // Собственники
if ($sphinx) {
$query['where'][] = "(is_agent = 0 AND archive = 0)";
} else {
$query['where'][] = "(`ads_objects`.`ads_agent` = 0) AND `objects`.`archive` = 0";
}
} else if ($value == 2) { // Агенты
if ($sphinx) {
$query['where'][] = "(is_agent_ap = 1 AND archive < 1)";
} else {
$query['where'][] = "(`objects`.`id_add_user` > 0 OR `ads_objects`.`ads_agent` > 0) AND `objects`.`archive` < 1";
}
} else if ($value == 3) { // Собственники и агенты
if ($sphinx) {
$query['where'][] = "(is_agent_all = 1 AND archive = 0)";
} else {
$query['where'][] = "`objects`.`archive` = 0";
}
} else if ($value == 4) { // Архив собственников
if ($sphinx) {
$query['where'][] = "archive = 1";
$query['where'][] = "objects.id_add_user = 0";
} else {
$query['where'][] = "`objects`.`archive` = 1";
$query['where'][] = "`objects`.`id_add_user` = 0";
}
} else if ($value == 5) { // Объекты компании
$usersIds = [];
if (isset($filter['created_by'])) {
$curr_agency_id = User::getUserAgencyID($filter['created_by']);
$usersIds = User::getAllAgencyUsers($curr_agency_id);
$usersIds[] = $filter['created_by'];
}
if (empty($usersIds) && isset($filter['updated_by'])) {
$curr_agency_id = User::getUserAgencyID($filter['updated_by']);
$usersIds = User::getAllAgencyUsers($curr_agency_id);
$usersIds[] = $filter['updated_by'];
}
$usersIds = array_unique($usersIds);
$usersIds = array_map('intval', $usersIds);
/*if (isset($_GET['dev'])) {
echo "<pre>" . var_export($filter, true) . "</pre>";
var_export($curr_agency_id);
var_export($usersIds);
}*/
if ($sphinx) {
$query['where'][] = "archive = 0";
if (!empty($usersIds))
$query['where'][] = "id_add_user IN (" . implode(', ', $usersIds) . ")";
} else {
$query['where'][] = "objects.archive = 0";
if (!empty($usersIds))
$query['where'][] = "`objects`.`id_add_user` IN (" . implode(',', $usersIds) . ")";
}
} else if ($value == 6) { // Собственники и объекты компании
$usersIds = [];
if (isset($filter['created_by'])) {
$curr_agency_id = User::getUserAgencyID($filter['created_by']);
$usersIds = User::getAllAgencyUsers($curr_agency_id);
$usersIds[] = $filter['created_by'];
}
if (empty($usersIds) && isset($filter['updated_by'])) {
$curr_agency_id = User::getUserAgencyID($filter['updated_by']);
$usersIds = User::getAllAgencyUsers($curr_agency_id);
$usersIds[] = $filter['updated_by'];
}
$usersIds = array_unique($usersIds);
$usersIds = array_map('intval', $usersIds);
/*if (isset($_GET['dev'])) {
echo "<pre>" . var_export($filter, true) . "</pre>";
var_export($curr_agency_id);
var_export($usersIds);
}*/
if ($sphinx) {
$query['where'][] = "archive = 0";
if (!empty($usersIds)) {
$query['select'][] = "(is_agent = 0 OR id_add_user=" . implode(" OR id_add_user=", $usersIds) . ") AS object_source_cond";
$query['where'][] = "(archive = 0 and object_source_cond > 0)";
} else {
$query['where'][] = "(is_agent = 0 AND archive = 0)";
}
} else {
if (!empty($usersIds)) {
$query['where'][] = "(`ads_objects`.`ads_agent` = 0 OR `objects`.`id_add_user` IN (" . implode(',', $usersIds) . "))";
} else {
$query['where'][] = "(`ads_objects`.`ads_agent` = 0) AND `objects`.`archive` = 0";
}
}
} else {
if ($sphinx) {
$query['where'][] = "archive = 0";
} else {
$query['where'][] = "objects.archive = 0";
}
}
break;
case 'category_type' :
if (is_string($value)) {
$value = json_decode($value, true);
}
if (count($value)) {
if ($sphinx)
$query['where'][] = "type_category IN (" . implode(", ", $value) . ")";
else
$query['where'][] = "`objects`.`type_category` IN (" . implode(", ", $value) . ")";
}
break;
case 'rent_srok' :
if ($sphinx)
$query['where'][] = "srok=" . $value;
else
$query['where'][] = "`objects`.`srok` = '" . $value . "'";
break;
case 'stoim_ot' :
$price_key_to_check = $filter['use_area_price'] ? 'area_price' : 'stoim';
if ($sphinx)
$sql = $price_key_to_check . ">=" . $value;
else {
if (!$filter['use_area_price']) {
$sql = "`objects`.`stoim` >= '" . $value . "'";
} else {
$sql = "objects.stoim / objects.ploshad >= '" . $value . "'";
}
}
if ($value2 = $filter['stoim_do']) {
if ($fields[$key]['type'] == "number")
$value2 = intval($value2);
if ($sphinx)
$sql .= " AND $price_key_to_check<=" . $value2;
else {
if (!$filter['use_area_price']) {
$sql .= " AND `objects`.`stoim` <= '" . $value2 . "'";
} else {
$sql = "AND objects.stoim / objects.ploshad <= '" . $value2 . "'";
}
}
$query['where'][] = "(".$sql.")";
$proccessed[] = 'stoim_do';
break;
}
$query['where'][] = $sql;
break;
case 'stoim_do' :
$price_key_to_check = $filter['use_area_price'] ? 'area_price' : 'stoim';
if ($sphinx)
$query['where'][] = "$price_key_to_check<=" . $value;
else {
if (!(bool)$fields['use_area_price']) {
$query['where'][] = "`objects`.`stoim` <= '" . $value . "'";
} else {
$query['where'][] = "objects.stoim / objects.ploshad <= '" . $value . "'";
}
}
break;
case 'komn_ot' :
if ($sphinx)
$sql = "komnat>=" . $value;
else
$sql = "`objects`.`komnat` >= '" . $value . "'";
if ($value2 = $filter['komn_do']) {
if ($fields[$key]['type'] == "number")
$value2 = intval($value2);
if ($sphinx)
$sql .= " AND komnat<=" . $value2;
else
$sql .= " AND `objects`.`komnat` <= '" . $value2 . "'";
$query['where'][] = "(".$sql.")";
$proccessed[] = 'komn_do';
break;
}
$query['where'][] = $sql;
break;
case 'komn_do' :
if ($sphinx)
$query['where'][] = "komnat<=" . $value;
else
$query['where'][] = "`objects`.`komnat` <= '" . $value . "'";
break;
case 'rooms' :
$rooms = json_decode($value, true);
$sql_where = [];
if (in_array(1, array_map('intval', array_values($rooms))))
$sql_where[] = "komnat = 1";
if (in_array(2, array_map('intval', array_values($rooms))))
$sql_where[] = "komnat = 2";
if (in_array(3, array_map('intval', array_values($rooms))))
$sql_where[] = "komnat = 3";
if (in_array(4, array_map('intval', array_values($rooms))))
$sql_where[] = "komnat >= 4";
if ($sphinx && in_array(5, array_map('intval', array_values($rooms))))
$sql_where[] = "studio_flag = '1'";
if ($sphinx) {
if (!empty($sql_where)) {
$query['select'][] = "(".implode(' OR ', $sql_where).") AS rooms";
$query['where'][] = "rooms>0";
}
} else {
if (in_array(5, array_map('intval', array_values($rooms))))
$sql_where[] = "`objects`.`studio_flag` = '1'";
if (!empty($sql_where)) {
$query['where'][] = "(".implode(' OR ', $sql_where).")";
}
}
break;
case 'sq_all_ot' :
$value = intval($value);
$isLandObject = false;
if (isset($filter['object_type']) && $filter['object_type'] == 7) {
$isLandObject = true;
}
$fieldName = $isLandObject ? 'land_area' : 'ploshad';
if ($sphinx)
$sql = "$fieldName>=" . $value;
else
$sql = "`objects`.`$fieldName` >= '" . $value . "'";
if ($value2 = $filter['sq_all_do']) {
if ($fields[$key]['type'] == "number")
$value2 = intval($value2);
$value2 = intval($value2);
if ($sphinx)
$sql .= " AND $fieldName<=" . $value2;
else
$sql .= " AND `objects`.`$fieldName` <= '" . $value2 . "'";
$query['where'][] = "(" . $sql . ")";
$proccessed[] = 'sq_all_do';
break;
}
$query['where'][] = $sql;
break;
case 'sq_all_do' :
$value = intval($value);
$isLandObject = false;
if (isset($filter['object_type']) && $filter['object_type'] == 7) {
$isLandObject = true;
}
$fieldName = $isLandObject ? 'land_area' : 'ploshad';
if ($sphinx)
$query['where'][] = "$fieldName<=" . $value;
else
$query['where'][] = "`objects`.`$fieldName` <= '" . $value . "'";
break;
case 'ploshad_k_ot' :
if ($sphinx)
$sql = "ploshad_k>=" . $value;
else
$sql = "`objects`.`ploshad_k` >= '" . $value . "'";
if ($value2 = $filter['ploshad_k_do']) {
if ($fields[$key]['type'] == "number")
$value2 = intval($value2);
if ($fields[$key]['type'] == "number")
$value2 = intval($value2);
if ($sphinx)
$sql .= " AND ploshad_k<=" . $value2;
else
$sql .= " AND `objects`.`ploshad_k` <= '" . $value2 . "'";
$query['where'][] = "(".$sql.")";
$proccessed[] = 'ploshad_k_do';
break;
}
$query['where'][] = $sql;
break;
case 'ploshad_k_do' :
if ($sphinx)
$query['where'][] = "ploshad_k<=" . $value;
else
$query['where'][] = "`objects`.`ploshad_k` <= '" . $value . "'";
break;
case 'regions' :
$sql_r = "SELECT `rf_regions`.*
FROM `rf_regions`
WHERE `id` IN (" . implode(', ', json_decode($value)) . ")
ORDER BY `id` ASC";
$region = [];
$query_r = mysql_query($sql_r);
while($row = mysql_fetch_assoc($query_r)) {
$region[] = $row;
}
if (empty($region)) {
$region[0] = array(
'id' => 47,
'name' => 'Ленинградская обл',
'kladr' => '4700000000000',
'parent' => 94,
'code' => 47
);
$region[1] = array(
'id' => 78,
'name' => 'Санкт-Петербург',
'kladr' => '7800000000000',
'parent' => 94,
'code' => 78
);
}
$parent_region = [];
/*if (isset($region[0]['id']))
$parent_region[] = $region[0]['id'];*/
if (isset($region[0]['parent']))
$parent_region[] = $region[0]['parent'];
if (!empty($parent_region)) {
if ($sphinx)
$query['match'][] = "@(id_rf_region,parent) " . implode('|', $parent_region) . "";
else
$query['where'][] = "`objects`.`id_rf_region` IN (SELECT `id` FROM `rf_regions` WHERE `id` IN (" . implode(',', $parent_region) . ") OR `parent` IN (" . implode(',', $parent_region) . "))";
} else {
if ($sphinx)
$query['match'][] = "@(id_rf_region,parent) " . implode('|', json_decode($value)) . "";
else
$query['where'][] = "`objects`.`id_rf_region` IN (" . implode(', ', json_decode($value)) . ")";
}
break;
case 'rayons' :
if (!$is_geo) { // игнорируем при поиске с гео-уточнением
$rayon = json_decode($value);
$usl_rayon2 = [];
foreach ($rayon as $key => $value) {
if ($key == 0) {
$usl_rayon[] = "`objects`.`id_rf_region` = '$value'";
} else {
$usl_rayon[] = "`objects`.`rayon` = '$value'";
}
$usl_rayon2[] = $value;
}
$usl_rayon2 = array_unique($usl_rayon2);
if ($sphinx)
$query['where'][] = "rayon_id in (" . implode(",", $usl_rayon2) . ")";
else
$query['where'][] = "(" . implode(" OR ", $usl_rayon) . ")";
}
break;
case 'metro_stations' :
if (!$is_geo) { // игнорируем при поиске с гео-уточнением
$metro = json_decode($value);
$usl_metro2 = [];
foreach ($metro as $key => $value) {
$usl_metro[] = "`sp_metro`.`id_metro` = '$value'";
$usl_metro2[] = $value;
}
$usl_metro2 = array_unique($usl_metro2);
if ($sphinx) {
$query['where'][] = "id_metro IN (" . implode(",", $usl_metro2) . ")";
} else {
$query['where'][] = "(" . implode(" OR ", $usl_metro) . ")";
$query['join'][] = " LEFT JOIN `sp_metro` AS `sp_metro` ON `objects`.`id` = `sp_metro`.`id_obj` ";
}
}
break;
case 'do_metro' :
if (!$is_geo) { // игнорируем при поиске с гео-уточнением
if ($sphinx)
$sql = "peshkom<=" . $value;
else
$sql = "`objects`.`peshkom` <= '" . $value . "'";
if ($value2 = $filter['do_metro_type']) {
if ($value2 == 1)
$value2 = 0;
elseif ($value2 == 2)
$value2 = 1;
if ($sphinx)
$sql .= " AND transport=" . $value2;
else
$sql .= " AND `objects`.`transport` = '" . $value2 . "'";
$query['where'][] = "(" . $sql . ")";
$proccessed[] = 'do_metro_type';
break;
}
$proccessed[] = 'do_metro_type';
$query['where'][] = $sql;
}
break;
case 'etazh_ot' :
if ($sphinx)
$sql = "etazh>=" . $value;
else
$sql = "`objects`.`etazh` >= '" . $value . "'";
if ($value2 = $filter['etazh_do']) {
if ($fields[$key]['type'] == "number")
$value2 = intval($value2);
if ($sphinx)
$sql .= " AND etazh<=" . $value2;
else
$sql .= " AND `objects`.`etazh` <= '" . $value2 . "'";
$query['where'][] = "(".$sql.")";
$proccessed[] = 'etazh_do';
break;
}
$query['where'][] = $sql;
break;
case 'etazh_do' :
if ($sphinx)
$query['where'][] = "etazh<=" . $value;
else
$query['where'][] = "`objects`.`etazh` <= '" . $value . "'";
break;
case 'etazhnost_ot' :
if ($sphinx)
$sql = "etazh_iz>=" . $value;
else
$sql = "`objects`.`etazh_iz` >= '" . $value . "'";
if ($value2 = $filter['etazhnost_do']) {
if ($fields[$key]['type'] == "number")
$value2 = intval($value2);
if ($sphinx)
$sql .= " AND etazh_iz<=" . $value2;
else
$sql .= " AND `objects`.`etazh_iz` <= '" . $value2 . "'";
$query['where'][] = "(".$sql.")";
$proccessed[] = 'etazhnost_do';
break;
}
$query['where'][] = $sql;
break;
case 'etazhnost_do' :
if ($sphinx)
$query['where'][] = "etazh_iz<=" . $value;
else
$query['where'][] = "`objects`.`etazh_iz` <= '" . $value . "'";
break;
case 'etazhnost' :
if ($sphinx && boolval($value)) {
$query['select'][] = "IF(etazh <> 1 AND etazh <> etazh_iz AND etazh_iz > 0, 1, 0) as etazhnost";
$query['where'][] = "etazhnost = 1";
} else if (boolval($value)) {
$query['where'][] = "'(`objects`.`etazh` <> 1 AND `objects`.`etazh` <> `objects`.`etazh_iz`)";
}
break;
case 'legal_address' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "legal_address=" . $value;
else
$query['where'][] = "`objects`.`legal_address` = '" . $value . "'";
break;
case 'is_occupied' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "isOccupied=" . $value;
else
$query['where'][] = "`objects`.`isOccupied` = '" . $value . "'";
break;
case 'layout_id' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "layout_id=" . $value;
else
$query['where'][] = "`objects`.`layout_id` = '" . $value . "'";
break;
case 'wet_spots' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "number_wet_spots=" . $value;
else
$query['where'][] = "`objects`.`number_wet_spots` = '" . $value . "'";
break;
case 'house_type' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "house_type=" . $value;
else
$query['where'][] = "`objects`.`house_type` = '" . $value . "'";
break;
case 'house_material' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "house_material = " . $value;
else
$query['where'][] = "`objects`.`house_material` = '" . $value . "'";
break;
case 'build_year' :
if (!$strict)
break;
if ($sphinx) {
/*$query['select'][] = "UNIX_TIMESTAMP(build_year) AS build_year_u";
$query['where'][] = "build_year_u >= '" . strtotime($value) . "'";*/
//$query['select'][] = "build_year";
//$query['where'][] = "UNIX_TIMESTAMP(build_year) >= '" . strtotime($value) . "'";
$query['where'][] = "build_year >= " . $value . "";
} else {
$query['where'][] = "`sale_objects`.`build_year` >= '" . $value . "'";
$query['join'][] = " LEFT JOIN `sale_objects` AS `sale_objects` ON `objects`.`id` = `sale_objects`.`object_id` ";
}
break;
case 'el_power_ot' :
if (!$strict)
break;
if ($sphinx)
$sql = "electricity_power>=" . $value;
else
$sql = "`objects`.`electricity_power` >= '" . $value . "'";
if ($value2 = $filter['el_power_do']) {
if ($fields[$key]['type'] == "number")
$value2 = intval($value2);
if ($sphinx)
$sql .= " AND electricity_power<=" . $value2;
else
$sql .= " AND `objects`.`electricity_power` <= '" . $value2 . "'";
$query['where'][] = "(".$sql.")";
$proccessed[] = 'el_power_do';
break;
}
$query['where'][] = $sql;
break;
case 'el_power_do' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "electricity_power<=" . $value;
else
$query['where'][] = "`objects`.`electricity_power` <= '" . $value . "'";
break;
case 'commer_condition' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "commer_condition=" . $value;
else
$query['where'][] = "`objects`.`commer_condition` = '" . $value . "'";
break;
case 'is_furniture' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "isFurniture=" . $value;
else
$query['where'][] = "`objects`.`isFurniture` = '" . $value . "'";
break;
case 'commer_access' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "commer_access=" . $value;
else
$query['where'][] = "`objects`.`commer_access` = '" . $value . "'";
break;
case 'parking_types' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "parking_type_id=" . $value;
else
$query['where'][] = "`objects`.`parking_type_id` = '" . $value . "'";
break;
case 'parking_price' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "parking_price=" . $value;
else
$query['where'][] = "`objects`.`parking_price` = '" . $value . "'";
break;
case 'parking_price_free' :
if (!$strict)
break;
if (boolval($value)) {
if ($sphinx)
$query['where'][] = "parkingIsFree = 'on'";
else
$query['where'][] = "`objects`.`parkingIsFree` = 'on'";
}
break;
case 'ceiling_height_ot' :
if (!$strict)
break;
if ($sphinx)
$sql = "ceiling_height>=" . $value;
else
$sql = "`objects`.`ceiling_height` >= '" . $value . "'";
if ($value2 = $filter['ceiling_height_do']) {
if ($fields[$key]['type'] == "number")
$value2 = intval($value2);
if ($sphinx)
$sql .= " AND ceiling_height<=" . $value2;
else
$sql .= " AND `objects`.`ceiling_height` <= '" . $value2 . "'";
$query['where'][] = "(".$sql.")";
$proccessed[] = 'ceiling_height_do';
break;
}
$query['where'][] = $sql;
break;
case 'ceiling_height_do' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "ceiling_height<=" . $value;
else
$query['where'][] = "`objects`.`ceiling_height` <= '" . $value . "'";
break;
case 'vat_type_id' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "vat_type_id=" . $value;
else
$query['where'][] = "`objects`.`vat_type_id` = '" . $value . "'";
break;
case 'commerc_site' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "commerc_site=" . $value;
else
$query['where'][] = "`objects`.`commerc_site` = '" . $value . "'";
break;
case 'commerc_owned1' :
if (!$strict)
break;
if ($sphinx)
$sql = "commerc_owned=" . $value;
else
$sql = "`objects`.`commerc_owned` = '" . $value . "'";
if ($value2 = $filter['commerc_owned2']) {
if ($sphinx)
$sql = "commerc_owned=" . $value2;
else
$sql = "`objects`.`commerc_owned` = '" . $value2."'";
$proccessed[] = 'commerc_owned2';
break;
}
$query['where'][] = $sql;
break;
case 'floor_material_id' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "floor_material_id IN (" . implode(', ', json_decode($value)) . ")";
else
$query['where'][] = "`objects`.`floor_material_id` IN (" . implode(', ', json_decode($value)) . ")";
break;
case 'commerc_portal_id' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "commerc_portal_id IN (" . implode(', ', json_decode($value)) . ")";
else
$query['where'][] = "`objects`.`commerc_portal_id` IN (" . implode(', ', json_decode($value)) . ")";
break;
case 'commerc_lift1' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "commerc_lift1=" . $value;
else
$query['where'][] = "`objects`.`commerc_lift1` = '" . $value . "'";
break;
case 'lift1_carrying' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "lift1_carrying=" . $value;
else
$query['where'][] = "`objects`.`lift1_carrying` = '" . $value . "'";
break;
case 'commerc_lift2' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "commerc_lift2=" . $value;
else
$query['where'][] = "`objects`.`commerc_lift2` = '" . $value . "'";
break;
case 'lift2_carrying' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "lift2_carrying=" . $value;
else
$query['where'][] = "`objects`.`lift2_carrying` = '" . $value . "'";
break;
case 'commerc_lift3' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "commerc_lift3=" . $value;
else
$query['where'][] = "`objects`.`commerc_lift3` = '" . $value . "'";
break;
case 'lift3_carrying' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "lift3_carrying=" . $value;
else
$query['where'][] = "`objects`.`lift3_carrying` = '" . $value . "'";
break;
case 'commerc_crane1' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "commerc_crane1=" . $value;
else
$query['where'][] = "`objects`.`commerc_crane1` = '" . $value . "'";
break;
case 'crane1_carrying' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "crane1_carrying=" . $value;
else
$query['where'][] = "`objects`.`crane1_carrying` = '" . $value . "'";
break;
case 'commerc_crane2' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "commerc_crane2=" . $value;
else
$query['where'][] = "`objects`.`commerc_crane2` = '" . $value . "'";
break;
case 'crane2_carrying' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "crane2_carrying=" . $value;
else
$query['where'][] = "`objects`.`crane2_carrying` = '" . $value . "'";
break;
case 'commerc_crane3' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "commerc_crane3=" . $value;
else
$query['where'][] = "`objects`.`commerc_crane3` = '" . $value . "'";
break;
case 'crane3_carrying' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "crane3_carrying=" . $value;
else
$query['where'][] = "`objects`.`crane3_carrying` = '" . $value . "'";
break;
case 'commerc_crane4' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "commerc_crane4=" . $value;
else
$query['where'][] = "`objects`.`commerc_crane4` = '" . $value . "'";
break;
case 'crane4_carrying' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "crane4_carrying=" . $value;
else
$query['where'][] = "`objects`.`crane4_carrying` = '" . $value . "'";
break;
case 'commerc_houseline_type_id' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "commerc_houseLineType_id IN (" . implode(', ', json_decode($value)) . ")";
else
$query['where'][] = "`objects`.`commerc_houseLineType_id` IN (" . implode(', ', json_decode($value)) . ")";
break;
case 'commerc_opened_id' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "commerc_opened_id IN (" . implode(', ', json_decode($value)) . ")";
else
$query['where'][] = "`objects`.`commerc_opened_id` IN (" . implode(', ', json_decode($value)) . ")";
break;
case 'commerc_year_ot' :
if (!$strict)
break;
if ($sphinx)
$sql = "commerc_year>=" . $value;
else
$sql = "`objects`.`commerc_year` >= '" . $value . "'";
if ($value2 = $filter['commerc_year_do']) {
if ($fields[$key]['type'] == "number")
$value2 = intval($value2);
if ($sphinx)
$sql .= " AND commerc_year<=" . $value2;
else
$sql .= " AND `objects`.`commerc_year` <= '" . $value2 . "'";
$query['where'][] = "(".$sql.")";
$proccessed[] = 'commerc_year_do';
break;
}
$query['where'][] = $sql;
break;
case 'commerc_year_do' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "commerc_year<=" . $value;
else
$query['where'][] = "`objects`.`commerc_year` <= '" . $value . "'";
break;
case 'commerc_purpose' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "commerc_purpose IN (" . implode(', ', json_decode($value)) . ")";
else
$query['where'][] = "`objects`.`commerc_purpose` IN (" . implode(', ', json_decode($value)) . ")";
break;
case 'commerc_building_type_id' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "commerc_building_type_id IN (" . implode(', ', json_decode($value)) . ")";
else
$query['where'][] = "`objects`.`commerc_building_type_id` IN (" . implode(', ', json_decode($value)) . ")";
break;
case 'commerc_building_class_id' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "commerc_building_class_id IN (" . implode(', ', json_decode($value)) . ")";
else
$query['where'][] = "`objects`.`commerc_building_class_id` IN (" . implode(', ', json_decode($value)) . ")";
break;
case 'commerc_land_category_id' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "commerc_land_category_id IN (" . implode(', ', json_decode($value)) . ")";
else
$query['where'][] = "`objects`.`commerc_land_category_id` IN (" . implode(', ', json_decode($value)) . ")";
break;
case 'commerc_permitted_use_id' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "commerc_permitted_use_id IN (" . implode(', ', json_decode($value)) . ")";
else
$query['where'][] = "`objects`.`commerc_permitted_use_id` IN (" . implode(', ', json_decode($value)) . ")";
break;
case 'commerc_specifications' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "commerc_specifications IN (" . implode(', ', json_decode($value)) . ")";
else
$query['where'][] = "`objects`.`commerc_specifications` IN (" . implode(', ', json_decode($value)) . ")";
break;
case 'building_area_ot' :
if (!$strict)
break;
if ($sphinx)
$sql = "building_area>=" . $value;
else
$sql = "`objects`.`building_area` >= '" . $value . "'";
if ($value2 = $filter['building_area_do']) {
if ($fields[$key]['type'] == "number")
$value2 = intval($value2);
if ($sphinx)
$sql .= " AND building_area<=" . $value2;
else
$sql .= " AND `objects`.`building_area` <= '" . $value2 . "'";
$query['where'][] = "(".$sql.")";
$proccessed[] = 'building_area_do';
break;
}
$query['where'][] = $sql;
break;
case 'building_area_do' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "building_area<=" . $value;
else
$query['where'][] = "`objects`.`building_area` <= '" . $value . "'";
break;
case 'commerc_building_category_id' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "commerc_building_category_id=" . $value;
else
$query['where'][] = "`objects`.`commerc_building_category_id` = '" . $value . "'";
break;
case 'commerc_building_ventilation' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "commerc_building_ventilation=" . $value;
else
$query['where'][] = "`objects`.`commerc_building_ventilation` = '" . $value . "'";
break;
case 'commerc_building_conditioning' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "commerc_building_conditioning=" . $value;
else
$query['where'][] = "`objects`.`commerc_building_conditioning` = '" . $value . "'";
break;
case 'commerc_building_heating' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "commerc_building_heating=" . $value;
else
$query['where'][] = "`objects`.`commerc_building_heating` = '" . $value . "'";
break;
case 'commerc_building_fire' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "commerc_building_fire=" . $value;
else
$query['where'][] = "`objects`.`commerc_building_fire` = '" . $value . "'";
break;
case 'column_grid' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "column_grid=" . $value;
else
$query['where'][] = "`objects`.`column_grid` = '" . $value . "'";
break;
case 'garage_type_id' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "garage_type_id=" . $value;
else
$query['where'][] = "`objects`.`garage_type_id` = '" . $value . "'";
break;
case 'garage_vid_id' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "garage_vid_id=" . $value;
else
$query['where'][] = "`objects`.`garage_vid_id` = '" . $value . "'";
break;
case 'boks_vid_id' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "boks_vid_id=" . $value;
else
$query['where'][] = "`objects`.`boks_vid_id` = '" . $value . "'";
break;
case 'commerc_status_id' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "commerc_status_id=" . $value;
else
$query['where'][] = "`objects`.`commerc_status_id` = '" . $value . "'";
break;
case 'commerc_electricity_id' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "commerc_electricity_id=" . $value;
else
$query['where'][] = "`objects`.`commerc_electricity_id` = '" . $value . "'";
break;
case 'can_electricity' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "can_electricity=" . $value;
else
$query['where'][] = "`objects`.`can_electricity` = '" . $value . "'";
break;
case 'commerc_gas_id' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "commerc_gas_id=" . $value;
else
$query['where'][] = "`objects`.`commerc_gas_id` = '" . $value . "'";
break;
case 'can_gas' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "can_gas=" . $value;
else
$query['where'][] = "`objects`.`can_gas` = '" . $value . "'";
break;
case 'commerc_water_id' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "commerc_water_id=" . $value;
else
$query['where'][] = "`objects`.`commerc_water_id` = '" . $value . "'";
break;
case 'can_water' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "can_water=" . $value;
else
$query['where'][] = "`objects`.`can_water` = '" . $value . "'";
break;
case 'commerc_sewage_id' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "commerc_sewage_id=" . $value;
else
$query['where'][] = "`objects`.`commerc_sewage_id` = '" . $value . "'";
break;
case 'can_sewage' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "can_sewage=" . $value;
else
$query['where'][] = "`objects`.`can_sewage` = '" . $value . "'";
break;
case 'commerc_driveways_id' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "commerc_driveways_id=" . $value;
else
$query['where'][] = "`objects`.`commerc_driveways_id` = '" . $value . "'";
break;
case 'tax_number' :
if (!$strict)
break;
if ($sphinx)
$query['where'][] = "tax_number=" . $value; //$query['match'][] = "@tax_number ". $value;
else
$query['where'][] = "`objects`.`tax_number` = '" . $value . "'";
break;
case 'commerc_infrastructure' :
if (!$strict)
break;
$value = json_decode($value);
if ($value2 = $filter['commerc_infrastructure1']) {
$value = array_merge($value, json_decode($value2));
$proccessed[] = 'commerc_infrastructure1';
}
if ($value3 = $filter['commerc_infrastructure2']) {
$value = array_merge($value, json_decode($value3));
$proccessed[] = 'commerc_infrastructure2';
}
if ($sphinx)
$query['match'][] = "@commerc_infrastructure ". implode(' | ', $value);
else
$query['where'][] = "`objects`.`commerc_infrastructure` IN (" . implode(', ', $value) . ")";
break;
case 'commerc_infrastructure1' :
if (!$strict)
break;
if ($sphinx)
$query['match'][] = "@commerc_infrastructure ". implode(' | ', json_decode($value));
else
$query['where'][] = "`objects`.`commerc_infrastructure` IN (" . implode(', ', $value) . ")";
break;
case 'commerc_infrastructure2' :
if (!$strict)
break;
if ($sphinx)
$query['match'][] = "@commerc_infrastructure ". implode(' | ', json_decode($value));
else
$query['where'][] = "`objects`.`commerc_infrastructure` IN (" . implode(', ', $value) . ")";
break;
case 'opis' :
if (!$strict)
break;
$value = strip_tags($value);
$value = str_replace("\r\n", ' ', $value);
$value = preg_replace('/[^a-zA-Zа-яА-Я0-9 ]/ui', '', $value);
if ($sphinx) {
$query['match'][] = "@opis " . $value;
} else {
$words = explode(' ', $value);
$query['where'][] = "(`objects`.`opis` LIKE '%$value%' OR `objects`.`opis` REGEXP '" . implode('|', $words) . "')";
}
break;
default:
break;
}
}
}
if ($is_geo && !empty($geo_data)) {
$usl_geo = [];
$usl_geo2 = [];
foreach ($geo_data as $poly) {
if (!empty($poly)) {
$usl_geo[] = "CONTAINS(GEOPOLY2D(" . $poly . "),latitude,longitude)";
$usl_geo2[] = "CONTAINS(POLYGON(" . $poly . "), POINT(latitude, longitude))";
}
}
if (!empty($usl_geo)) {
if ($sphinx) {
$query['select'][] = "IF((" . implode(" OR ", $usl_geo). "), 1, 0) AS geo";
$query['where'][] = "geo=1";
} else {
$query['where'][] = "(" . implode(" OR ", $usl_geo2) . ")";
}
}
}
$delimiter = ' AND ';
/*if (!$strict )
$delimiter = ' OR ';*/
$sql = [];
$sql['select'] = "";
if (count($query['select']) > 0)
$sql['select'] = implode(", ", $query['select']) . " ";
if (count($query['join']) > 0) {
if (!isset($sql['join']))
$sql['join'] .= implode($delimiter, $query['join']);
else
$sql['join'] .= " " . implode($delimiter, $query['join']);
}
if (count($query['where']) > 0) {
if (!isset($sql['where']))
$sql['where'] .= implode($delimiter, $query['where']);
else
$sql['where'] .= " AND " . implode($delimiter, $query['where']);
}
if (count($query['match']) > 0) {
if (!isset($sql['where']))
$sql['where'] .= "MATCH('" . implode(' ', $query['match']) . "')";
else
$sql['where'] .= " AND MATCH('" . implode(' ', $query['match']) . "')";
}
return $sql;
}
return null;
}
public function getSearchQuery($filter = null, $offset = 0, $perpage = 100, $sphinx = true) {
if (!empty($filter)) {
$match_q = self::buildSearchQuery($filter, $sphinx, true);
$similar_q = self::buildSearchQuery($filter, $sphinx, false);
if (!empty($match_q) && !empty($similar_q)) {
$ex_ids = [];
$filter_id = $filter['id'];
if ($sphinx) {
$where_q = 'black=0 AND moder=0 AND ';
} else {
$where_q = '`objects`.`black` = 0 AND `objects`.`moder` = 0 AND ';
}
$exclude_q = '';
if ($res_prev = self::getMetaResults($filter_id)) {
$ex_ids = array_merge(
(count($res_prev['results']['match']) > 0) ? $res_prev['results']['match'] : [],
(count($res_prev['results']['similar']) > 0) ? $res_prev['results']['similar'] : [],
/*(count($res_prev['viewed']) > 0) ? $res_prev['viewed'] : [],*/
(count($res_prev['ignored']) > 0) ? $res_prev['ignored'] : [],
(count($res_prev['favoured']) > 0) ? $res_prev['favoured'] : [],
(count($res_prev['sended']) > 0) ? $res_prev['sended'] : []
);
$ex_ids = array_unique($ex_ids);
if (count($ex_ids) > 0) {
if ($sphinx) {
// $ex_hash = array_flip($ex_ids);
// $filtered_match = [];
// foreach ($raw_match as $obj) {
// if (!isset($ex_hash[$obj['id']])) {
// $filtered_match[] = $obj;
// if (count($filtered_match) >= $perpage) break;
// }
// }
$exclude_q = 'AND id NOT IN (' . implode(',', $ex_ids) . ')';
}
else {
$exclude_q = 'AND `objects`.`id` NOT IN (' . implode(', ', $ex_ids) . ')';
}
}
}
$limit = "LIMIT 1000";
if (!is_null($offset) && !is_null($perpage)) {
$limit = "LIMIT $offset, $perpage";
} elseif (!is_null($offset) && is_null($perpage)) {
$limit = "LIMIT $offset, 1000";
}
if ($sphinx)
$order = 'ORDER BY date_add DESC, ads_source DESC';
else
$order = 'ORDER BY `objects`.`date_add` DESC';
if ($sphinx) {
$sql_obj_match_count = "SELECT count(*) as total" .(!empty($match_q['select']) ? ', ' . $match_q['select'] : ''). "
FROM objects, objects_delta
" .(!empty($match_q['join']) ? $match_q['join'] : ''). "
WHERE $where_q
$match_q[where]
$exclude_q
OPTION max_matches=10000";
$sql_obj_similar_count = "SELECT count(*) as total" .(!empty($similar_q['select']) ? ', ' . $similar_q['select'] : ''). "
FROM objects, objects_delta
" .(!empty($similar_q['join']) ? $similar_q['join'] : ''). "
WHERE $where_q
$similar_q[where]
$exclude_q
OPTION max_matches=10000";
$sql_obj_match = "SELECT *" .(!empty($match_q['select']) ? ', ' . $match_q['select'] : ''). "
FROM objects, objects_delta
" .(!empty($match_q['join']) ? $match_q['join'] : ''). "
WHERE $where_q
$match_q[where]
$exclude_q
$order
$limit
OPTION max_matches=10000";
$sql_obj_similar = "SELECT *" .(!empty($similar_q['select']) ? ', ' . $similar_q['select'] : ''). "
FROM objects, objects_delta
" .(!empty($similar_q['join']) ? $similar_q['join'] : ''). "
WHERE $where_q
$similar_q[where]
$exclude_q
$order
$limit
OPTION max_matches=10000";
} else {
$sql_obj_match_count = "SELECT COUNT(DISTINCT `objects`.`id`) as total" .(!empty($match_q['select']) ? ', ' . $match_q['select'] : ''). "
FROM `objects` AS objects
" .(!empty($match_q['join']) ? $match_q['join'] : ''). "
WHERE $where_q
$match_q[where]
$exclude_q";
$sql_obj_similar_count = "SELECT count(*) as total" .(!empty($similar_q['select']) ? ', ' . $similar_q['select'] : ''). "
FROM `objects` AS objects
" .(!empty($similar_q['join']) ? $similar_q['join'] : ''). "
WHERE $where_q
$similar_q[where]
$exclude_q";
$sql_obj_match = "SELECT *" .(!empty($match_q['select']) ? ', ' . $match_q['select'] : ''). "
FROM `objects` AS objects
" .(!empty($match_q['join']) ? $match_q['join'] : ''). "
WHERE $where_q
$match_q[where]
$exclude_q
$order
$limit";
$sql_obj_similar = "SELECT *" . (!empty($similar_q['select']) ? ', ' . $similar_q['select'] : '') . "
FROM `objects` AS objects
" .(!empty($similar_q['join']) ? $similar_q['join'] : ''). "
WHERE $where_q
$similar_q[where]
$exclude_q
$order
$limit";
}
return [
'success' => true,
'ex_ids' => $ex_ids,
'match_count' => trim(preg_replace('/\s\s+/', ' ', $sql_obj_match_count)),
'similar_count' => trim(preg_replace('/\s\s+/', ' ', $sql_obj_similar_count)),
'match' => trim(preg_replace('/\s\s+/', ' ', $sql_obj_match)),
'similar' => trim(preg_replace('/\s\s+/', ' ', $sql_obj_similar)),
];
}
}
return false;
}
private function getMetaResults($filter_id = null) {
if (is_null($filter_id) || !$filter_id)
return [];
$sql = "SELECT match_ids, similar_ids, error, processed_at
FROM `autosearch_results`
WHERE filter_id='$filter_id'
ORDER BY processed_at DESC LIMIT 1000";
$results = [
'results' => [
'match' => [],
'similar' => []
],
'viewed' => [],
'ignored' => [],
'favoured' => [],
'sended' => [],
'error' => null
];
if ($res = mysql_query($sql)) {
if (mysql_num_rows($res) > 0) {
while ($row = mysql_fetch_assoc($res)) {
if (!isset($results['processed_at']))
$results['processed_at'] = $row['processed_at'];
if (!isset($results['error']))
$results['error'] = $row['error'];
if (!empty($row['match_ids'])) {
if ($match_ids = json_decode($row['match_ids'])) {
$results['results']['match'] = array_unique(array_merge(
(is_array($match_ids)) ? $match_ids : [],
$results['results']['match']
));
}
}
if (!empty($row['similar_ids'])) {
if ($similar_ids = json_decode($row['similar_ids'])) {
$results['results']['similar'] = array_unique(array_merge(
(is_array($similar_ids)) ? $similar_ids : [],
$results['results']['similar']
));
}
}
}
}
$results['viewed'] = $this->getViewedObjects($filter_id);
$results['ignored'] = $this->getIgnoredObjects($filter_id);
$results['favoured'] = $this->getFavouredObjects($filter_id);
$results['sended'] = $this->getSendedObjects($filter_id);
} else {
$results['error'] = mysql_error();
}
return $results;
}
public function addObjectToFavour($filter_id = null, $object_id = null, $sphinx = true, $raw = false) {
$gmtmsk = get_time_zone_user();
$time_zone = '';
if($gmtmsk >= 0){
$time_zone = '+'.$gmtmsk.' hour';
} else {
$time_zone = '-'.$gmtmsk.' hour';
}
if (is_null($filter_id) || is_null($object_id))
return false;
$state = false;
$favoured = $this->getFavouredObjects($filter_id);
$favoured = array_unique($favoured);
if (in_array($object_id, $favoured)) {
$state = false;
mysql_query("DELETE FROM `autosearch_favoured` WHERE filter_id='$filter_id' AND `object_id`='$object_id'");
if (($key = array_search(intval($object_id), $favoured)) !== false) {
unset($favoured[$key]);
}
} else {
$state = true;
mysql_query("INSERT INTO `autosearch_favoured` (`filter_id`, `object_id`) VALUES ('$filter_id', '$object_id')");
$favoured[] = intval($object_id);
}
$db = $this->db;
$hasError = false;
$post = clearInputData($_POST);
$get = clearInputData($_GET);
list($objects, $total) = [[],[]];
$favoured = array_unique($favoured);
if (count($favoured) > 0) {
$sql_favoured = "SELECT * FROM objects
WHERE id IN (" . implode(',', $favoured) . ")
ORDER BY date_add DESC
LIMIT {$this->favoured_limit}";
$user = new User;
$user->get($_SESSION['id']);
if ($query = mysql_query($sql_favoured)) {
while ($obj = mysql_fetch_assoc($query)) {
$sqlPhotoInfo = "SELECT oop.sort_order, p.photo
FROM objects_object_photo oop,
object_photo p
WHERE p.id = oop.object_photo_id AND
oop.object_id = $obj[id]
ORDER BY oop.sort_order";
$rezPhotoInfo = mysql_query($sqlPhotoInfo);
if (mysql_num_rows($rezPhotoInfo) > 0) {
while ($photoInfo = mysql_fetch_assoc($rezPhotoInfo)) {
$obj['photo' . $photoInfo['sort_order']] = $photoInfo['photo'];
}
}
if ($raw) {
ob_start();
$hasAutoSearchLayout = true;
$use_advert_budget = ($_SESSION['use_advert_budget']);
include ($_SERVER['DOCUMENT_ROOT'] . "/templates/system__object_new.php");
$item = ob_get_clean();
$objects['favoured'][$obj['id']] = $item;
} else {
$objects['favoured'][$obj['id']] = $obj;
}
$total['favoured']++;
}
} else {
$hasError = true;
}
}
if ($hasError)
return ['error' => mysql_error()];
else
return [
'success' => true,
'total' => $total['favoured'],
'state' => $state,
'favoured' => $objects['favoured'],
'perpage' => 10,
];
}
public function addObjectToIgnored($filter_id = null, $object_id = null) {
if (is_null($filter_id) || is_null($object_id))
return false;
$ignored = $this->getIgnoredObjects($filter_id);
$ignored = array_unique($ignored);
if (is_array($ignored)) {
if (!is_null($object_id)) {
$sql = "INSERT INTO `autosearch_ignored` (`filter_id`, `object_id`) VALUES ('$filter_id', '$object_id')";
if (!mysql_query($sql)) {
return ['success' => false, 'error' => mysql_error()];
} else {
mysql_query("DELETE FROM `autosearch_favoured` WHERE filter_id='$filter_id' AND `object_id`='$object_id'");
return ['success' => true];
}
} else {
return ['success' => false, 'error' => "Не указан ИД объекта."];
}
}
return ['success' => false, 'error' => "Ошибка обновления списка игнорируемых объектов"];
}
public function addObjectToViewed($filter_id = null, $object_id = null) {
if (is_null($filter_id) || is_null($object_id))
return false;
$viewed = $this->getViewedObjects($filter_id);
$viewed = array_unique($viewed);
if (is_array($viewed)) {
if (!in_array($object_id, $viewed)) {
$sql = "INSERT INTO `autosearch_viewed` (`filter_id`, `object_id`) VALUES ('$filter_id', '$object_id')";
if (!mysql_query($sql))
return ['error' => mysql_error()];
else
return ['success' => true];
} else {
return ['success' => false];
}
}
return ['error' => "Ошибка обновления списка просмотренных объектов"];
}
public function addObjectToSended($filter_id = null, $object_id = null) {
if (is_null($filter_id) || is_null($object_id))
return false;
$sended = $this->getSendedObjects($filter_id);
$sended = array_unique($sended);
if (is_array($sended)) {
if (!in_array($object_id, $sended)) {
$sql = "INSERT INTO `autosearch_sended` (`filter_id`, `object_id`) VALUES ('$filter_id', '$object_id')";
if (!mysql_query($sql))
return ['error' => mysql_error()];
else
return ['success' => true];
} else {
return ['success' => false];
}
}
return ['error' => "Ошибка обновления списка отправленных объектов"];
}
public function clearAllResults($filter_id = null, $clean_up = false) {
if (is_null($filter_id))
return false;
if ($clean_up)
return self::cleanUpResults($filter_id, true);
else
return true;
}
public function syncObjectToFilter($filter_id = null, $object_id = null, $req_id = null, $clean_up = false, $onlyRegionUpdate = false) {
$errors = [];
if (is_null($object_id))
return false;
if ($clean_up && !is_null($filter_id))
self::cleanUpResults($filter_id, true);
$sql = "SELECT `objects`.*,
`location`.address,
`location`.latitude,
`location`.longitude,
`location`.rf_region_rayon,
(SELECT `id` FROM `rayon` WHERE `rayon` = (
SELECT rf_region_rayon FROM object_location WHERE object_id = `objects`.`id`)
AND `rayon` != '') AS `region_rayon`
FROM `objects` AS `objects`
LEFT JOIN `object_location` AS `location` on `location`.`object_id` = `objects`.`id`
WHERE `objects`.`id` = '$object_id' LIMIT 1";
if ($query = mysql_query($sql)) {
if (mysql_num_fields($query)) {
if ($object = mysql_fetch_assoc($query)) {
$deal_type = null;
if (isset($object['operation_type'])) {
if (intval($object['operation_type']) == 0)
$deal_type = 1;
else if (intval($object['operation_type']) == 1)
$deal_type = 2;
}
$price = null;
if (isset($object['stoim']))
$price = intval($object['stoim']);
if (!$price && isset($object['initial_object_stoim']))
$price = intval($object['initial_object_stoim']);
$target = 3;
$address = trim($object['adres']);
if (!empty($object['address']))
$address = trim($object['address']);
$region = null;
if (intval($object['id_rf_region']) > 0) {
$region = $object['id_rf_region'];
$sql = "SELECT * FROM `rf_regions`
WHERE (
`id` = '$object[id_rf_region]' OR
`parent` = '$object[id_rf_region]'
) AND
`parent` != 0";
if ($query = mysql_query($sql)) {
if (mysql_num_rows($query) > 0) {
while($row = mysql_fetch_assoc($query)) {
if (strpos(trim($row['name']), $address) !== false)
$region = $row['id'];
if (strpos(trim(str_replace('область', 'обл', $row['name'])), $address) !== false)
$region = $row['id'];
}
}
} else {
$errors[] = mysql_error();
}
}
if ((int)$region == 1) { // Москва, Московская обл
if (strpos(trim($address), "Москва") !== false)
$region = 80;
else if (strpos(trim($address), "Московская обл") !== false)
$region = 53;
} else if ((int)$region == 2) { // Санкт-Петербург, Ленинградская область
if (strpos( trim($address), "Санкт-Петербург") !== false)
$region = 81;
else if (strpos(trim($address), "Ленинградская обл") !== false)
$region = 50;
} else if ((int)$region == 3) { // Крым и Севастополь
if (strpos( trim($address), "Республика Крым") !== false)
$region = 94;
else if (strpos( trim($address), "Крым") !== false)
$region = 94;
if (strpos(trim($address), "Севастополь") !== false)
$region = 95;
}
$regions_arr = [];
if (!in_array((int)$region, [80, 53, 81, 50, 94, 95]) && strlen((string)$region) <= 2) {
$sql_regions = "SELECT * FROM `rf_regions` WHERE `parent`='$region'";
if ($query_regions = mysql_query($sql_regions)) {
if (mysql_num_rows($query_regions) > 0) {
$regions_arr[] = (int)$region;
while($row = mysql_fetch_assoc($query_regions)) {
$regions_arr[] = (int)$row['id'];
}
}
} else {
$errors[] = mysql_error();
}
}
if (!empty($regions_arr))
$regions_arr = array_map('strval', $regions_arr);
$rayon = null;
if (intval($object['rayon']) > 0)
$rayon = intval($object['rayon']);
if (empty($rayon) && intval($object['region_rayon']) > 0)
$rayon = trim($object['region_rayon']);
if ($onlyRegionUpdate && (intval($filter_id) && intval($req_id))) {
if (intval($req_id))
$params = $this->getFilterByReq(intval($req_id), (int)$_SESSION['id']);
else
$params = $this->getFilter(intval($filter_id), (int)$_SESSION['id']);
$params['regions'] = ($region) ? (!empty($regions_arr) ? json_encode($regions_arr) : json_encode([(string)$region])) : null;
$params['rayons'] = ($rayon) ? json_encode([(string)$rayon]) : null;
$params['comment'] .= " Обновлен регион/район (".date('d.m.Y в H:i:s').").";
} else {
$params = [
'deal_type' => $deal_type,
'object_type' => intval($object['type']),
'category_type' => isset($object['type_category']) ? intval($object['type_category']) : null,
'object_source' => $target,
'regions' => ($region) ? (!empty($regions_arr) ? json_encode($regions_arr) : json_encode([(string)$region])) : null,
'rayons' => ($rayon) ? json_encode([(string)$rayon]) : null,
'rent_srok' => isset($object['srok']) ? intval($object['srok']) : null,
'stoim_ot' => ($price > 0) ? round($price - ($price / 100 * 10)) : null,
'stoim_do' => ($price > 0) ? round($price + ($price / 100 * 10)) : null,
'komn_ot' => isset($object['komnat']) ? intval($object['komnat']) : null,
'komn_do' => isset($object['komnat']) ? intval($object['komnat']) : null,
'rooms' => (isset($object['komnat']) && $object['komnat']) ? [$object['komnat']] : null,
'is_active' => 1,
'req_id' => intval($req_id),
'comment' => "Автоматический фильтр для Заявки «Спрос по нашему объекту» (".date('d.m.Y в H:i:s').").",
];
}
$results = $this->addEditFilter($filter_id, $params, !(intval($req_id) > 0), true);
if ($results['success']) {
$filter_id = intval($results['id']);
} else {
$errors[] = $results['error'];
}
}
}
} else {
$errors[] = mysql_error();
}
return [
'success' => (count($errors) == 0),
'filter_id' => $filter_id,
'sql' => $results['sql'],
'errors' => $errors,
];
}
public function getSummaryResults($filter_id = null, $offset = null, $order = null, $perpage = null, $sphinx = true, $raw = false) {
if ($match = $this->getResults($filter_id, 'match', $offset, $order, $perpage, $sphinx, $raw)) {
$this->_filter['count'] += intval($match['count']);
$this->_filter['total'] += intval($match['total']);
if ($match['error'] !== $this->_filter['error'])
$this->_filter['error'] .= (!empty($this->_filter['error']) ? " " : '') . $match['error'];
}
if ($similar = $this->getResults($filter_id, 'similar', $offset, $order, $perpage, $sphinx, $raw)) {
$this->_filter['count'] += intval($similar['count']);
$this->_filter['total'] += intval($similar['total']);
if ($similar['error'] !== $this->_filter['error'])
$this->_filter['error'] .= (!empty($this->_filter['error']) ? " " : '') . $similar['error'];
}
if (empty($this->_filter['error']))
$this->_filter['error'] = null;
}
public function buildTelegramMessage($results = null, $user_id = null, $max_objects = 5) {
if (count($results) > 0 && !is_null($user_id)) {
$message = '';
foreach ($results as $filter_id => $result) {
if (isset($_GET['dev'])) {
echo "<pre style='max-height:240px; overflow: auto;'>" . var_export([
'user_id' => (int)$user_id,
'who_work' => (int)$result['who_work'],
'filter_id' =>(int)$filter_id,
'asfilter_id' => (int)$result['filter_id'],
'telegram_notify' => (int)$result['telegram_notify'],
'try_to_build' => (intval($result['telegram_notify']) == 1 && ((int)$result['filter_id'] == (int)$filter_id) && ((int)$result['who_work'] == (int)$user_id)),
], true) . "</pre>";
}
if (intval($result['telegram_notify']) == 1 && (int)(int)$result['who_work'] == (int)$user_id) {
if (isset($_GET['dev'])) {
echo "<h5 style='color:#9dd046;'>Build Telegram message for User ID: $user_id</h5><hr/>";
}
if (count($result['objects']['match']) > 0) {
$message .= "\n\n"."По Вашей заявке «$result[req]» (клиент: ". $result['client']['fio'].", " . '<a href="tel:'.$result['client']['phone'].'">' . $result['client']['phone'] . '</a>' . " появились новые результаты поиска."."\n"."\n";
if (count($result['objects']['match']) > 0) {
$message .= "Точно соответствуют критериям поиска <code>+$result[match_count]</code>, вот некоторые из них:"."\n";
$count = 0;
foreach ($result['objects']['match'] as $object) {
if ($count >= $max_objects)
break;
switch ($object['operation_type']) {
case 0 :
$message .= '- объект аренды';
break;
case 1 :
$message .= '- объект продажи';
break;
case 2 :
$message .= '- объект в новостройке';
break;
}
$token = md5($object['id'].time().$user_id);
$sql_token = "INSERT INTO object_view_autosarch (object_id, user_id, token) VALUES ({$object['id']}, {$user_id}, '{$token}')";
//file_put_contents(__DIR__.'/log_obj.txt', $sql_token. "\n", FILE_APPEND);
mysql_query($sql_token);
//$message .= ' <a href="https://joywork.ru/object.php?id=' . $object['id'] . '" target="_blank">' . $object['nazv'] . '</a> (ID: ' . $object['id'] . ')';
$message .= ' <a href="https://joywork.ru/object-view-autosarch.php?token=' . $token . '" target="_blank">' . $object['nazv'] . '</a> (ID: ' . $object['id'] . ')';
if (!empty($object['stoim']))
$message .= ' стоимостью ' . number_format($object['stoim'], 0, ',', ' ') . ' руб.';
if (!empty($object['adres']))
$message .= ' расположенный по адресу: ' . $object['adres'];
if (!empty($object['sobstv']) || !empty($object['phone']))
$message .= '. Контакты: ' . (!empty($object['sobstv']) ? $object['sobstv'] : "") .
(
(!empty($object['sobstv']) && !empty($object['phone'])) ? ", " . '<a href="tel:'.$object['phone'].'">'.$object['phone'].'</a>' :
(!empty($object['phone']) ? '<a href="tel:'.$object['phone'].'">'.$object['phone'].'</a>' : "")
);
$message .= "\n\n";
$count++;
}
} else {
$message .= "<em>Нет точно соответствующих критериям поиска объектов.</em>"."\n\n";
}
// if (count($result['objects']['similar']) > 0) {
// $message .= "Подобные варианты <code>+$result[similar_count]</code>, вот некоторые из них:"."\n";
// $count = 0;
// foreach ($result['objects']['similar'] as $object) {
// if ($count >= $max_objects)
// break;
// switch ($object['operation_type']) {
// case 0 :
// $message .= '- объект аренды';
// break;
// case 1 :
// $message .= '- объект продажи';
// break;
// case 2 :
// $message .= '- объект в новостройке';
// break;
// }
// $message .= ' <a href="https://joywork.ru/object.php?id=' . $object['id'] . '" target="_blank">' . $object['nazv'] . '</a> (ID: ' . $object['id'] . ')';
// if (!empty($object['stoim']))
// $message .= ' стоимостью ' . number_format($object['stoim'], 0, ',', ' ') . ' руб.';
// if (!empty($object['adres']))
// $message .= ' расположенный по адресу: ' . $object['adres'];
// if (!empty($object['sobstv']) || !empty($object['phone']))
// $message .= '. Контакты: ' . (!empty($object['sobstv']) ? $object['sobstv'] : "") .
// (
// (!empty($object['sobstv']) && !empty($object['phone'])) ? ", " . '<a href="tel:'.$object['phone'].'">'.$object['phone'].'</a>' :
// (!empty($object['phone']) ? '<a href="tel:'.$object['phone'].'">'.$object['phone'].'</a>' : "")
// );
// $message .= "\n\n";
// $count++;
// }
// } else {
// $message .= "<em>Подобных вариантов нет.</em>"."\n\n";
// }
}
}
}
if (!empty($message))
return $message."\n\n";
else
return false;
}
return false;
}
public function getSummaryInfo($agent_id = null, $only_active = false, $telegram_notify = false) {
if (!is_null($agent_id)) {
$sql = "SELECT `filters`.*,
`filters`.`telegram_notify` AS `telegram_notify`,
`results`.*,
`req`.`name` AS `req`,
`req`.`type_id` AS `req_type_id`,
`req`.`asfilter_id` AS `asfilter_id`,
`req`.`who_work` AS `who_work`,
`client`.`fio` AS `client_fio`,
`client`.`id` AS `client_id`,
`client`.`phone` AS `client_phone`,
`client`.`email` AS `client_email`,
DATE_FORMAT(`filters`.`newbilding_date`, '%d.%m.%Y %H:%i') as newbilding_date,
DATE_FORMAT(`filters`.`build_year`, '%Y') as build_year
FROM `autosearch_filters` AS `filters`
LEFT JOIN `autosearch_results` AS `results` ON `results`.`filter_id` = `filters`.`id`
LEFT JOIN `requisitions` AS `req` ON `req`.`id` = `filters`.`req_id`
LEFT JOIN `clients` AS `client` ON `client`.`id` = `req`.`client_id`
WHERE (`filters`.`created_by` = '$agent_id' OR `filters`.`updated_by` = '$agent_id') ";
if ($only_active)
$sql .= " AND `is_active` = '1'";
if ($telegram_notify)
$sql .= " AND `telegram_notify` = '1'";
$sql .= " ORDER BY `results`.`processed_at` DESC";
$query = mysql_query($sql);
$summary = [];
if (mysql_num_rows($query)) {
while($filter = mysql_fetch_assoc($query)) {
$info = [];
$info['filter_id'] = $filter['id'];
$info['req_id'] = $filter['req_id'];
$info['req'] = $filter['req'];
$info['client_id'] = $filter['client_id'];
$info['client'] = [
'fio' => $filter['client_fio'],
'phone' => $filter['client_phone'],
'email' => $filter['client_email'],
];
$count_match = 0;
$count_similar = 0;
$objects = [];
if ($results = self::getResults($filter['id'], 'match', 0, 1000, true, false)) {
foreach($results['results'] as $obj) {
if (!in_array($obj['id'], $results['viewed'])) {
$objects['match'][] = $obj;
$count_match++;
}
}
}
if ($results = self::getResults($filter['id'], 'similar', 0, 1000, true, false)) {
foreach($results['results'] as $obj) {
if (!in_array($obj['id'], $results['viewed'])) {
$objects['similar'][] = $obj;
$count_similar++;
}
}
}
$info['match_count'] = $count_match;
$info['similar_count'] = $count_similar;
$info['objects'] = $objects;
$summary[] = $info;
}
}
return $summary;
}
return false;
}
public function getResults($filter_id = null, $section = null, $offset = null, $sort_order = null, $perpage = null, $sphinx = true, $raw = false) {
$gmtmsk = get_time_zone_user();
$time_zone = '';
if($gmtmsk >= 0){
$time_zone = '+'.$gmtmsk.' hour';
} else {
$time_zone = '-'.$gmtmsk.' hour';
}
if (!$this->enabled) {
return [
'results' => [],
'count' => 0,
'total' => 0,
'perpage' => intval($perpage),
'error' => 'Авто (-реверсивный) поиск выключены!',
'viewed' => [],
'ignored' => [],
'favoured' => [],
'sended' => []
];
}
if (is_null($filter_id))
return false;
if (is_null($section))
$section = 'match';
$ids = [];
$error = '';
$objects = [];
$meta = self::getMetaResults(intval($filter_id));
$favoured_ids = array_unique(array_map('intval', $meta['favoured']));
$viewed_ids = array_unique(array_map('intval', $meta['viewed']));
$sended_ids = array_unique(array_map('intval', $meta['sended']));
$ignored_ids = array_unique(array_map('intval', $meta['ignored']));
if (isset($meta['error']))
$error = $meta['error'];
switch($section) {
case 'match' :
$ids = array_diff(array_unique(array_map('intval', $meta['results']['match'])), $ignored_ids);
break;
case 'similar' :
$ids = array_diff(array_unique(array_map('intval', $meta['results']['similar'])), $ignored_ids);
break;
case 'favoured' :
//$ids = $favoured_ids;
$ids = array_diff(array_map('intval', $favoured_ids), array_map('intval', $ignored_ids));
break;
case 'sended' :
$ids = $sended_ids;
break;
default :
return false;
}
$ids = array_unique(array_map('intval', $ids));
$total = 0;
if (!is_null($this->_user) && !$this->_user->can('autosearch')) {
$error = 'У вас недостаточно прав для выполнения этой операции.';
} else {
if (count($ids) > 0) {
$where = [];
$order = [];
if ($sphinx) {
if (!is_null($sort_order) && is_array($sort_order)) {
if ($sort_order['company']) {
$agency_id = User::getUserAgencyID();
$usersIds = User::getAllAgencyUsers($agency_id);
if (empty($usersIds))
$usersIds = [$_SESSION['id']];
$where[] = "AND id_add_user IN (".implode(',', $usersIds).")";
$order[] = 'id_add_user DESC';
}
if ($sort_order['price']) {
$order[] = 'stoim ASC';
}
if ($sort_order['with_commission']) {
$where[] = 'AND commission > 0';
}
if ($sort_order['with_photo']) {
$where[] = 'AND is_photo = 1';
}
}
if (count($order) == 0) {
$order[] = 'date_add DESC, ads_source DESC';
$total = count($ids);
}
} else {
if (!is_null($sort_order) && is_array($sort_order)) {
if ($sort_order['company']) {
$agency_id = User::getUserAgencyID();
$usersIds = User::getAllAgencyUsers($agency_id);
$where[] = "AND `objects`.`id_add_user` IN (".implode(',', $usersIds).")";
$order[] = '`objects`.`id_add_user` DESC';
}
if ($sort_order['price']) {
$order[] = 'AND `objects`.`stoim` ASC';
}
if ($sort_order['with_commission']) {
$where[] = 'AND `objects`.`commission` > 0';
}
if ($sort_order['with_photo']) {
$photos = [];
for ($i = 1; $i <= 20; $i++) {
$photos[] = "`objects`.`photo$i` <> ''";
}
$where[] = "AND (" . implode(" OR ", $photos) . ")";
}
}
if (count($order) == 0) {
$order[] = '`objects`.`date_add` DESC, `ads_objects`.`ads_source` DESC';
$total = count($ids);
}
}
if ($sort_order['not_viewed']) {
$ids = array_diff($ids, $viewed_ids);
}
if ($sort_order['not_sended']) {
$ids = array_diff($ids, $sended_ids);
}
//$where[] = " AND is_advert_enabled_or_rscan = 1";
if ($sphinx)
$sql_objects_count = "SELECT count(*) as total FROM objects, objects_delta";
else
$sql_objects_count = "SELECT count(DISTINCT id) as total FROM objects";
$sql_objects_count .= " WHERE id IN (" . implode(',', $ids) . ")
" . implode(' ', $where);
if ($sphinx)
$sql_objects_count .= " OPTION max_matches=1000000";
$new_total = 0;
$sql_objects_count = trim(preg_replace('/\s\s+/', ' ', $sql_objects_count));
if ($query = $this->db->query($sql_objects_count)) {
$res = $this->db->fetch_assoc($query);
$new_total = intval($res['total']);
}
$limit = "LIMIT 1000";
if (!is_null($offset) && !is_null($perpage)) {
$limit = "LIMIT ".intval($offset).", ".intval($perpage);
}
if ($sphinx)
$sql_objects = "SELECT * FROM objects, objects_delta";
else
$sql_objects = "SELECT * FROM objects";
$sql_objects .= " WHERE id IN (" . implode(',', $ids) . ")
" . implode(' ', $where) . "
ORDER BY " . implode(', ', $order) . "
$limit";
if ($sphinx)
$sql_objects .= " OPTION max_matches=1000000";
$sql_objects = trim(preg_replace('/\s\s+/', ' ', $sql_objects));
if ($new_total && ($query = $this->db->query($sql_objects, true))) {
if (true || $new_total > 0) {
if ($total == 0)
$total = $new_total;
while ($obj = $this->db->fetch_assoc($query)) {
$sql_photo = "SELECT oop.sort_order,
p.photo
FROM objects_object_photo oop,
object_photo p
WHERE p.id = oop.object_photo_id AND
oop.object_id = $obj[id]
ORDER BY oop.sort_order";
$rezPhotoInfo = mysql_query($sql_photo);
if (mysql_num_rows($rezPhotoInfo) > 0) {
while ($photoInfo = mysql_fetch_assoc($rezPhotoInfo)) {
$obj['photo' . $photoInfo['sort_order']] = $photoInfo['photo'];
}
}
$obj_id = (string)$obj['id'];
if ($raw) {
ob_start();
if (!isset($user) || is_null($user))
$user = $this->_user;
global $SROK_ARENDY;
$hasAutoSearchLayout = true;
$use_advert_budget = ($_SESSION['use_advert_budget']);
include ($_SERVER['DOCUMENT_ROOT'] . "/templates/system__object_new.php");
$item = ob_get_clean();
$objects[$obj_id] = $item;
} else {
$objects[] = $obj_id;
}
}
} else {
$total = 0;
$error = "Нет объектов доступных для отображения.";
}
} else {
$total = 0;
}
} else {
$total = 0;
//$error = "Нет объектов доступных для отображения.";
}
}
return [
'ids' => !empty($ids) ? array_map('intval', $ids) : null,
'results' => $objects,
'count' => !empty($ids) ? count(array_diff($ids, $viewed_ids)) : 0,
'total' => $total,
'perpage' => intval($perpage),
'error' => (!empty($error) ? $error : (!empty($meta['error']) ? $meta['error'] : null)),
'sql' => (!empty($sql_objects) ? $sql_objects : null),
'viewed' => $viewed_ids,
'ignored' => $ignored_ids,
'favoured' => $favoured_ids,
'sended' => $sended_ids
];
}
public function reverseSearch($object_or_id = null, $offset = 0, $perpage = 25, $only_active = true, $only_count = true, $all_agency = true, $strict = true) {
$agents_ids = \User::getAllAgencyUsers();
$currentUserId = $_SESSION['id'];
session_write_close();
if (!$this->enabled) {
return [
'requisitions' => [],
'total' => 0,
'time' => "0s.",
'error' => 'Авто (-реверсивный) поиск выключены!',
];
}
$errors = [];
$object = null;
$start = microtime(true);
$fields = self::getFields(true);
if (!is_array($object_or_id)) {
$object_id = $object_or_id;
$sql = "SELECT `objects`.*,
(SELECT id_metro FROM sp_metro WHERE id_obj = `objects`.`id` LIMIT 1) AS `id_metro`,
(SELECT address FROM object_location WHERE object_id = `objects`.`id` LIMIT 1) AS `address`,
(SELECT latitude FROM object_location WHERE object_id = `objects`.`id` LIMIT 1) AS `latitude`,
(SELECT longitude FROM object_location WHERE object_id = `objects`.`id` LIMIT 1) AS `longitude`
FROM `objects`
WHERE `id` = '$object_id' LIMIT 1";
if ($query = mysql_query($sql)) {
if (mysql_num_fields($query))
$object = mysql_fetch_assoc($query);
}
} else {
$object = $object_or_id;
}
$requisitions = [];
if (!is_array($object)) {
return [
'requisitions' => [],
'total' => 0,
'time' => round((microtime(true) - $start), 2) . "s.",
'error' => 'Ошибка получения объекта к сравнению',
];
} else {
$object_id = $object['id'];
$sql_lazy = "SELECT `req`.`id`
FROM `autosearch_filters` AS `filters`
LEFT JOIN `autosearch_results` AS `results` ON `results`.`filter_id` = `filters`.`id`
LEFT JOIN `requisitions` AS `req` ON `req`.`id` = `filters`.`req_id`
LEFT JOIN `requisitions_type` AS `type` ON `req`.`type_id` = `type`.`id`
LEFT JOIN `clients` AS `clients` ON `clients`.`id` = `req`.`client_id`
WHERE `results`.`match_ids` LIKE CONCAT('%\"', '$object_id', '\"%') AND
`filters`.`is_reverse` = '1' AND
`filters`.`created_by` IN (" .implode(',', $agents_ids). ") AND `req`.`cancel` != 1 AND `req`.`deleted` != 1 AND (`type`.`id` IN (1, 4) OR `type`.`parent_id` IN (1, 4))
GROUP BY `req`.`id` LIMIT 1000;";
//var_export($sql_lazy) && die();
if ($query = mysql_query($sql_lazy)) {
if (mysql_num_rows($query)) {
while ($filter = mysql_fetch_assoc($query)) {
$requisitions[] = $filter['id'];
}
}
}
}
if ($object['type'] != 4 && $object['type_category'] != 0) // Fix: убираем тип коммерции для не коммерческой недвижимости
$object['type_category'] = 0;
if ($object['operation_type'] != 0 && $object['srok'] != 0) // Fix: убираем срок аренды для не арендных объектов
$object['srok'] = 0;
list($where, $join) = [[],[]];
foreach ($object as $prop => $value) {
$prop = trim($prop);
if (isset($fields[$prop]) && !empty($value) && $value != 0) {
if ($fields[$prop]['reverse_search']) {
if ($column = trim($fields[$prop]['column'])) {
if ($prop == 'operation_type')
continue;
if ($prop == 'type')
continue;
if ($prop == 'type_category')
continue;
switch ($column) {
case 'deal_type' :
case 'object_type' :
case 'category_type' :
case 'stoim' :
//case 'komn' :
case 'sq_all' :
case 'ploshad_k' :
case 'etazh' :
case 'el_power' :
case 'ceiling_height' :
case 'commerc_year' :
case 'building_area' :
$where[] = "((
`filters`.`".$column."_ot` IS NULL OR (`objects`.`$prop` != 0 AND `objects`.`$prop` >= `filters`.`".$column."_ot`)
) AND (
`filters`.`".$column."_do` IS NULL OR (`objects`.`$prop` != 0 AND `objects`.`$prop` <= `filters`.`".$column."_do`)
))";
break;
case 'do_metro' :
case 'do_metro_type' :
$where[] = "((`filters`.`geo` IS NULL AND (
`filters`.`do_metro` IS NULL OR (
(`objects`.`peshkom` <= `filters`.`do_metro` AND `filters`.`do_metro_type` = 1) OR
(`objects`.`transport` <= `filters`.`do_metro` AND `filters`.`do_metro_type` = 2)
)
)) OR `filters`.`geo` IS NOT NULL)";
break;
case 'metro_stations' :
if (!empty($value)) {
if ($object['rayon'] == 0)
$where[] = "((`filters`.`geo` IS NULL AND `filters`.`metro_stations` LIKE '%\"$value\"%') OR `filters`.`geo` IS NOT NULL)";
else
$where[] = "((`filters`.`geo` IS NULL AND (`filters`.`metro_stations` IS NULL OR `filters`.`metro_stations` LIKE '%\"$value\"%')) OR `filters`.`geo` IS NOT NULL)";
} else {
$where[] = "((`filters`.`geo` IS NULL AND `filters`.`metro_stations` LIKE CONCAT('%\"', `sp_metro`.`id_metro`, '\"%')) OR `filters`.`geo` IS NOT NULL)";
$join[] = "JOIN `sp_metro` AS `sp_metro` ON `sp_metro`.`id_obj` = `objects`.`id`";
}
break;
case 'regions' :
// Исключаем регион, если указана конкретная станция метро
if (isset($object['id_metro']))
break;
if (empty($object['address']))
$object['address'] = $object['adres'];
$region_id = null;
if ($object['id_rf_region'] == 1 || $object['id_rf_region'] == 2) {
if (!is_bool(strpos($object['address'], "Ленинградская обл")))
$region_id = 50; // Ленинградская область
else if (!is_bool(strpos($object['address'], "Санкт-Петербург")))
$region_id = 81; // Санкт-Петербург
else if (!is_bool(strpos($object['address'], "Санкт Петербург")))
$region_id = 81; // Санкт Петербург
else if (!is_bool(strpos($object['address'], "Московская обл")))
$region_id = 53; // Московская обл
else if (!is_bool(strpos($object['address'], "Москва")))
$region_id = 80; // Москва
if ($region_id)
$where[] = "(`filters`.`regions` IS NULL OR `filters`.`$column` LIKE '%\"$region_id\"%')";
} else {
$sql = "SELECT id, parent FROM rf_regions WHERE id=$object[id_rf_region] OR parent=$object[id_rf_region]";
$query = mysql_query($sql);
$regions = [];
while ($region = mysql_fetch_assoc($query)) {
if ($region['id'])
$regions[] = $region['id'];
if ($region['parent'])
$regions[] = $region['parent'];
}
$_where = [];
$regions = array_unique($regions);
foreach ($regions as $region) {
$_where[] = "`filters`.`$column` LIKE '%\"$region\"%'";
}
if (!empty($_where))
$where[] = "(`filters`.`regions` IS NULL OR (".implode(' OR ', $_where)."))";
}
// Только заявки автопоиска без указания станции метро
if (!isset($object['id_metro']))
$where[] = "(`filters`.`metro_stations` IS NULL)";
break;
case 'rayons' :
$where[] = "((`filters`.`geo` IS NULL AND (`filters`.`rayons` IS NULL OR `filters`.`$column` LIKE '%\"$value\"%')) OR `filters`.`geo` IS NOT NULL)";
break;
case 'opis' :
$where[] = "(`filters`.`opis` IS NULL OR `objects`.`opis` LIKE CONCAT('%&quot;', `filters`.`opis`, '&quot;%'))";
break;
default :
if ($fields[$prop]['multiple'])
$where[] = "(`filters`.`$column` IS NULL OR `filters`.`$column` LIKE CONCAT('%\"', `objects`.`$prop`, '\"%'))";
else
$where[] = "(`filters`.`$column` IS NULL OR `objects`.`$prop` = `filters`.`$column`)";
break;
}
}
}
} else {
$errors[] = 'Параметр `'.$prop.'` не найден в коллекции параметров автопоиска.';
}
}
$rooms_where = [];
if (!empty($object['komnat'])) {
if ((int)$object['komnat'] >= 1 && (int)$object['komnat'] <= 3)
$rooms_where[] = "`filters`.`rooms` LIKE '%\"$object[komnat]\"%'";
else if ((int)$object['komnat'] >= 4)
$rooms_where[] = "`filters`.`rooms` LIKE '%\"4\"%'";
}
if (isset($object['studio_flag'])) {
if (intval($object['studio_flag'] == 1)) {
$rooms_where[] = "`filters`.`rooms` LIKE '%\"5\"%'";
}
}
if (!empty($rooms_where)) {
$where[] = "(`filters`.`rooms` IS NULL OR `filters`.`rooms` = '[]' OR (".implode(' OR ', $rooms_where)."))";
}
if (!empty($object['latitude']) && !empty($object['longitude'])) {
$join[] = "JOIN `object_location` AS `location` ON `location`.`object_id` = `objects`.`id`";
$where[] = "(`filters`.`geo` IS NULL OR (
JSON_VALID(`filters`.`geo`) AND (
ST_CONTAINS(ST_PolygonFromText(CONCAT('POLYGON(( ', REPLACE(JSON_EXTRACT(`filters`.`geo`, '$.poly1[0]'), '\"', ''), ' ))')), POINT(`location`.`latitude`, `location`.`longitude`)) OR
ST_CONTAINS(ST_PolygonFromText(CONCAT('POLYGON(( ', REPLACE(JSON_EXTRACT(`filters`.`geo`, '$.poly2[0]'), '\"', ''), ' ))')), POINT(`location`.`latitude`, `location`.`longitude`)) OR
ST_CONTAINS(ST_PolygonFromText(CONCAT('POLYGON(( ', REPLACE(JSON_EXTRACT(`filters`.`geo`, '$.poly3[0]'), '\"', ''), ' ))')), POINT(`location`.`latitude`, `location`.`longitude`)) OR
ST_CONTAINS(ST_PolygonFromText(CONCAT('POLYGON(( ', REPLACE(JSON_EXTRACT(`filters`.`geo`, '$.poly4[0]'), '\"', ''), ' ))')), POINT(`location`.`latitude`, `location`.`longitude`))
)
))";
}
$sql = '';
$time = 0;
$total = 0;
//$total = count($requisitions);
if (count($where) > 0) {
$select_count = "SELECT COUNT(`req`.`id`) ";
$select = "SELECT `req`.`id` ";
$sql = "FROM `autosearch_filters` AS `filters`
LEFT JOIN `requisitions` AS `req` ON `req`.`id` = `filters`.`req_id`
LEFT JOIN `requisitions_type` AS `type` ON `req`.`type_id` = `type`.`id`
LEFT JOIN `clients` AS `clients` ON `clients`.`id` = `req`.`client_id`
JOIN `objects` AS `objects` " . implode(' ', $join) . "
WHERE `req`.`cancel` != 1 AND `req`.`deleted` != 1 ";
$sql .= " AND (`type`.`id` IN (1, 4) OR `type`.`parent_id` IN (1, 4))";
if ($strict)
$sql .= " AND (" . implode(' AND ', $where) . ")";
else
$sql .= " AND (" . implode(' OR ', $where) . ")";
$deal_type = 0;
if ($object['operation_type'] == 0)
$deal_type = 1;
else if ($object['operation_type'] == 1)
$deal_type = 2;
else if ($object['operation_type'] == 3)
$deal_type = 3;
if ($deal_type)
$sql .= " AND `filters`.`deal_type` = '$deal_type'";
if ($object['type'])
$sql .= " AND `filters`.`object_type` = '$object[type]'";
if ($object['type_category'])
$sql .= " AND `filters`.`category_type` = '$object[type_category]'";
$user_id = $_SESSION['id'];
if ($all_agency) {
$agency_id = User::getUserAgencyID($currentUserId);
$usersIds = User::getAllAgencyUsers($agency_id);
$sql .= " AND (`filters`.`created_by` IN (" . implode(', ', $usersIds) . ") OR `filters`.`updated_by` IN (" . implode(', ', $usersIds) . "))";
} else {
$sql .= " AND (`filters`.`created_by` = '$user_id' OR `filters`.`updated_by` = '$user_id')";
}
if ($only_active)
$sql .= " AND `filters`.`is_active` = '1'";
$sql .= " AND `req`.`deleted` <> '1' AND `objects`.`id` = '$object[id]'";
$group = " GROUP BY `req`.`id`";
$order = " ORDER BY `req`.`created_at` DESC, `filters`.`created_by` ASC, `filters`.`updated_by` ASC, `filters`.`created_by` DESC";
$limit = " LIMIT 1000";
if (!is_null($offset) && !is_null($perpage)) {
$limit = " LIMIT $offset, $perpage";
}
$sql_count = $select_count . $sql . $group;
$sql_match = $select . $sql . $group . $order . $limit;
$total += mysql_num_rows(mysql_query($sql_count));
$sql_watched_count = "SELECT COUNT(req.id)
FROM watched_requisitions AS watched
LEFT JOIN requisitions AS req ON req.id = watched.req_id
WHERE watched.object_id = '$object[id]'
AND watched.watched = 1
AND watched.user_id = $user_id";
$result = mysql_query($sql_watched_count);
$watched_count = mysql_result($result, 0);
$has_items = false;
if ($total > 0) {
$has_items = true;
}
if ($only_count) {
return [
'total' => $total - $watched_count,
'time' => round((microtime(true) - $start), 2) . "s.",
'sql' => (in_array($_SESSION['id'], [4, 6635, 5427])) ? str_replace(["\n","\t","\r"], "", $sql_match) : null,
'sql_count' => (in_array($_SESSION['id'], [4, 6635, 5427])) ? str_replace(["\n","\t","\r"], "", $sql_count) : null,
'object' => $object,
'has_items' => $has_items,
];
}
$query = mysql_query($sql_match);
if (mysql_num_rows($query)) {
while ($filter = mysql_fetch_assoc($query)) {
$requisitions[] = $filter['id'];
}
}
} else {
$errors[] = 'Ошибка составления запроса сравнения';
}
return [
'requisitions' => $requisitions,
'sql' => (in_array($_SESSION['id'], [4, 6635, 5427, 13596])) ? str_replace(["\n","\t","\r"], "", $sql_match) : null,
'sql_count' => (in_array($_SESSION['id'], [4, 6635, 5427, 13596])) ? str_replace(["\n","\t","\r"], "", $sql_count) : null,
//'error' => null,
'offset' => $offset,
'perpage' => $perpage,
'time' => round((microtime(true) - $start), 2) . "s.",
'total' => $total,
'errors' => $errors
];
}
public function search($filter_id = null, $offset = 0, $perpage = null, $sphinx = true) {
if (!$this->enabled) {
$info = [];
if ($filter = self::getFilter($filter_id, null, true, false)) {
$info = [
'filter_id' => $filter['id'],
'req_id' => $filter['req_id'],
'who_work' => $filter['who_work'],
'req' => $filter['req'],
'telegram_notify' => (int)$filter['telegram_notify'],
'client_id' => $filter['client_id'],
'created_by' => $filter['created_by'],
'updated_by' => $filter['updated_by'],
'client' => [
'fio' => $filter['client_fio'],
'phone' => $filter['client_phone'],
'email' => $filter['client_email'],
],
];
}
return array_merge($info, [
'count' => 0,
'match_count' => 0,
'similar_count' => 0,
'total' => 0,
'objects' => [],
'time' => 0,
'error' => 'Авто (-реверсивный) поиск выключены!'
]);
}
$info = [];
$error = '';
$start = microtime(true);
///
list($total, $count) = [ 0,0 ];
# #
// // //
list($ids, $results) = [[],[]];//\\//\\
// // // //
if (!is_null($this->_user) && !$this->_user->can('autosearch')) {
$error = 'У вас недостаточно прав для выполнения этой операции.';
} else {
if (!(is_null($filter_id) || !$filter_id)) {
// Очистим старые результаты и сервисные записи
self::cleanUpResults($filter_id);
if ($filter = self::getFilter($filter_id, null, true, false)) {
$info = [
'filter_id' => $filter['id'],
'req_id' => $filter['req_id'],
'who_work' => $filter['who_work'],
'req' => $filter['req'],
'telegram_notify' => (int)$filter['telegram_notify'],
'client_id' => $filter['client_id'],
'created_by' => $filter['created_by'],
'updated_by' => $filter['updated_by'],
'client' => [
'fio' => $filter['client_fio'],
'phone' => $filter['client_phone'],
'email' => $filter['client_email'],
],
];
$sqls = self::getSearchQuery($filter, $offset, $perpage, $sphinx);
if ($sqls['success']) {
$ex_ids = $sqls['ex_ids'] || [];
$sql_obj_match_count = $sqls['match_count'];
$info['sql']['match_count'] = $sql_obj_match_count;
if ($res_query = $this->db->query($sql_obj_match_count)) {
$res_count = $this->db->fetch_assoc($res_query);
$total += intval($res_count['total']);
} else if (isset($_GET['dev'])) {
var_export($sql_obj_match_count);
var_export($total);
}
/*$sql_obj_similar_count = $sqls['similar_count'];
$info['sql']['similar_count'] = $sql_obj_similar_count;
if ($res_query2 = $this->db->query($sql_obj_similar_count)) {
$res_count2 = $this->db->fetch_assoc($res_query2);
$total += intval($res_count2['total']);
} else if (isset($_GET['dev'])) {
var_export($sql_obj_similar_count);
var_export($total);
}*/
$sql_obj_match = $sqls['match'];
$info['sql']['match'] = $sql_obj_match;
/*$sql_obj_similar = $sqls['similar'];
$info['sql']['similar'] = $sql_obj_similar;*/
if (isset($_GET['dev'])) {
var_export($sql_obj_match);
//var_export($sql_obj_similar);
}
if ($total > 0) {
$query_obj_match = $this->db->query($sql_obj_match);
//$query_obj_similar = $this->db->query($sql_obj_similar);
//$query_obj_similar = false;
if ($query_obj_match) {
// $results = array_merge($results, [
// 'match' => [],
// 'similar' => []
// ]);
$results['match'] = [];
$ids['match'] = [];
//if ($query_obj_match) {
if ($this->db->num_rows($query_obj_match)) {
while($object = $this->db->fetch_assoc($query_obj_match)) {
if (!in_array($object['id'], $ex_ids)) {
$results['match'][] = $object;
$ids['match'][] = $object['id'];
$count++;
} /*else {
$total--;
}*/
//$total--;
}
}
//}
$ex_ids_match = [];
// if ($query_obj_similar) {
// if ($this->db->num_rows($query_obj_similar)) {
// $ex_ids_match = array_merge($ex_ids, (count($ids['match']) > 0) ? $ids['match'] : []);
// while($object = $this->db->fetch_assoc($query_obj_similar)) {
// if (!in_array($object['id'], $ex_ids_match)) {
// $results['similar'][] = $object;
// $ids['similar'][] = $object['id'];
// $count++;
// } /*else {
// $total--;
// }*/
// $total--;
// }
// }
// }
$time_overage = round((microtime(true) - $start), 2);
if ($time_overage > 2.0) {
$log_entry = [
'timestamp' => date('Y-m-d H:i:s'),
'filter_id' => $filter_id,
'user_id' => isset($filter['created_by']) ? $filter['created_by'] : null,
'req_id' => isset($filter['req_id']) ? $filter['req_id'] : null,
'client_fio' => isset($filter['client_fio']) ? $filter['client_fio'] : null,
'execution_sec' => $time_overage,
'total_results' => $total,
'excluded_ids_count' => count(isset($ex_ids) ? $ex_ids : []),
'match_query' => isset($sql_obj_match) ? $sql_obj_match : null,
'error' => $error ?: null
];
$log_path = $_SERVER['DOCUMENT_ROOT'] . '/logs/autosarch_slow.log';
file_put_contents($log_path, json_encode($log_entry, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) . "\n", FILE_APPEND | LOCK_EX);
}
// $match_ids = "[]";
// if (count($ids['match']) > 0)
// $match_ids = json_encode($ids['match']);
$sql_prev = "SELECT match_ids, similar_ids, processed_at FROM autosearch_results WHERE filter_id = " . intval($filter_id) . " ORDER BY processed_at DESC LIMIT 1";
$query_prev = mysql_query($sql_prev);
$prev_match_ids = [];
$prev_similar_ids = [];
$prev_processed_at = null;
if ($query_prev && mysql_num_rows($query_prev) > 0) {
$row_prev = mysql_fetch_assoc($query_prev);
$decoded_match = json_decode($row_prev['match_ids'], true);
$decoded_similar = json_decode($row_prev['similar_ids'], true);
$prev_processed_at = $row_prev['processed_at'];
// Убедимся, что это массивы
if (is_array($decoded_match)) {
$prev_match_ids = $decoded_match;
}
if (is_array($decoded_similar)) {
$prev_similar_ids = $decoded_similar;
}
} else {
file_put_contents($_SERVER['DOCUMENT_ROOT'] . '/telegramm_error_new.log',
date('Y-m-d H:i:s') . " - AutoSearch::search (filter_id: $filter_id): No previous results found in autosearch_results.\n",
FILE_APPEND | LOCK_EX
);
}
$all_prev_ids = array_unique(array_merge($prev_match_ids, $prev_similar_ids));
file_put_contents($_SERVER['DOCUMENT_ROOT'] . '/telegramm_error_new.log',
date('Y-m-d H:i:s') . " - AutoSearch::search (filter_id: $filter_id): Prev. processed_at: $prev_processed_at, Before array_diff - ids['match'] count: " . count($ids['match']) . ", prev_match_ids count: " . count($prev_match_ids) . ", prev_similar_ids count: " . count($prev_similar_ids) . ", all_prev_ids count: " . count($all_prev_ids) . "\n",
FILE_APPEND | LOCK_EX
);
if (!empty($ids['match'])) {
$new_match_ids = array_diff($ids['match'], $all_prev_ids);
// Логируем количество найденных новых ID
file_put_contents($_SERVER['DOCUMENT_ROOT'] . '/telegramm_error_new.log',
date('Y-m-d H:i:s') . " - AutoSearch::search (filter_id: $filter_id): array_diff result count: " . count($new_match_ids) . "\n",
FILE_APPEND | LOCK_EX
);
$ids['match'] = array_values($new_match_ids);
} else {
file_put_contents($_SERVER['DOCUMENT_ROOT'] . '/telegramm_error_new.log',
date('Y-m-d H:i:s') . " - AutoSearch::search (filter_id: $filter_id): ids['match'] was empty before array_diff.\n",
FILE_APPEND | LOCK_EX
);
file_put_contents($_SERVER['DOCUMENT_ROOT'] . '/telegramm_error_new.log',
date('Y-m-d H:i:s') . " - AutoSearch::search (filter_id: $filter_id): After array_diff - ids['match'] count: " . count($ids['match']) . "\n",
FILE_APPEND | LOCK_EX
);
}
$match_ids = !empty($ids['match']) ? json_encode($ids['match']) : '[]';
$similar_ids = "[]";
// if (count($ids['similar']) > 0)
// $similar_ids = json_encode($ids['similar']);
//$total = ($total/2) + $count;
$error2 = '';
// if ($total == $count)
// $error2 = 'Новые объекты не найдены.';
//
// if ($count < 0)
// $count = 0;
if ($count == 0)
$error2 = 'Новые объекты не найдены.';
$sql_res = "INSERT INTO `autosearch_results` (
`filter_id`,
`count`,
`total`,
`match_ids`,
`similar_ids`,
`time_overage`,
`error`
) VALUES (
'$filter_id',
'$count',
'$total',
'$match_ids',
'$similar_ids',
'$time_overage',
'$error2'
)";
if (!mysql_query($sql_res)) {
$error = 'Ошибка записи результатов поиска.';
//$error = $sql_res;
}
} else {
$error = 'Ошибка выборки результатов поиска.';
}
} else {
$error = 'Новые объекты не найдены.';
}
} else {
$error = 'Ошибка составления критериев поиска.';
}
}
/*if (isset($_GET['dev'])) {
var_export($info);
}*/
if (!empty($error)) {
self::cleanUpResults($filter_id);
$time_overage = round((microtime(true) - $start), 2);
$sql_res = "INSERT INTO `autosearch_results` (
`filter_id`,
`error`,
`time_overage`
) VALUES (
'$filter_id',
'$error',
'$time_overage'
)";
mysql_query($sql_res);
}
} else {
$error = 'Фильтр автопоиска не был найден.';
}
}
return array_merge($info, [
'count' => $count,
'match_count' => count($ids['match']),
'similar_count' => count($ids['similar']),
'total' => $total,
'objects' => $results,
'time' => (microtime(true) - $start),
'error' => (!empty($error)) ? $error : null
]);
}
public function run($limit = 500, $offset = 0, $telegram_notice = false, $direct_access = false) {
if (isset($_GET['dev'])) {
error_reporting(E_ALL & ~E_RECOVERABLE_ERROR);
ini_set('display_errors', 1);
ob_start();
}
if (!$this->enabled)
return [];
$sql = "SELECT `filters`.*,
`filters`.`telegram_notify` AS `telegram_notify`,
`req`.`name` AS `req`,
`req`.`type_id` AS `req_type_id`,
`req`.`asfilter_id` AS `asfilter_id`,
`req`.`who_work` AS `notify_user`,
`users`.`id` AS `user_id`,
`users`.`telegramm_chat_id` AS `telegramm_chat_id`,
`users`.`telegramm_date` AS `telegramm_date`,
`users`.`max_notice` AS `max_notice`,
`users`.`max_user_id` AS `max_user_id`,
`users`.`gmtmsk` AS `gmtmsk`
FROM `autosearch_filters` AS `filters`
LEFT JOIN `autosearch_results` AS `results` ON `results`.`filter_id` = `filters`.`id`
LEFT JOIN `requisitions` AS `req` ON `req`.`id` = `filters`.`req_id`
LEFT JOIN `users` AS `users` ON `users`.`id` = `req`.`who_work`";
if (!isset($_GET['user_id'])) {
if (intval(date('i')) <= 15)
$sql .= " WHERE `results`.`processed_at` IS NULL";
else
$sql .= " WHERE (`results`.`processed_at` IS NULL OR `results`.`processed_at` < DATE_SUB(NOW(), INTERVAL 15 MINUTE))";
} else {
$sql .= " WHERE true";
}
$sql .= " AND `filters`.`req_id` IS NOT NULL
AND `filters`.`is_active` = '1'
AND `filters`.`is_search` = '1'
AND `req`.`deleted` <> 1 ";
if (isset($_GET['user_id'])) {
$sql .= " AND `req`.`who_work` = " . intval($_GET['user_id']);
echo "<pre style='max-height:240px; overflow: auto;'>Who work user ID: " . intval($_GET['user_id']) . "</pre>";
}
$sql .= " GROUP BY `filters`.`id` ORDER BY `results`.`processed_at` DESC";
if (!is_null($limit))
$sql .= " LIMIT " . $limit;
else
$sql .= " LIMIT 1000";
if (isset($_GET['dev'])) {
echo "<pre style='max-height:240px; overflow: auto;'>Filters SQL: " . var_export($sql, true) . "</pre>";
}
$results = array();
if ($query = mysql_query($sql)) {
if (mysql_num_rows($query)) {
while ($row = mysql_fetch_assoc($query)) {
if (isset($_GET['dev'])) {
echo "<pre style='max-height:240px; overflow: auto;'>" . var_export($row, true) . "</pre>";
}
$filter_id = $row['id'];
$user_id = $row['notify_user'];
$result = self::search($filter_id, $offset, 100, true); // выборка по 100 объектов за поиск для 1-го фильтра
$results[] = $result;
if (!empty($result) && $telegram_notice) {
$max = new MaxClass();
$bot = new Telegram(false);
if (isset($_GET['dev'])) {
echo "<h4 style='color:#4687d0;'>Telegram</h4><hr/>";
}
if (isset($row['telegramm_chat_id']) && $row['telegramm_chat_id'] > 0) {
$chatId = $row['telegramm_chat_id'];
$message = self::buildTelegramMessage([$filter_id => $result], $user_id);
if ($message && is_string($message)) {
if (isset($_GET['dev'])) {
echo "<h5 style='color:#d09946;'>Start Telegram chat to user {$user_id}, chat ID: $chatId</h5><hr/>";
}
$message = "<b>Автопоиск (подбор) объектов</b>" . $message;
try {
if (isset($_GET['dev'])) {
echo "<h6>Message:</h6><div style='max-height:140px; overflow-y: auto;'>" . $message . "</div>";
}
if (mb_strlen($message) > 4096) {
$i = 0;
$messages = [];
foreach (preg_split("/(\r\n|\n|\r)/", $message) as $string) {
if ((mb_strlen($string) + mb_strlen($messages[$i])) <= 4020) {
$messages[$i] .= $string . "\n";
} else {
$i++;
$messages[$i] .= $string . "\n";
}
}
foreach ($messages as $message) {
$result1 = $bot->send($message, $chatId);
echo "<h6 style='color:#4c8538;'>Status: $result1[ok]</h6>";
}
} else {
$result1 = $bot->send($message, $chatId);
if (isset($_GET['dev'])) {
// file_put_contents($_SERVER['DOCUMENT_ROOT'] . '/telegramm_error_new.log',
// date('Y-m-d H:i:s') . " - Отправлено полное сообщение. Chat ID: " . $chatId . "\n",
// FILE_APPEND | LOCK_EX);
// file_put_contents($_SERVER['DOCUMENT_ROOT'] . '/telegramm_error_new.log',
// date('Y-m-d H:i:s') . " - Ответ Telegram: Message ID = " . $result->getMessageId() . ", Chat ID = " . $result->getChat()->getId() . "\n",
// FILE_APPEND | LOCK_EX);
//echo "<h6 style='color:#4c8538;'>Status: $result</h6>";
$msg_id = $result1 ? $result1['result']['message_id'] : 'null';
$chat_id_resp = $result1 && $result1['result']['chat'] ? $result1['result']['chat']['id'] : 'null';
echo "<h6 style='color:#4c8538;'>Отправлено: message_id=$msg_id, chat_id=$chat_id_resp</h6>";
}
}
} catch (Exception $e) {
file_put_contents($_SERVER['DOCUMENT_ROOT'] . '/telegramm_error_new.log',
date('Y-m-d H:i:s') . " - ОШИБКА отправки: " . $e->getMessage() . " | Chat ID: " . $chatId . ' '.$message. "\n",
FILE_APPEND | LOCK_EX);
echo "<h6 style='color:#a4402c;'>Send error: $e</h6>";
// file_put_content($_SERVER['DOCUMENT_ROOT']."/".telegramm_error.log.$e->getMessage(), )
}
}
}
if (isset($row['max_user_id']) && $row['max_user_id'] > 0 && $row['max_notice'] > 0) {
if (isset($_GET['dev'])) {
echo "<h5 style='color:#d09946;'>Start max chat to user {$user_id}, chat ID: {$max_user_id}</h5><hr/>";
}
$max_user_id = $row['max_user_id'];
$message = self::buildTelegramMessage([$filter_id => $result], $user_id);
if ($message && is_string($message)) {
$message = "<b>Автопоиск (подбор) объектов</b>" . $message;
try {
if (isset($_GET['dev'])) {
echo "<h6>Message:</h6><div style='max-height:140px; overflow-y: auto;'>" . $message . "</div>";
}
if (mb_strlen($message) > 4096) {
$i = 0;
$messages = [];
foreach (preg_split("/(\r\n|\n|\r)/", $message) as $string) {
if ((mb_strlen($string) + mb_strlen($messages[$i])) <= 4020) {
$messages[$i] .= $string . "\n";
} else {
$i++;
$messages[$i] .= $string . "\n";
}
}
foreach ($messages as $message) {
$result1 = $max->send_messages_to_user($max_user_id, $message);
/*file_put_contents($_SERVER['DOCUMENT_ROOT'] . '/max_error_new.log',
date('Y-m-d H:i:s') . " - отправлено: " . $e->getMessage() . " | User ID: " . $max_user_id . ' '.json_encode($result1, JSON_UNESCAPED_UNICODE). "\n",
FILE_APPEND | LOCK_EX);*/
echo "<h6 style='color:#4c8538;'>Status: $result[ok]</h6>";
}
} else {
$result1 =$max->send_messages_to_user($max_user_id, $message);
/*file_put_contents($_SERVER['DOCUMENT_ROOT'] . '/max_error_new.log',
date('Y-m-d H:i:s') . " - отправлено: " . $e->getMessage() . " | User ID: " . $max_user_id . ' '.json_encode($result1, JSON_UNESCAPED_UNICODE). "\n",
FILE_APPEND | LOCK_EX);*/
}
} catch (Exception $e) {
file_put_contents($_SERVER['DOCUMENT_ROOT'] . '/max_error_new.log',
date('Y-m-d H:i:s') . " - ОШИБКА отправки: " . $e->getMessage() . " | Chat ID: " . $max_user_id . ' '.$message. "\n",
FILE_APPEND | LOCK_EX);
echo "<h6 style='color:#a4402c;'>Send error: $e</h6>";
// file_put_content($_SERVER['DOCUMENT_ROOT']."/".telegramm_error.log.$e->getMessage(), )
}
}
}
}
}
}
} else {
return mysql_error();
}
if (isset($_GET['dev'])) {
$debug_output = ob_get_clean();
echo "<div style='background:#f8f8f8; padding:10px; border:1px solid #ccc; font-size:12px;'>";
echo "<h4>DEBUG OUTPUT</h4><pre>" . htmlspecialchars($debug_output) . "</pre></div>";
}
return $results;
}
}