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

9199 lines
334 KiB
PHP
Raw 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
include $_SERVER['DOCUMENT_ROOT'] . '/import/obj/ImportRecord.php';
include $_SERVER['DOCUMENT_ROOT'] . '/import/obj/Building.php';
include $_SERVER['DOCUMENT_ROOT'] . '/import/helper/Date.php';
include $_SERVER['DOCUMENT_ROOT'] . '/import/Clock/Clock.php';
include $_SERVER['DOCUMENT_ROOT'] . '/import/Clock/RealtimeClock.php';
require_once($_SERVER['DOCUMENT_ROOT'] . '/engine/classes/phpexcel/Classes/PHPExcel.php');
require_once($_SERVER['DOCUMENT_ROOT'] . '/engine/classes/phpexcel/Classes/PHPExcel/IOFactory.php');
require_once($_SERVER['DOCUMENT_ROOT'] . '/engine/classes/phpexcel/Classes/PHPExcel/Writer/Excel2007.php');
//ini_set('display_errors', '1');
//ini_set('display_startup_errors', '1');
//error_reporting(E_ALL);
class Complex
{
private $user = null;
private $types_comples = array();
private $db = null;
private $sphinx = null;
private $sphinx2 = null;
private $table = 'complex_list';
private $paymentTypes = array();
private $housingClass = array();
private $complex;
private $objRequisitionsArray = false;
private $objPricesArray = false;
private $userIds = array();
private $filter = array();
private $page_obj = 1;
private $page = 1;
private $limit = 10;
private $listDecorations = array();
private $user_id = 0;
public function __construct($db = null)
{
if ($db) {
$this->db = $db;
} else {
$pdo = new MysqlPdo(hst, ndb, user, pass);
$sql = "SET NAMES 'utf8mb4'";
$pdo->query($sql);
$this->db = $pdo;
}
$this->set_types_complex();
}
public function createImport($document) {
$this->set_user();
$result = $this->uploadFile($document, 'ImportDocuments');
if ($result) {
$file_content = file_get_contents($result);
if ($this->endsWith($result, 'csv')) {
$data = $this->parseCsv(mb_convert_encoding($file_content, 'utf-8'));
} else if($this->endsWith($result, 'xlsx')) {
$temp_name = tempnam(sys_get_temp_dir(), 'tmp-xlsx');
file_put_contents($temp_name, $file_content);
$type = PHPExcel_IOFactory::identify($temp_name);
$objReader = PHPExcel_IOFactory::createReader($type);
$objPHPExcel = $objReader->load($temp_name);
$data = [];
foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) {
// $worksheets[$worksheet->getTitle()] = $worksheet->toArray();
$data = $worksheet->toArray('');
break;
}
} else {
return ['status' => false, 'message' => "Format not supported"];
}
$columns = [];
$rows_count = 10;
foreach ($data as $rowIndex => $row) {
foreach ($row as $key => $value) {
if ($rowIndex < $rows_count) {
$value = is_string($value) ? str_replace('"', "`", $value) : $value;
$value = is_string($value) ? preg_replace('/\s/', "&nbsp;", $value) : $value;
if (isset($columns[$key])) {
$columns[$key][] = $value;
} else {
$columns[$key] = [$value];
}
}
}
}
$response = ['head' => isset($data[0]) ? $data[0] : [] ,'body' => $columns];
$insertSql = "INSERT INTO complex_house_import SET user_id = {$this->user_id}, document = '{$result}', step = 2, document_preview = '" . json_encode($response, JSON_UNESCAPED_UNICODE) . "'";
$status = $this->db->query($insertSql);
if ($status) {
$response['id'] = (int)$this->db->insert_id();
$response['step'] = 2;
return $response;
}
}
return $result;
}
public function getImportHouse($import_id) {
$this->set_user();
$sql = $this->db->query("SELECT * FROM complex_house_import WHERE id = $import_id AND user_id = {$this->user_id}");
$import = $this->db->fetch_assoc($sql);
$import['document_preview'] = json_decode(str_replace('&nbsp;', " ", $import['document_preview']), true);
$import['house_name_to_id'] = json_decode($import['house_name_to_id'], true);
$import['dynamic_fields'] = json_decode($import['dynamic_fields'], true);
$import['mapping_fields'] = json_decode($import['mapping_fields'], true);
return $import;
}
public function getImportHouseStatus($import_id) {
$this->set_user();
$sql = $this->db->query("SELECT status, step FROM complex_house_import WHERE id = $import_id AND user_id = {$this->user_id}");
$import = $this->db->fetch_assoc($sql);
return $import;
}
public function getHomeById($house_id){
$sql = $this->db->query("
SELECT
house.name,
ent.position AS entrance,
floor.position AS floor,
crn.note,
room.*,
cs.name AS status,
house.name AS house_name
FROM complex_rooms room
JOIN complex_floors floor ON room.floor_id = floor.id
JOIN complex_entrances ent ON floor.complex_entrance_id = ent.id
JOIN complex_houses house ON ent.complex_house_id = house.id
LEFT JOIN complex_status cs ON cs.id = room.complex_status_id
LEFT JOIN complex_room_notes crn ON room.id = crn.room_id
WHERE house.id = $house_id
");
while($import = $this->db->fetch_assoc($sql)){
$import['attibutes'] = $this->getAttrById($import['id']);
$house[] = $import;
}
return $house;
}
public function getAttrById($room_id){
$attr = [];
$sql = $this->db->query("
SELECT * FROM complex_rooms_attribute WHERE complex_room_id = $room_id
");
while($import = $this->db->fetch_assoc($sql)){
$attr[] = $import;
}
return $attr;
}
public function downloadHouse($house_id, $complex_name)
{
// НИЧЕГО не выводим!
while (ob_get_level() > 0) { ob_end_clean(); }
// На всякий случай — не печатать ошибки в поток ответа
ini_set('display_errors', '0');
ini_set('display_startup_errors', '0');
error_reporting(E_ALL);
// set_user может кидать Notice — обернём
if (method_exists($this, 'set_user')) {
try { $this->set_user(); } catch (\Throwable $e) { /* молча */ }
}
// --- Утилита числовой очистки
$toInt = function ($value) {
if (is_numeric($value)) return (float)$value;
if (is_string($value)) {
$clean = preg_replace('/[^\d\-\.\,]/u', '', $value);
$clean = str_replace(',', '.', $clean);
if ($clean !== '' && is_numeric($clean)) return (float)$clean;
}
return $value;
};
// --- Получаем данные
$house = $this->getHomeById($house_id);
if (!is_array($house)) $house = [];
// --- Справочники
$typeMapping = [
'apartment' => 'Квартира',
'apartments' => 'Апартаменты',
'parking_space' => 'Машиноместо',
'office' => 'Офис',
'storage_room' => 'Кладовка',
'warehouse' => 'Склад',
'retail_space' => 'Торговое Помещение',
'commercial_space' => 'Помещение свободного назначения',
'townhouse' => 'Таунхаус',
'villa' => 'Вилла',
'penthouse' => 'Пентхаус',
'duplex' => 'Дуплекс',
'cottage' => 'Коттедж',
];
$planningMapping = [
'none_of_the_above' => '',
'studio' => 'Студия',
'european_layout' => 'Европланировка',
'available' => 'Свободная планировка',
];
$window_placement_id = $this->get_windows_placements() ?: [];
$decoration_types = $this->get_decoration_types() ?: [];
// var_dump($window_placement_id);die;
// --- Сборка строк данных
$excelData = [];
foreach ($house as $room) {
$roomsAreas = [];
$balconiesAreas = [];
$loggiasAreas = [];
$bathroomsAreas = [];
// var_dump($room['decoration_id']);
// ВНИМАНИЕ: у тебя было 'attibutes'. Если в БД ключ 'attributes', то поправь:
$attrs = [];
if (!empty($room['attributes']) && is_array($room['attributes'])) {
$attrs = $room['attributes'];
} elseif (!empty($room['attibutes']) && is_array($room['attibutes'])) {
$attrs = $room['attibutes'];
}
foreach ($attrs as $attr) {
if (empty($attr['attribute_type']) || !isset($attr['area'])) continue;
switch ($attr['attribute_type']) {
case 'room': $roomsAreas[] = $attr['area']; break;
case 'balcony': $balconiesAreas[] = $attr['area']; break;
case 'loggia': $loggiasAreas[] = $attr['area']; break;
case 'bathroom': $bathroomsAreas[] = $attr['area']; break;
}
}
$roomAreaStr = implode(';', $roomsAreas);
$bathroomAreaStr = implode(';', $bathroomsAreas);
$balconyLoggiaStr = '';
if (!empty($loggiasAreas)) {
foreach ($loggiasAreas as $a) {
$a = trim(preg_replace('/\s+/', '', (string)$a));
$balconyLoggiaStr .= 'Лоджия:' . $a . ';';
}
}
if (!empty($balconiesAreas)) {
foreach ($balconiesAreas as $a) {
$a = trim(preg_replace('/\s+/', '', (string)$a));
$balconyLoggiaStr .= 'Балкон:' . $a . ';';
}
}
// var_dump($room);die;
$balconyLoggiaStr = rtrim($balconyLoggiaStr, ';');
$balconyLoggiaStr = preg_replace('/\s*;\s*/', ';', $balconyLoggiaStr);
// Собираем строку данных. КЛЮЧИ ДОЛЖНЫ СОВПАДАТЬ С ЗАГОЛОВКАМИ В ШАБЛОНЕ!
$row = [
'Номер квартиры*' => isset($room['number']) ? $room['number'] : '',
'Полная стоимость, руб*' => isset($room['total_amount']) ? $toInt($room['total_amount']) : '',
'Название ЖК*' => $complex_name ?: '',
'Дом*' => isset($room['house_name']) ? $room['house_name'] : '',
'Подъезд*' => isset($room['entrance']) ? $room['entrance'] : '',
'Этаж*' => isset($room['floor']) ? $room['floor'] : '',
'Статус помещения*' => isset($room['status']) ? $room['status'] : '',
'Цена в рассрочку, руб' => (isset($room['installment_price']) && (!empty($room['payment_types']) && strpos($room['payment_types'], 'INSTALLMENT') !== false)) ? $toInt($room['installment_price']) : '',
'Ипотека' => (!empty($room['payment_types']) && strpos($room['payment_types'], 'MORTGAGE') !== false) ? 'Да' : '',
'Номер на площадке' => isset($room['on_site_number']) ? $room['on_site_number'] : '',
'Код планировки' => isset($room['layout_code']) ? $room['layout_code'] : '',
'Тип помещения*' => isset($typeMapping[$room['type']]) ? $typeMapping[$room['type']] : 'Квартира',
'Особенности планировки' => isset($planningMapping[$room['layout_feature']]) ? $planningMapping[$room['layout_feature']] : '',
'Кол-во комнат*' => isset($room['rooms_count']) ? $room['rooms_count'] : '',
'Общая площадь, м2*' => isset($room['area']) ? $toInt($room['area']) : '',
'Жилая площадь, м2' => isset($room['living_area']) ? $toInt($room['living_area']) : '',
'Площадь кухни, м2' => isset($room['kitchen_area']) ? $toInt($room['kitchen_area']) : '',
'Расчетная площадь, м2' => isset($room['estimated_area']) ? $toInt($room['estimated_area']) : '',
'Описание' => isset($room['description']) ? $room['description'] : '',
'Куда выходят окна' => (!empty($room['windows_placement_id']) && !empty($window_placement_id[$room['windows_placement_id']-1]['name']))
? $window_placement_id[$room['windows_placement_id']-1]['name'] : '',
'Высота потолков' => isset($room['ceiling_height']) ? $toInt($room['ceiling_height']) : '',
'Кол-во лоджий' => isset($room['loggias_count']) ? (int)$room['loggias_count'] : '',
'Кол-во балконов' => isset($room['balconies_count']) ? (int)$room['balconies_count'] : '',
'Кол-во совмещенных санузлов' => isset($room['combined_bathrooms_count']) ? (int)$room['combined_bathrooms_count'] : '',
'Кол-во раздельных санузлов' => isset($room['seperated_bathrooms_count']) ? (int)$room['seperated_bathrooms_count'] : '',
'Отделка' => (!empty($room['decoration_id']) && !empty($decoration_types[$room['decoration_id']-1]['name']))
? $decoration_types[$room['decoration_id']-1]['name'] : '',
'Номер помещения для БТИ' => isset($room['bti_room_number']) ? $room['bti_room_number'] : '',
'Общая площадь по БТИ' => isset($room['bti_total_area']) ? $toInt($room['bti_total_area']) : '',
'Площадь без балкона' => isset($room['area_without_balcony']) ? $toInt($room['area_without_balcony']) : '',
'Площадь прихожей, м2' => isset($room['hallway_area']) ? $toInt($room['hallway_area']) : '',
'Общая площадь без жилой, м2' => isset($room['total_area_excl_living']) ? $toInt($room['total_area_excl_living']) : '',
'Общая площадь санузлов, м2' => isset($room['total_bathroom_area']) ? $toInt($room['total_bathroom_area']) : '',
'Общая площадь лоджий/балконов, м2' => isset($room['total_balcony_loggia_area']) ? $toInt($room['total_balcony_loggia_area']) : '',
// Если в шаблоне есть следующие столбцы — раскомментируй и УБЕДИСЬ, что названия совпадают
'Площадь комнаты, м2' => $roomAreaStr,
'Площадь санузла, м2' => $bathroomAreaStr,
'Площадь лоджии/балкона, м2' => $balconyLoggiaStr,
'Примечание' => isset($room['note']) ? $room['note'] : '',
];
// Нормализуем пробелы
$cleanRow = [];
foreach ($row as $k => $v) {
$cleanK = trim(preg_replace('/[\s\x{00A0}]+/u', ' ', (string)$k));
$cleanV = is_string($v) ? trim(preg_replace('/[\s\x{00A0}]+/u', ' ', $v)) : $v;
$cleanRow[$cleanK] = $cleanV;
}
$excelData[] = $cleanRow;
}
// --- Загружаем шаблон
$inputFile = $_SERVER['DOCUMENT_ROOT'] . '/complexes/files/Пример_страницы_для_загрузки_Объектов_в_Дом.xlsx';
if (!file_exists($inputFile)) {
// Нельзя писать в поток — отдадим пустой 400 JSON, чтоб фронт увидел ошибку
http_response_code(400);
header('Content-Type: application/json; charset=utf-8');
echo json_encode(['error' => 'Шаблон не найден: ' . $inputFile], JSON_UNESCAPED_UNICODE);
exit;
}
// Подключи PHPExcel до этого файла: require_once '.../Classes/PHPExcel.php';
$objPHPExcel = PHPExcel_IOFactory::load($inputFile);
$sheet = $objPHPExcel->getActiveSheet();
// --- Читаем заголовки из первой строки шаблона
$headers = [];
$highestColumn = $sheet->getHighestColumn();
$highestColumnIndex = PHPExcel_Cell::columnIndexFromString($highestColumn);
for ($col = 0; $col < $highestColumnIndex; $col++) {
$cellValue = $sheet->getCellByColumnAndRow($col, 1)->getValue();
if ($cellValue instanceof PHPExcel_RichText) {
$cellValue = $cellValue->getPlainText();
}
$headers[] = trim(preg_replace('/[\s\x{00A0}]+/u', ' ', (string)$cellValue));
}
// --- Перезаписываем заголовки (на случай «мусора»)
foreach ($headers as $i => $hdr) {
$sheet->setCellValueByColumnAndRow($i, 1, $hdr);
}
// --- Заполняем строки
$templateRow = 2;
// Получим диапазон последнего столбца
$highestColumn = $sheet->getHighestColumn();
// Функция копирования стилей и валидации
$copyRowFormat = function($srcRow, $dstRow) use ($sheet, $highestColumn) {
// Преобразуем последнюю колонку в индекс (например, 'AF' -> 31)
$highestIndex = PHPExcel_Cell::columnIndexFromString($highestColumn);
for ($i = 0; $i < $highestIndex; $i++) {
$colLetter = PHPExcel_Cell::stringFromColumnIndex($i);
$srcCell = $colLetter . $srcRow;
$dstCell = $colLetter . $dstRow;
// Копируем data validation (выпадающие списки, правила)
$dv = $sheet->getDataValidation($srcCell);
if ($dv) {
$sheet->setDataValidation($dstCell, clone $dv);
}
// Копируем формулу (если есть)
$formula = $sheet->getCell($srcCell)->getValue();
if (is_string($formula) && strpos($formula, '=') === 0) {
$sheet->setCellValue($dstCell, $formula);
}
}
};
$rowNum = 2; // Если строка 2 — инструкции
foreach ($excelData as $dataRow) {
$copyRowFormat(2, $rowNum);
$col = 0;
foreach ($headers as $header) {
$value = array_key_exists($header, $dataRow) ? $dataRow[$header] : '';
$sheet->setCellValueExplicitByColumnAndRow(
$col,
$rowNum,
$value
);
$col++;
}
$rowNum++;
}
// --- Отправляем во фронт как attachment (blob)
$filename = омещения_Дома_' . (preg_replace('/\D+/', '', (string)$house_id) ?: 'export') . '.xlsx';
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
header('Content-Disposition: attachment; filename="' . $filename . '"');
header('Cache-Control: max-age=0');
header('Pragma: public');
// Некоторые прокси любят знать длину — можно не ставить, чтобы не буферизовать целиком.
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
$objWriter->save('php://output');
exit;
}
public function updateImportHouse($data, $import_id) {
$this->set_user();
// complex_house_import
if ($data && $import_id) {
$sql = [];
foreach ($data as $key => $value) {
if (is_string($value)) {
$sql[] = "$key='$value'";
} else if($key == 'step' && ($value == 3 || $value == 4 ) ) {
continue;
} else {
$sql[] = "$key=$value";
}
}
$sql = implode(' ,', $sql);
$sql = "UPDATE complex_house_import SET $sql WHERE id={$import_id} AND user_id = {$this->user_id}";
$query = $this->db->query($sql);
if ($query) {
$import = $this->db->fetch_assoc($this->db->query("SELECT * FROM complex_house_import WHERE id = $import_id"));
if (isset($data['step'])) {
$mapping_fields = json_decode($import['mapping_fields'], true);
if ($data['step'] == 3) {
if (isset($mapping_fields['house_name'])) {
$scriptPath = $_SERVER['DOCUMENT_ROOT'] . '/cron/complexHouseImportGetHouses.php';
$logFile = $_SERVER['DOCUMENT_ROOT'] . '/cron/logs/complexHouseImportGetHouses.log';
// Параметры для передачи
$param1 = $import['id'];
$result=null;
$retval=null;
exec("php $scriptPath $param1 >> $logFile 2>/dev/null &", $result, $retval);
$sql = "UPDATE complex_house_import SET status='get-houses:in_progress' WHERE id={$import_id} AND user_id = {$this->user_id}";
$query = $this->db->query($sql);
} else {
$sql = "UPDATE complex_house_import SET step = 3 WHERE id={$import_id} AND user_id = {$this->user_id}";
$query = $this->db->query($sql);
$import['step'] = 3;
// sleep(1);
return ['status' => true, 'data' => $import];
}
} else if ($data['step'] == 4) {
// return $mapping_fields;
if (!isset($mapping_fields['complex_status_id']) && !isset($mapping_fields['type'])) {
$sql = "UPDATE complex_house_import SET step = 5, status='in_progress' WHERE id={$import_id} AND user_id = {$this->user_id}";
$query = $this->db->query($sql);
if ($query) {
$this->startImportHouse($import_id);
$import['step'] = 5;
return ['status' => true, 'data' => $import, 'message' => 'Starting import',];
}
} else {
$import['step'] = 4;
$sql = "UPDATE complex_house_import SET status='get-statuses-types:in_progress', step=4 WHERE id={$import_id} AND user_id = {$this->user_id}";
$query = $this->db->query($sql);
$scriptPath = $_SERVER['DOCUMENT_ROOT'] . '/cron/complexHouseImportGetStatusesAndTypes.php';
$logFile = $_SERVER['DOCUMENT_ROOT'] . '/cron/logs/complexHouseImportGetStatusesAndTypes.log';
// Параметры для передачи
$param1 = $import['id'];
$result=null;
$retval=null;
exec("php $scriptPath $param1 >> $logFile 2>/dev/null &", $result, $retval);
// sleep(1);
return ['status' => true, 'data' => $import];
}
} else if ($data['step'] == 5) {
$this->startImportHouse($import_id);
return ['status' => true, 'data' => $import, 'message' => 'Starting import',];
}
}
return ['status' => true, 'data' => $import, 'message' => 'Finding houses started',];
}
}
return ['status' => false, 'message' => 'empty id to update'];
}
public function startImportHouse($import_id) {
$this->set_user();
if ($import_id) {
$query = $this->db->query("SELECT id FROM complex_house_import
WHERE id = $import_id
AND step > 3
AND user_id = {$this->user_id}
AND house_name_to_id IS NOT NULL
AND document IS NOT NULL ");
// TODO step
if ($row = $this->db->fetch_assoc($query)) {
$scriptPath = $_SERVER['DOCUMENT_ROOT'] . '/cron/complexHouseImport.php';
$logFile = $_SERVER['DOCUMENT_ROOT'] . '/cron/logs/complexHouseImport.log';
// Параметры для передачи
$param1 = $row['id'];
$result=null;
$retval=null;
exec("php $scriptPath $param1 >> $logFile 2>/dev/null &", $result, $retval);
return [
'status' => true,
'message' => 'Import Started',
];
}
}
return ['status' => false, 'message' => "Invalid parameter id: $import_id"];
}
public function uploadFile($file, $folder) {
$Selectel = SelectelApi::getTokenAndUrl();
$token = $Selectel[0];
$storageUrl = $Selectel[1];
$uploaddir = $_SERVER['DOCUMENT_ROOT'] . "/files/$folder/";
$newPhotos = [];
$originalName = str_replace("0:/", "", $file['name']);
$strArray = explode(".", $originalName);
$ext = end($strArray);
if (!in_array($ext, ['xlsx', 'xls', 'csv'])) {
return ['status' => false, 'message' => 'Формат не подерживается'];
};
$ext = mb_strtolower($ext);
$name = md5(time() . $originalName) . "." . $ext;
$one = mb_substr($name, 0, 1);
$two = mb_substr($name, 1, 1);
$three = mb_substr($name, 3, 1);
$new_path = "$one/$two/$three/$name";
$fp = $uploaddir . $new_path;
if (!is_dir($_SERVER['DOCUMENT_ROOT'] . "/files/")) {
mkdir($_SERVER['DOCUMENT_ROOT'] . "/files/");
}
if (!is_dir($_SERVER['DOCUMENT_ROOT'] . "/files/" . "$folder")) {
mkdir($_SERVER['DOCUMENT_ROOT'] . "/files/$folder");
}
if (!is_dir($_SERVER['DOCUMENT_ROOT'] . "/files/$folder/$one")) {
mkdir($_SERVER['DOCUMENT_ROOT'] . "/files/$folder/$one");
}
$two = mb_substr($name, 1, 1);
if (!is_dir($_SERVER['DOCUMENT_ROOT'] . "/files/$folder/$one/$two")) {
mkdir($_SERVER['DOCUMENT_ROOT'] . "/files/$folder/$one/$two");
}
$three = mb_substr($name, 3, 1);
if (!is_dir($_SERVER['DOCUMENT_ROOT'] . "/files/$folder/$one/$two/$three")) {
mkdir($_SERVER['DOCUMENT_ROOT'] . "/files/$folder/$one/$two/$three");
}
if (is_uploaded_file($file['tmp_name'])) {
move_uploaded_file($file['tmp_name'], $fp);
} else {
rename($file['tmp_name'], $fp);
}
$SelectelApi = new SelectelApi();
$contentType = $ext == 'csv'
? "text/$ext"
: $ext == 'xls'
? "application/vnd.ms-excel"
: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
$r = $SelectelApi->uploadFile($storageUrl, $token, $fp, "/$folder/" . $new_path, $contentType);
//если выложили в Selectel
if ($r) {
$new_path = "https://data.joywork.ru/$folder/" . $new_path;
unlink($fp);
return $new_path;
} else {
// Local fallback: keep local path
return $fp;
}
return null;
}
public function get_complex_entrances($complex_id, $includes, $partner_id = 0)
{
$this->set_user();
$result = array();
$sql = "SELECT complex_entrances.*, ch.name as house_name, ch.parking as house_parking, ch.security as house_security, ch.fenced_area as house_fenced_area, ch.sports_ground as house_sports_ground, ch.play_ground as house_play_ground, ch.school as house_school, ch.kinder_garten as house_kinder_garten, ch.id as house_id, cl.name as complex_name FROM complex_entrances
JOIN complex_houses ch ON ch.id = complex_entrances.complex_house_id AND (ch.deleted_at IS NULL OR ch.deleted_at = '0000-00-00 00:00:00')
JOIN complex_list cl ON cl.id = ch.complex_id
WHERE ch.complex_id={$complex_id}";
// echo($sql);die;
// echo($sql);
// die;
$q = $this->db->query($sql);
while ($entrance = $this->db->fetch_assoc($q)) {
$floors = $this->get_entrance_floors($entrance, $includes, $partner_id);
$entrance['floors'] = $floors;
$result[] = $entrance;
}
return $result;
}
public function get_house_entrances($house_id, $includes, $partner_id = 0, $has_token = false)
{
$this->set_user();
$result = array();
$sql = "SELECT complex_entrances.*, ch.name as house_name, ch.parking as house_parking, ch.security as house_security, ch.fenced_area as house_fenced_area, ch.sports_ground as house_sports_ground, ch.play_ground as house_play_ground, ch.school as house_school, ch.kinder_garten as house_kinder_garten, ch.id as house_id, cl.name as complex_name FROM complex_entrances
JOIN complex_houses ch ON ch.id = complex_entrances.complex_house_id
JOIN complex_list cl ON cl.id = ch.complex_id
WHERE complex_entrances.complex_house_id={$house_id}";
$q = $this->db->query($sql);
while ($entrance = $this->db->fetch_assoc($q)) {
$floors = $this->get_entrance_floors($entrance, $includes, $partner_id, $has_token);
$entrance['floors'] = $floors;
$result[] = $entrance;
}
return $result;
}
public function updatePlanPhotoPosition($image_id, $position)
{
$sql = "UPDATE complex_house_plans_images SET `position` = $position WHERE id = {$image_id}";
$r = $this->db->query($sql);
return array();
}
public function updateHousePlans($plan_ids, $fields)
{
$this->set_user();
$strArray = [];
$ids = implode(', ', $plan_ids);
foreach ($fields as $key => $value) {
if ($key == 'id' || (empty($value) && $value !== 0 && $value !== false)) {
continue;
}
if (is_string($value)) {
$strArray[] = "$key='$value'";
} else if (is_bool($value)) {
$value = (int)$value;
$strArray[] = "$key=$value";
} else {
$strArray[] = "$key=$value";
}
}
$str = implode(', ', $strArray);
$sql = "UPDATE complex_house_plans SET $str WHERE id in ({$ids})";
$this->db->query($sql);
return $fields;
}
public function updateHouseFloorPlans($plan_ids, $floor_ids, $fields, $is_bulk = false)
{
$this->set_user();
$strArray = [];
$ids = implode(', ', $plan_ids);
if (!$is_bulk) {
$sql = "DELETE FROM complex_floors_plans WHERE `floor_plan_id` in ({$ids})";
$q = $this->db->query($sql);
if (!empty($floor_ids)) {
foreach ($floor_ids as $floor_id) {
foreach ($plan_ids as $plan_id) {
$sql = "INSERT INTO complex_floors_plans SET `floor_id` = {$floor_id}, `floor_plan_id` = {$plan_id}";
$q = $this->db->query($sql);
}
}
}
}
foreach ($fields as $key => $value) {
if ($key == 'id' || (empty($value) && $value !== 0 && $value !== false && !is_array($value))) {
continue;
}
if (in_array($key, ['entrances', 'floor_positions'])) {
$value = json_encode($value);
}
if (is_string($value)) {
$strArray[] = "$key='$value'";
} else if (is_bool($value)) {
$value = (int)$value;
$strArray[] = "$key=$value";
} else {
$strArray[] = "$key=$value";
}
}
$str = implode(', ', $strArray);
$sql = "UPDATE complex_house_floor_plans SET $str WHERE id in ({$ids})";
$this->db->query($sql);
$result = array();
foreach ($plan_ids as $id) {
$result[] = $this->get_floor_plan($id);
}
return $result;
}
public function isUsedRoomNumber($room_number, $floor_id) {
$house_id = $this->getFloorHouseId($floor_id);
if ($house_id) {
$find = $this->db->query("SELECT complex_rooms.number FROM complex_rooms
JOIN complex_floors ON complex_floors.id = complex_rooms.floor_id
JOIN complex_entrances ON complex_floors.complex_entrance_id = complex_entrances.id
JOIN complex_houses ON complex_entrances.complex_house_id = complex_houses.id
WHERE complex_houses.id = $house_id
AND complex_rooms.number = '{$room_number}'
");
$row = $this->db->fetch_assoc($find);
return (bool)$row;
}
}
public function generateRoomNumber($floor_id) {
$house_id = $this->getFloorHouseId($floor_id);
if ($house_id) {
$find = $this->db->query("SELECT MAX(CAST(complex_rooms.number AS UNSIGNED)) AS max_value FROM complex_rooms
JOIN complex_floors ON complex_floors.id = complex_rooms.floor_id
JOIN complex_entrances ON complex_floors.complex_entrance_id = complex_entrances.id
JOIN complex_houses ON complex_entrances.complex_house_id = complex_houses.id
WHERE complex_houses.id = $house_id
");
$row = $this->db->fetch_assoc($find);
return $row ? $row['max_value'] + 1 : 1;
}
}
public function getFloorHouseId($floor_id) {
$select = $this->db->query("SELECT complex_houses.id FROM complex_houses
JOIN complex_entrances ON complex_entrances.complex_house_id = complex_houses.id
JOIN complex_floors ON complex_floors.complex_entrance_id = complex_entrances.id
WHERE complex_floors.id = $floor_id
");
$row = $this->db->fetch_assoc($select);
return $row ? $row['id'] : $row;
}
public function getRoomsCountByStatusId($status_id)
{
if (!$status_id) return false;
$q = $this->db->query("SELECT COUNT(id) as count FROM complex_rooms WHERE `complex_status_id` = {$status_id} ");
return $this->db->fetch_assoc($q);
}
public function get_payment_types_list()
{
$sql = "SELECT `code`, `label` FROM `apartment_payment_types` WHERE `is_active` = 1 ORDER BY `label`";
$rez = $this->db->query($sql);
$paymentTypes = array();
if ($this->db->num_rows($rez) > 0) {
while ($dbObject = $this->db->fetch_assoc($rez)) {
$paymentTypes[] = array(
'code' => $dbObject['code'],
'name' => $dbObject['label']
);
}
}
return $paymentTypes;
}
public function sendMessageToTelegram($chat_id, $text, $format = 'html')
{
$token = '793676666:AAGFo66CjsmO2KxZVRwQbH8pLTvenpsHiHI';
require_once $_SERVER['DOCUMENT_ROOT'] . "/telegramm/vendor/autoload.php";
header('Content-Type: application/json');
try {
$bot = new \TelegramBot\Api\Client($token);
$bot->sendMessage($chat_id, $text, $format);
}
catch (Exception $e) {
(new Logger())->error($e->getMessage());
}
}
public function sendMessageToMax($max_user_id, $text)
{
$max = new MaxClass();
$max->send_messages_to_user($max_user_id, $text);
}
public function updateRequisitionWithClientsFunnelStep($room_id, $requisition_id)
{
$sqlSelectClientsFunnelStep = $this->db->query("SELECT cfs.*, fs.name, fs.stage, fs.funnel_id FROM `clients_funnel_step` as `cfs` LEFT JOIN `funnel_steps` as `fs` on cfs.step_id = fs.id WHERE cfs.req_id = {$requisition_id}");
$steps = $this->db->fetch_assoc($sqlSelectClientsFunnelStep);
$sqlSelectRequisitionWhoWork = $this->db->query(
"SELECT
requisitions.`client_id`,
users.*
FROM `requisitions`
LEFT JOIN `users` ON users.`id` = requisitions.`who_work`
WHERE requisitions.`id` = $requisition_id
");
$requisition = $this->db->fetch_assoc($sqlSelectRequisitionWhoWork);
$history_requisition = json_decode($steps['history_requisition'], true);
$clients_funnel_step_id = $steps['id'];
$complex_room_id = NULL;
$complex_status_id = NULL;
$prev_id = 0;
$prev_next_id = 0;
$clientsFunnelStep = null;
$newHistoryRequisition = [];
if ($clients_funnel_step_id)
{
$sqlSelectClientsFunnelStep = $this->db->query("SELECT `step_id` FROM `clients_funnel_step` WHERE `id` = $clients_funnel_step_id");
$clientsFunnelStep = $this->db->fetch_assoc($sqlSelectClientsFunnelStep);
}
foreach($history_requisition as $history)
{
if ($history['complex_room_id'] != $room_id)
{
$complex_room_id = $history['complex_room_id'];
$complex_status_id = $history['complex_status_id'];
$valarr = json_decode(str_replace(["\n", "\t", "\r"], "", $steps['values']), true);
$arr = deClearInputElements($valarr);
$stepArr = json_decode($arr[$history['step_id']], true);
$prev_id = $stepArr['prev_id'] ?: 0;
$prev_next_id = $stepArr['prev_next_id'] ?: 0;
}
if ($clientsFunnelStep && $clientsFunnelStep['step_id']
&& $history['step_id'] != $clientsFunnelStep['step_id']
){
$newHistoryRequisition[] = $history;
}
}
if ((bool)count($history_requisition))
{
$newHistoryRequisition = json_encode($newHistoryRequisition ?: [], JSON_UNESCAPED_UNICODE);
$sqlUpdateClientsFunnelStep = "UPDATE `clients_funnel_step` SET `step_id` = $prev_id, `next_id` = $prev_next_id, `history_requisition` = '{$newHistoryRequisition}' WHERE `id` = $clients_funnel_step_id";
$this->db->query($sqlUpdateClientsFunnelStep);
$sqlUpdateRequisitions = "UPDATE
`requisitions`
SET
`complex_room_id` = '{$complex_room_id}',
`complex_status_id` = '{$complex_status_id}'
WHERE id = $requisition_id";
$this->db->query($sqlUpdateRequisitions);
}
else
{
$sqlUpdateRequisition = "UPDATE `requisitions` SET `complex_room_id` = NULL, `complex_status_id` = 0 WHERE id = $requisition_id";
$this->db->query($sqlUpdateRequisition);
}
if ($requisition)
{
$text = "Заявка была исключена из очереди на бронирование.";
$client_id = $requisition['client_id'];
$now = new DateTime("now");
$create_date = $now->format('Y-m-d H:i:s');
$this->db->query("INSERT INTO `user_client_events` (
`user_id`,
`req_id`,
`client_id`,
`type`,
`comment`,
`create_date`
)
VALUES (
$this->user_id,
$requisition_id,
$client_id,
'comment',
'{$text}',
'{$create_date}'
)
");
if($requisition['telegramm_notice']
&& $requisition['telegramm_notice'] == 1
&& $requisition['telegramm_chat_id']
&& $requisition['telegramm_chat_id'] > 0
){
$text = "Заявка ID $requisition_id была исключена из очереди на бронирование.";
$this->sendMessageToTelegram($requisition['telegramm_chat_id'], $text);;
}
}
$requisitions = $this->get_room_requisitions($room_id);
$this->generate_room_reservations_positions($room_id);
$reservations = $this->get_room_reservations($room_id);
$can_change_queue = $reservations['can_change_queue'];
unset($reservations['can_change_queue']);
$room = $this->db->fetch_assoc(
$this->db->query(
"SELECT
complex_rooms.`id`,
cs.`name` as status_name,
cs.`status` as status_type,
cs.`color` as status_color
FROM `complex_rooms`
LEFT JOIN `complex_status` AS cs ON cs.`id` = complex_rooms.`complex_status_id`
WHERE complex_rooms.`id` = $room_id"
)
);
$complex_status_info = [
'status_name' => $room['status_name'],
'status_type' => $room['status_type'],
'status_color' => $room['status_color']
];
if ($room['status_type'] != 'reservation' && is_array($reservations) && count($reservations))
{
$complex_status_info = [
'status_name' => $reservations[0]['status_name'],
'status_type' => $reservations[0]['status_type'],
'status_color' => $reservations[0]['status_color'],
];
}
return [
'requisitions' => $requisitions,
'reservations' => $reservations,
'can_change_queue' => $can_change_queue,
'complex_status_info' => $complex_status_info
];
}
public function save_attributes($attributes,$room_id)
{
$existing = [];
$new_ids = [];
$q = $this->db->query("SELECT id FROM complex_rooms_attribute WHERE complex_room_id = " . intval($room_id));
while ($row = $this->db->fetch_assoc($q)) {
$existing[] = $row['id'];
}
foreach ($attributes as $attr) {
$attr_type = isset($attr->attribute_type) ? $attr->attribute_type : null;
$area = isset($attr->area) ? floatval($attr->area) : null;
if (isset($attr->id) && in_array($attr->id, $existing)) {
$id = $attr->id;
$new_ids[] = $id;
if (!$attr_type || $area === null) {
$this->db->query("DELETE FROM complex_rooms_attribute WHERE id = $id");
continue;
}
$new_ids[] = $id;
$this->db->query("
UPDATE complex_rooms_attribute
SET attribute_type = '{$attr_type}', area = {$area}
WHERE id = {$id}
");
} else {
if (!$attr_type || $area === null) {
continue;
}
$this->db->query("
INSERT INTO complex_rooms_attribute (complex_room_id, attribute_type, area)
VALUES ('{$room_id}', '{$attr_type}', {$area})
");
}
}
if (!empty($existing)) {
$to_delete = array_diff($existing, $new_ids);
if (!empty($to_delete)) {
$ids = implode(',', array_map('intval', $to_delete));
$this->db->query("DELETE FROM complex_rooms_attribute WHERE id IN ($ids)");
}
}
}
public function update_room($room)
{
$attributes = $room->attributes;
unset($room->attributes);
$room_id = $room->id;
$this->save_attributes($attributes,$room_id);
if ($room->note) {
$note = (string) $room->note;
$note = str_replace("'", "''", $note);
$sql = "SELECT COUNT(*) as count FROM complex_room_notes WHERE room_id = {$room->id}";
$result = $this->db->query($sql);
$count = $this->db->fetch_assoc($result);
if ($count['count'] > 0) {
// Если запись существует, делаем UPDATE
$update_sql = "UPDATE complex_room_notes SET note = '{$note}' WHERE room_id = {$room->id}";
$this->db->query($update_sql);
} else {
// Если записи нет, делаем INSERT
$insert_sql = "INSERT INTO complex_room_notes (`room_id`, `note`) VALUES ({$room->id}, '{$note}')";
$this->db->query($insert_sql);
}
}
if ($room->requisition_id)
{
return $this->updateRequisitionWithClientsFunnelStep($room->id, $room->requisition_id);
}
if ($room->update_positions)
{
$sql = "UPDATE `requisitions` SET `position` = CASE `id` ";
foreach ($room->update_positions as $key => $update)
{
$sql .= "WHEN {$update->id} THEN {$update->position} ";
}
$sql .= "ELSE `position` END WHERE `id` IN (";
$sql .= implode(', ', array_map(function($item) { return $item->id; }, $room->update_positions));
$sql .= ")";
// Execute the query using your database connection
$this->db->query($sql);
return true;
}
$required_fields = ['number', 'area', 'complex_status_id'];
if ($room->type === 'apartment' || $room->type === 'apartments' ||
$room->type === 'townhouse' || $room->type === 'villa' ||
$room->type === 'penthouse' || $room->type === 'duplex' || $room->type === 'cottage') {
$required_fields[] = 'rooms_count';
}
$errors = [];
$strArray = [];
$q = $this->db->query("SELECT id, number, complex_status_id FROM complex_rooms WHERE id = {$room->id} ");
$old_room = $this->db->fetch_assoc($q);
foreach ($room as $key => $value) {
if(in_array($key, $required_fields) && empty($value)) {
$errors[$key] = 'required';
continue;
}
if ($key == 'id') {
continue;
}
if ($key == 'inPdf') {
continue;
}
if ($key == 'decoration_id') {
if (is_string($value)) {
$sql = "INSERT INTO decoration_types SET `name` = '{$value}'";
$q = $this->db->query($sql);
$id = $this->db->insert_id();
$value = $id;
}
}
if ($key == 'number' && $old_room['number'] != $value ) {
if($this->isUsedRoomNumber($value, $room->floor_id)) {
$errors[$key] = 'должен быть уникальным.';
continue;
}
}
if ($key === 'note') {
continue;
}
if (empty($value)) {
if ($key === 'total_amount') {
$strArray[] = "$key=0";
}
else {
$strArray[] = "$key=NULL";
}
} else {
if (is_string($value)) {
$strArray[] = "$key='$value'";
} else {
$strArray[] = "$key=$value";
}
}
if ($key == 'complex_status_id' && $old_room['complex_status_id'] != $value)
{
$complex_status = new ComplexStatus($value);
if ($complex_status->status !== 'reservation')
{
$old_complex_status_id = $old_room['complex_status_id'];
$sql = "SELECT
requisitions.`id` AS req_id,
requisitions.`client_id`,
users.*
FROM `requisitions`
LEFT JOIN `users` ON users.`id` = requisitions.`who_work`
LEFT JOIN `complex_status` AS cs ON cs.`id` = $old_complex_status_id
WHERE `complex_room_id` = {$room->id}
AND requisitions.`deleted` = 0
AND cs.`status` = 'reservation'
";
$requisitions = $complex_status::$db->query($sql)->fetchAll();
foreach($requisitions as $req)
{
$text = "Заявка была исключена из очереди на бронирование.";
$req_id = $req['req_id'];
$client_id = $req['client_id'];
$user_id = $_SESSION['id'];
$now = new DateTime("now");
$create_date = $now->format('Y-m-d H:i:s');
if ($req_id && $client_id && $user_id && $create_date)
{
$complex_status::$db->query("INSERT INTO `user_client_events` (
`user_id`,
`req_id`,
`client_id`,
`type`,
`comment`,
`create_date`
)
VALUES (
$user_id,
$req_id,
$client_id,
'comment',
'{$text}',
'{$create_date}'
)
");
if($req['telegramm_notice']
&& $req['telegramm_notice'] == 1
&& $req['telegramm_chat_id']
&& $req['telegramm_chat_id'] > 0
){
$text = "Заявка ID $req_id была исключена из очереди на бронирование.";
$complex = new Complex();
$complex->sendMessageToTelegram($req['telegramm_chat_id'], $text);;
}
}
mysql_query("UPDATE `requisitions` SET `complex_status_id` = 0, `complex_room_id` = NULL WHERE id = {$req_id}");
}
}
}
}
if (count($errors)) {
return ['status' => false, 'errors' => $errors];
}
// $str = preg_replace('/note\s*=\s*[^,]+,?/', '', $str);
// var_dump($strArray);die;
$str = implode(', ', $strArray);
$sql = "UPDATE complex_rooms SET $str WHERE id={$room->id}";
$q = $this->db->query($sql);
$q = $this->db->query("SELECT complex_rooms.*,
cs.id as status_id,
cs.name as status_name,
cs.status as status_type,
cs.color as status_color
FROM complex_rooms LEFT JOIN complex_status cs ON complex_rooms.complex_status_id = cs.id and cs.is_archive = 0 WHERE complex_rooms.id = {$room->id} ");
$room = $this->db->fetch_assoc($q);
$room['reservations'] = $this->get_room_reservations($room['id']);
$room['note'] = $this->get_room_note($room['id']);
$room['can_change_queue'] = $room['reservations']['can_change_queue'];
unset($room['reservations']['can_change_queue']);
$room['complex_status_info'] = [
'status_id' => $room['status_id'],
'status_name' => $room['status_name'],
'status_type' => $room['status_type'],
'status_color' => $room['status_color']
];
if ($room['status_type'] != 'reservation' && is_array($room['reservations']) && count($room['reservations']))
{
$room['complex_status_info'] = [
'status_id' => $room['reservations'][0]['status_id'],
'status_name' => $room['reservations'][0]['status_name'],
'status_type' => $room['reservations'][0]['status_type'],
'status_color' => $room['reservations'][0]['status_color'],
];
}
$room['installment_plans'] = [];
// Если тип оплаты содержит INSTALLMENT — подгрузим доступные рассрочки по дому
if (!empty($room['payment_types'])) {
$paymentTypes = is_array($room['payment_types'])
? $room['payment_types']
: json_decode($room['payment_types'], true);
if (in_array('INSTALLMENT', $paymentTypes)) {
// Получим house_id через этаж
$house_q = $this->db->query("SELECT e.complex_house_id AS house_id
FROM complex_entrances e
INNER JOIN complex_floors f ON f.complex_entrance_id = e.id
WHERE f.id = {$room['floor_id']}
LIMIT 1");
$house = $this->db->fetch_assoc($house_q);
if ($house && isset($house['house_id'])) {
$house_id = (int)$house['house_id'];
$installment_sql = "SELECT i.*, chi.end_date as house_installment_end_date
FROM installments i
INNER JOIN complex_house_installments chi ON chi.installment_id = i.id
WHERE chi.house_id = {$house_id}
AND i.is_archive = 0
AND (chi.end_date IS NULL OR chi.end_date >= CURDATE())";
$installment_q = $this->db->query($installment_sql);
$installments = [];
while ($plan = $this->db->fetch_assoc($installment_q)) {
$installments[] = [
'id' => $plan['id'],
'name' => $plan['name'],
'description' => $plan['description'],
'type' => $plan['type'],
'initial_payment' => $plan['initial_payment'],
'payment_period' => json_decode($plan['payment_period'], true),
'allow_change_on_close' => $plan['allow_change_on_close'],
'interest_rate' => $plan['interest_rate'],
'comment' => $plan['comment'],
'house_installment_end_date' => $plan['house_installment_end_date']
];
}
$room['installment_plans'] = $installments;
}
}
}
return $room;
}
public function save_room($room)
{
$attributes = $room->attributes;
unset($room->attributes);
$required_fields = ['number', 'area', 'complex_status_id', 'total_amount'];
if ($room->type === 'apartment' || $room->type === 'apartments' ||
$room->type === 'townhouse' || $room->type === 'villa' ||
$room->type === 'penthouse' || $room->type === 'duplex' || $room->type === 'cottage') {
$required_fields[] = 'rooms_count';
}
$this->set_user();
$strArray = [];
$errors = [];
$note = null;
// if (!isset($room->position)) {
// $floor_id = (int)$room->floor_id;
// $q = $this->db->query("SELECT MAX(position) as max_position FROM complex_rooms WHERE floor_id = $floor_id");
// $res = $this->db->fetch_assoc($q);
// $room->position = (int)$res['max_position'] + 1;
// }
foreach ($room as $key => $value) {
if(in_array($key, $required_fields) && empty($value)) {
$errors[$key] = 'required';
continue;
}
if ($key == 'id' || empty($value)) {
continue;
}
if ($key == 'decoration_id') {
if (is_string($value)) {
$sql = "INSERT INTO decoration_types SET `name` = '{$value}'";
$q = $this->db->query($sql);
$id = $this->db->insert_id();
$value = $id;
}
}
if ($key == 'note') {
$note = str_replace("'", "''", $value);
continue;
}
if ($key == 'number') {
if($this->isUsedRoomNumber($value, $room->floor_id)) {
$errors[$key] = 'должен быть уникальным.';
continue;
}
}
if (is_string($value)) {
$strArray[] = "$key='$value'";
} else {
$strArray[] = "$key=$value";
}
}
if (count($errors)) {
return ['status' => false, 'errors' => $errors];
}
$str = implode(', ', $strArray);
$sql = "INSERT INTO complex_rooms SET {$str}";
$q = $this->db->query($sql);
$id = $this->db->insert_id();
if ($note != null) {
// делаем INSERT
$insert_sql = "INSERT INTO complex_room_notes (`room_id`, `note`) VALUES ({$id}, '{$note}')";
$this->db->query($insert_sql);
}
$q = $this->db->query("SELECT complex_rooms.*,
cs.name as status_name,
cs.status as status_type,
cs.color as status_color,
crn.note
FROM complex_rooms
LEFT JOIN complex_status cs ON complex_rooms.complex_status_id = cs.id
LEFT JOIN complex_room_notes crn ON crn.room_id = complex_rooms.id
AND cs.is_archive = 0 WHERE complex_rooms.id = $id
");
$room = $this->db->fetch_assoc($q);
$room['complex_status_info'] = [
'status_id' => $room['status_id'],
'status_name' => $room['status_name'],
'status_type' => $room['status_type'],
'status_color' => $room['status_color']
];
$this->save_attributes($attributes,$id);
return $room;
}
public function get_room_entrance($id)
{
// $rooms_sql = "SELECT
// complex_rooms.*,
// MAX(c_house_p_i.url) as plan_url,
// c_floor.position as floor,
// c_entrance.id as entrance_id,
// c_house.name as house_name,
// c_house.id as house_id,
// c_complex.name as complex_name
// FROM complex_rooms
// LEFT JOIN complex_rooms_plans c_room_p ON c_room_p.room_id = complex_rooms.id
// LEFT JOIN complex_floors c_floor ON c_floor.id = complex_rooms.floor_id
// LEFT JOIN complex_entrances c_entrance ON c_entrance.id = c_floor.complex_entrance_id
// LEFT JOIN complex_houses c_house ON c_house.id = c_entrance.complex_house_id
// LEFT JOIN complex_list c_complex ON c_complex.id = c_house.complex_id
// LEFT JOIN complex_house_plans_images c_house_p_i ON c_room_p.plan_id = c_house_p_i.plan_id AND c_house_p_i.position = 1
// WHERE complex_rooms.id = {$id}
// GROUP BY complex_rooms.id
// ORDER BY complex_rooms.position;
// ";
// $rooms_q = $this->db->query($rooms_sql);
// $room = $this->db->fetch_assoc($rooms_q);
$entrance_sql = $this->db->query("SELECT complex_entrances.id as id FROM complex_entrances
LEFT JOIN complex_floors c_floor ON c_floor.complex_entrance_id = complex_entrances.id
LEFT JOIN complex_rooms c_room ON c_room.floor_id = c_floor.id
WHERE c_room.id = {$id}
");
$entranceRow = $this->db->fetch_assoc($entrance_sql);
$sql = "SELECT complex_entrances.*, ch.name as house_name, ch.parking as house_parking, ch.security as house_security, ch.fenced_area as house_fenced_area, ch.sports_ground as house_sports_ground, ch.play_ground as house_play_ground, ch.school as house_school, ch.kinder_garten as house_kinder_garten, ch.id as house_id, cl.name as complex_name, cl.id as complex_id FROM complex_entrances
JOIN complex_houses ch ON ch.id = complex_entrances.complex_house_id
JOIN complex_list cl ON cl.id = ch.complex_id
WHERE complex_entrances.id={$entranceRow['id']}";
$q = $this->db->query($sql);
$entrance = $this->db->fetch_assoc($q);
$floors = $this->get_entrance_floors($entrance, ['rooms']);
$entrance['floors'] = $floors;
return $entrance;
}
public function get_room_requisitions($room_id)
{
if (!$room_id) return null;
$requisition_sql = $this->db->query(
"SELECT
requisitions.`id`,
requisitions.`name`,
requisitions.`description`,
CASE
WHEN requisitions.`funnel_id` != 0 THEN req_funnel.`name`
ELSE req_funnel_default.`name`
END as funnel_name,
clients.`fio` as client_fio,
clients.`phone` as client_phone,
users.`last_name` as responsible_last_name,
users.`first_name` as responsible_first_name,
users.`middle_name` as responsible_middle_name
FROM requisitions
LEFT JOIN funnel req_funnel ON requisitions.`funnel_id` = req_funnel.`id` AND req_funnel.`deleted` != 1
LEFT JOIN funnel_default req_funnel_default ON req_funnel_default.`agency_id` = requisitions.`who_work`
LEFT JOIN clients on clients.`id` = requisitions.`client_id`
LEFT JOIN users on users.`id` = requisitions.`who_work`
WHERE requisitions.`complex_room_id` = {$room_id}
AND requisitions.`deleted` = 0
ORDER BY requisitions.created_at DESC"
);
return $this->db->result_pdo($requisition_sql) ?: [];
}
public function get_room_note ($room_id) {
$sql = "SELECT note FROM complex_room_notes WHERE room_id = {$room_id}";
$q = $this->db->query($sql);
$note = $this->db->fetch_assoc($q);
return $note ? $note['note'] : '';
}
public function get_room_reservations($room_id, $generate_positions = false)
{
if (!$room_id) return null;
if ($generate_positions)
{
$this->generate_room_reservations_positions($room_id);
}
$requisition_sql = $this->db->query(
"SELECT
requisitions.`id`,
requisitions.`name`,
requisitions.`description`,
requisitions.`position`,
requisitions.`reservation_updated_at`,
requisitions.`who_work`,
requisitions.`doers_confirm`,
requisitions.`doers`,
CASE
WHEN requisitions.`funnel_id` != 0 THEN req_funnel.`name`
ELSE req_funnel_default.`name`
END AS funnel_name,
users.`last_name` AS responsible_last_name,
users.`first_name` AS responsible_first_name,
users.`middle_name` AS responsible_middle_name,
users.`email` AS responsible_email,
users.`phone` AS responsible_phone,
cs.`id` as status_id,
cs.`name` as status_name,
cs.`status` as status_type,
cs.`color` as status_color,
csr.`can_change_booking_queue`,
csr.`booking_day`,
csr.`booking_hour`
FROM requisitions
LEFT JOIN funnel req_funnel ON requisitions.`funnel_id` = req_funnel.`id` AND req_funnel.`deleted` != 1
LEFT JOIN funnel_default req_funnel_default ON req_funnel_default.`agency_id` = requisitions.`who_work`
LEFT JOIN users ON users.`id` = requisitions.`who_work`
LEFT JOIN complex_status AS cs ON cs.`id` = requisitions.`complex_status_id`
LEFT JOIN complex_status_reservation AS csr ON csr.`complex_status_id` = cs.`id`
WHERE requisitions.`complex_room_id` = $room_id
AND requisitions.`deleted` = 0
AND cs.`status` = 'reservation'
ORDER BY requisitions.`position` ASC"
);
$result = $this->db->result_pdo($requisition_sql);
$newDataReservations = [];
$can_change_booking_queue = [];
if ($result)
{
foreach ($result as $item)
{
$item_ccbq = json_decode($item['can_change_booking_queue']);
$can_change_booking_queue = !empty($item_ccbq) && is_array($item_ccbq) ? array_merge($item_ccbq, $can_change_booking_queue) : $can_change_booking_queue;
$booking_date = new DateTime($item['reservation_updated_at']);
if (!empty($item['booking_day']))
{
$booking_date = $booking_date->modify('+' . $item['booking_day'] . ' day');
}
if (!empty($item['booking_hour']))
{
$booking_date = $booking_date->modify('+' . $item['booking_hour'] . ' hour');
}
$userId = $this->user_id;
if (isset($_SESSION['id'])) {
$userId = $_SESSION['id'];
}
if (!empty($item['booking_day']) || !empty($item['booking_hour'])) {
$item['completion_time'] = $booking_date->format('d.m.Y H:i:s');
} else {
$item['completion_time'] = null;
}
$user = new User;
$user->get($userId);
$requisition = new Requisitions();
$userIdsWork = $requisition->getIdsUsers($userId);
$item['can_read_details'] = false;
if($item['who_work'] == $user->id)
{
$item['can_read_details'] = true;
}
else if($user->agency > 0 || $_SESSION['users_admin'] > 0)
{
$item['can_read_details'] = true;
}
else if($user->manager > 0)
{
if(!empty($userIdsWork))
{
if(in_array($item['who_work'], $userIdsWork))
{
$item['can_read_details'] = true;
}
}
}
else if(!empty($item['doers']))
{
$doers1 = json_decode(html_entity_decode($item['doers']), true);
$item['doers1'] = $doers1;
if (isset($doers1[$userId]) && $doers1[$userId] == 1)
{
$item['can_read_details'] = true;
}
}
$newDataReservations[] = $item;
}
}
$newDataReservations['can_change_queue'] = in_array($user->id, $can_change_booking_queue);
return $newDataReservations;
}
public function generate_room_reservations_positions($room_id)
{
$requisition_sql = $this->db->query(
"SELECT
requisitions.`id`
FROM requisitions
JOIN complex_status ON complex_status.`id` = requisitions.`complex_status_id`
LEFT JOIN complex_status_reservation AS csr ON csr.`complex_status_id` = complex_status.`id`
WHERE requisitions.`complex_room_id` = $room_id
AND requisitions.`deleted` = 0
AND complex_status.`status` = 'reservation'
ORDER BY requisitions.`position` ASC"
);
$result = $this->db->result_pdo($requisition_sql);
$ids = array_column($result, 'id');
$position = 1;
if ($ids)
{
foreach ($ids as $id)
{
$sql = "UPDATE `requisitions` SET `position` = $position WHERE`id` = $id";
$this->db->query($sql);
$position++;
}
}
}
public function get_room_requisition($room_id)
{
$requisition_sql = $this->db->query(
"SELECT
requisitions.id,
requisitions.name,
requisitions.description,
CASE
WHEN requisitions.funnel_id != 0 THEN req_funnel.name
ELSE req_funnel_default.name
END as funnel_name,
clients.fio as client_fio,
clients.phone as client_phone,
users.last_name as responsible_last_name,
users.first_name as responsible_first_name,
users.middle_name as responsible_middle_name
FROM requisitions
LEFT JOIN funnel req_funnel ON requisitions.funnel_id = req_funnel.id AND req_funnel.deleted != 1
LEFT JOIN funnel_default req_funnel_default ON req_funnel_default.agency_id = requisitions.who_work
LEFT JOIN clients on clients.id = requisitions.client_id
LEFT JOIN users on users.id = requisitions.who_work
WHERE requisitions.complex_room_id = {$room_id}
ORDER BY requisitions.created_at DESC"
);
$requisition = $this->db->fetch_assoc($requisition_sql);
$requisition = $requisition ?: [];
return $requisition;
}
public function copy_room($room_id, $floor_id, $position = 0)
{
$this->set_user();
$sql = "SELECT * FROM complex_rooms WHERE id = {$room_id}";
$q = $this->db->query($sql);
$room = $this->db->fetch_assoc($q);
$strArray = [];
foreach ($room as $key => $value) {
if (
$key == 'id' ||
$key == 'position' ||
$key == 'floor_id' ||
$key == 'created_at' ||
$key == 'updated_at' ||
empty($value)
) {
continue;
}
if ($key == 'number') {
$value = $this->generateRoomNumber($floor_id);
}
if (is_string($value)) {
$strArray[] = "$key='$value'";
} else {
$strArray[] = "$key=$value";
}
}
$strArray[] = "floor_id=$floor_id";
if (!$position) {
$rooms_count_sql = "SELECT COUNT(*) AS record_count FROM complex_rooms WHERE floor_id = {$floor_id}";
$result_count = $this->db->query($rooms_count_sql);
$row = $this->db->fetch_assoc($result_count);
$position = $row['record_count'] + 1;
}
$strArray[] = "position=$position";
$str = implode(', ', $strArray);
$sql = "INSERT INTO complex_rooms SET {$str}";
$q = $this->db->query($sql);
$id = $this->db->insert_id();
$attr_sql = "SELECT attribute_type, area FROM complex_rooms_attribute WHERE complex_room_id = {$room_id}";
$attr_q = $this->db->query($attr_sql);
while ($attr = $this->db->fetch_assoc($attr_q)) {
$type = $attr['attribute_type'];
$area = $attr['area'];
$this->db->query("
INSERT INTO complex_rooms_attribute (complex_room_id, attribute_type, area)
VALUES ($id, '$type', $area)
");
}
$q = $this->db->query("SELECT complex_rooms.*,
cs.name as status_name,
cs.status as status_type,
cs.color as status_color
FROM complex_rooms
LEFT JOIN complex_status cs ON complex_rooms.complex_status_id = cs.id WHERE complex_rooms.id = $id
");
$room = $this->db->fetch_assoc($q);
$reservations = $this->get_room_reservations($room['id']);
unset($reservations['can_change_queue']);
$complex_status_info = [
'status_name' => $room['status_name'],
'status_type' => $room['status_type'],
'status_color' => $room['status_color']
];
unset($room['status_name']);
unset($room['status_type']);
unset($room['status_color']);
if ($room['status_type'] != 'reservation' && is_array($reservations) && count($reservations))
{
$complex_status_info = [
'status_name' => $reservations[0]['status_name'],
'status_type' => $reservations[0]['status_type'],
'status_color' => $reservations[0]['status_color'],
];
}
$room['complex_status_info'] = $complex_status_info;
return $room;
}
public function get_decoration_types()
{
$this->set_user();
$result = array();
$sql = "SELECT * FROM decoration_types where id <= 10";
$q = $this->db->query($sql);
while ($decoration = $this->db->fetch_assoc($q)) {
$result[] = $decoration;
}
return $result;
}
public function add_house_entrance($house_id, $data)
{
$this->set_user();
$strArray = [];
foreach ($data as $key => $value) {
if (is_string($value)) {
$strArray[] = "$key='$value'";
} else {
$strArray[] = "$key=$value";
}
}
$str = implode(', ', $strArray);
$sql = "INSERT INTO complex_entrances SET {$str} , complex_house_id={$house_id}";
$q = $this->db->query($sql);
$id = $this->db->insert_id();
$q = $this->db->query("SELECT * FROM complex_entrances WHERE id = $id ");
$entrance = $this->db->fetch_assoc($q);
// $entrance['floors'] = $this->get_entrance_floors($entrance);
$entrance['floors'] = [];
return $entrance;
}
public function add_floor_plan_figure($floor_plan_id, $data)
{
$this->set_user();
$strArray = [];
foreach ($data as $key => $value) {
if (in_array($key, ['points'])) {
$value = json_encode($value);
}
if (is_string($value)) {
$strArray[] = "$key='$value'";
} else {
$strArray[] = "$key=$value";
}
}
$str = implode(', ', $strArray);
$sql = "INSERT INTO complex_floor_plan_figures SET {$str} , floor_plan_id={$floor_plan_id}";
$q = $this->db->query($sql);
$id = $this->db->insert_id();
$q = $this->db->query("SELECT * FROM complex_floor_plan_figures WHERE id = $id ");
$figure = $this->db->fetch_assoc($q);
$figure['points'] = json_decode($figure['points']);
return $figure;
}
public function update_house_entrance($entrance_id, $data)
{
$this->set_user();
$str = '';
foreach ($data as $key => $value) {
if (is_string($value)) {
$str .= "$key='$value'";
} else {
$str .= "$key=$value";
}
}
$sql = "UPDATE complex_entrances SET $str WHERE id={$entrance_id}";
$q = $this->db->query($sql);
return ['status' => $q];
}
public function update_floor_plan_figure($figure_id, $data)
{
$this->set_user();
$strArray = [];
foreach ($data as $key => $value) {
// if ($key == 'room_plan_id') {
// $sql = "SELECT COUNT(room_plan_id) as count FROM complex_floor_plan_figures WHERE room_plan_id = {$value}";
// $res = $this->db->query($sql);
// $row = $this->db->fetch_assoc($res);
// if ($row['count']) {
// echo json_encode(['status' => false, 'count' => $row['count']], JSON_UNESCAPED_UNICODE);
// exit;
// }
// }
if (is_string($value)) {
$strArray[] = "$key='$value'";
} else if (is_null($value)) {
$strArray[] = "$key=NULL";
} else {
$strArray[] = "$key=$value";
}
}
$str = implode(', ', $strArray);
$sql = "UPDATE complex_floor_plan_figures SET $str WHERE id={$figure_id}";
$q = $this->db->query($sql);
return $data;
}
public function create_floor($entrance_id, $data)
{
$this->set_user();
$strArray = [];
foreach ($data as $key => $value) {
if (is_string($value)) {
$strArray[] = "$key='$value'";
} else {
$strArray[] = "$key=$value";
}
}
$str = implode(', ', $strArray);
$q = $this->db->query("SELECT * FROM complex_floors WHERE {$str} and complex_entrance_id={$entrance_id}");
if ($this->db->num_rows($q) > 0) {
$floor = $this->db->fetch_assoc($q);
$floor['rooms'] = [];
return $floor;
} else {
$sql = "INSERT INTO complex_floors SET {$str} , complex_entrance_id={$entrance_id}";
$q = $this->db->query($sql);
$id = $this->db->insert_id();
// var_dump($id);
$q = $this->db->query("SELECT * FROM complex_floors WHERE id = $id ");
$floor = $this->db->fetch_assoc($q);
$floor['rooms'] = [];
return $floor;
}
}
public function copy_floor($floor_id, $position)
{
$this->set_user();
$sql = "SELECT * FROM complex_floors WHERE id = {$floor_id}";
$q = $this->db->query($sql);
$floor = $this->db->fetch_assoc($q);
$strArray = [];
foreach ($floor as $key => $value) {
if (
$key == 'id' ||
$key == 'position' ||
$key == 'created_at' ||
$key == 'updated_at' ||
empty($value)
) {
continue;
}
if (is_string($value)) {
$strArray[] = "$key='$value'";
} else {
$strArray[] = "$key=$value";
}
}
$strArray[] = "position=$position";
$str = implode(', ', $strArray);
$sql = "INSERT INTO complex_floors SET {$str}";
$this->db->query($sql);
$id = $this->db->insert_id();
$q = $this->db->query("SELECT * FROM complex_floors WHERE id = $id ");
$floor = $this->db->fetch_assoc($q);
$rooms_sql = "SELECT * FROM complex_rooms WHERE floor_id = {$floor_id}";
$rooms_q = $this->db->query($rooms_sql);
// $room = $this->db->fetch_assoc($q);
$floor['rooms'] = [];
// $rooms_count_sql = "SELECT COUNT(*) AS record_count FROM complex_rooms WHERE floor_id = {$floor_id}";
// $result_count = $this->db->query($rooms_count_sql);
// $row = $this->db->fetch_assoc($result_count);
// $rooms_count = $row['record_count'];
$copied_room_position = 1;
while ($room = $this->db->fetch_assoc($rooms_q)) {
$copiedRoom = $this->copy_room($room['id'], $floor['id'], $copied_room_position);
$copied_room_position = $copied_room_position + 1;
// $room['floor'] = $floor['position'];
// $room['entrance_name'] = $entrance['name'];
// $room['entrance_id'] = $entrance['id'];
// $room['house_name'] = $entrance['house_name'];
// $room['complex_name'] = $entrance['complex_name'];
$floor['rooms'][] = $copiedRoom;
}
return $floor;
}
public function copy_house($house_id, $complex_id)
{
$this->set_user();
$housesArr = $this->get_houses($complex_id);
$targetHouse = null;
foreach ($housesArr as $house) {
if ($house['id'] == $house_id) {
$targetHouse = $house;
break;
}
}
$house = $targetHouse;
$user_id = $this->user_id;
// 1. Копируем дом
if (!$house) {
return ['error' => 'Original house not found'];
}
$house['name'] .=' (копия)';
$house_id = $house['id'];
unset($house['id']); // не копируем id
$images = $house['images'];
unset($house['images']); // не копируем id
$floors = $house['floors'];
unset($house['floors']); // не копируем id
$rooms = $house['rooms'];
unset($house['rooms']); // не копируем id
$house['created_at'] = date('Y-m-d H:i:s');
$house['update_at'] = date('Y-m-d H:i:s');
unset($house['total_rooms']);
unset($house['name_complex']);
unset($house['min_total_amount']);
$house['parking'] = $this->db->query("SELECT parking FROM complex_houses WHERE complex_id = {$house_id}");
$columns_sql = implode(', ', array_keys($house));
$escaped_values = [];
foreach ($house as $value) {
if (is_null($value) || $value === '') {
$escaped_values[] = 'NULL';
} elseif (is_numeric($value)) {
$escaped_values[] = $value;
} else {
$escaped_values[] = "'" . addslashes($value) . "'";
}
}
$values_sql = implode(', ', $escaped_values);
$sql = "
INSERT INTO complex_houses ({$columns_sql})
VALUES ({$values_sql})
";
$this->db->query($sql);
$new_house_id = $this->db->insert_id();
// 2. Копируем изображения
foreach ($images as $image) {
unset($image['id']); // не копируем id
$image_url = $image['url'];
$name = $image['name'];
$this->db->query("
INSERT INTO complex_house_images (house_id, url, name)
VALUES ({$new_house_id}, '{$image_url}', '{$name}')
");
}
// 3. Копируем подъезды
$entrances = $this->db->query("SELECT * FROM complex_entrances WHERE complex_house_id = {$house_id}");
$entrance_name = 0;
$room_id_map = [];
while ($entrance = $this->db->fetch_assoc($entrances)) {
$entrance_name = $entrance['name'];
$positionFloor = $entrance['position'];
$this->db->query("
INSERT INTO complex_entrances (complex_house_id, name, position)
VALUES ({$new_house_id}, '{$entrance_name}', {$positionFloor})
");
$old_entrance_id = $entrance['id'];
$new_entrance_id = $this->db->insert_id();
// 3. Копируем этажи
foreach($floors as $floor){
if($floor['complex_entrance_id'] !== $old_entrance_id) {
continue;
}
$position = $floor['position']; // скопируем позицию
$old_floor_id = $floor['id'];
unset($floor['id']);
$alignment = $floor['alignment']; // скопируем позицию
$this->db->query("
INSERT INTO complex_floors (complex_entrance_id, position,alignment)
VALUES ({$new_entrance_id}, {$position}, '{$alignment}')
");
$new_floor_id = $this->db->insert_id();
// 4. Копируем комнаты
foreach ($rooms as $room) {
if ($room['floor_id'] !== $old_floor_id) {
continue;
}
$old_id = $room['id'];
unset($room['id']);
unset($room['min_total_amount']);
unset($room['status']);
$room['floor_id'] = $new_floor_id;
$room_column_sql = implode(', ', array_keys($room));
$room_values = [];
foreach ($room as $value) {
if (is_null($value)) {
$room_values[] = 'NULL';
} elseif (is_numeric($value)) {
$room_values[] = $value;
} else {
$room_values[] = "'" . addslashes($value) . "'";
}
}
$rooms__sql = implode(', ', $room_values);
$sql = "INSERT INTO complex_rooms ({$room_column_sql})
VALUES ({$rooms__sql})";
$this->db->query($sql);
$new_id = $this->db->insert_id();
// Сохраняем связь старый ID => новый ID
$room_id_map[$old_id] = $new_id;
}
}
}
// 5. Копируем планировку
$houses_plans = $this->db->query("SELECT * FROM complex_house_plans WHERE house_id = {$house_id}");
foreach ($houses_plans as $plans) {
$plans_id = $plans['id'];
unset($plans['id']);
$columns_sql = implode(', ', array_keys($plans));
$plans['house_id'] = $new_house_id;
$plans_values = [];
foreach ($plans as $value) {
if (is_null($value)) {
$plans_values[] = 'NULL';
} elseif (is_numeric($value)) {
$plans_values[] = $value;
} else {
$plans_values[] = "'" . addslashes($value) . "'";
}
}
$plans__sql = implode(', ', $plans_values);
$sql = "INSERT INTO complex_house_plans ({$columns_sql})
VALUES ({$plans__sql})";
$this->db->query($sql);
$new_plan_id = $this->db->insert_id();
// 6. Копируем изображения планировки
$houses_plans_images = $this->db->query("SELECT * FROM complex_house_plans_images WHERE plan_id = {$plans_id}");
$houses_plans_image = $this->db->fetch_assoc($houses_plans_images);
if ($houses_plans_image) {
unset($houses_plans_image['id']);
$houses_plans_image['plan_id'] = $new_plan_id;
// var_dump($houses_plans_image);
$columns_sql = implode(', ', array_keys($houses_plans_image));
$plans_image_values = [];
foreach ($houses_plans_image as $value) {
if (is_null($value)) {
$plans_image_values[] = 'NULL';
} elseif (is_numeric($value)) {
$plans_image_values[] = $value;
} else {
$plans_image_values[] = "'" . addslashes($value) . "'";
}
}
$plans_image_sql = implode(', ', $plans_image_values);
$sql = "INSERT INTO complex_house_plans_images ({$columns_sql})
VALUES ({$plans_image_sql})";
$this->db->query($sql);
}
// 7. Копируем планировку для каждого дома
$rooms_plans = $this->db->query("SELECT * FROM complex_rooms_plans WHERE plan_id = {$plans_id}");
while ($room_plan = $this->db->fetch_assoc($rooms_plans)) {
unset($room_plan['id']);
$room_plan_id = $room_id_map[$room_plan['room_id']];
$plan_id_for_room = $new_plan_id;
$sql = "INSERT INTO complex_rooms_plans (room_id, plan_id)
VALUES ({$room_plan_id},{$plan_id_for_room})";
$this->db->query($sql);
}
}
return $housesArr;
}
public function update_floor($floor_id, $data)
{
$this->set_user();
$result = array();
$strArray = [];
foreach ($data as $key => $value) {
if (is_string($value)) {
$strArray[] = "$key='$value'";
} else {
$strArray[] = "$key=$value";
}
}
$str = implode(', ', $strArray);
$sql = "UPDATE complex_floors SET $str WHERE id={$floor_id}";
$q = $this->db->query($sql);
return ['status' => $q];
}
public function get_entrance_floors($entrance, $includes, $partner_id = 0, $has_token = false)
{
$complex_status = new ComplexStatus(null, true);
$this->set_user();
$result = array();
$entrance_id = $entrance['id'];
$sql = "SELECT DISTINCT complex_floors.*, floor_plans.has_light_angle as has_light_angle, floor_plans.light_angle as light_angle FROM complex_floors
LEFT JOIN complex_floors_plans floor_plan_link ON floor_plan_link.floor_id = complex_floors.id
LEFT JOIN complex_house_floor_plans floor_plans ON floor_plans.id = floor_plan_link.floor_plan_id
WHERE complex_entrance_id={$entrance_id}";
//echo $sql;
$q = $this->db->query($sql);
$roomIds = [];
$attributes = [];
while ($floor = $this->db->fetch_assoc($q)) {
$floor['rooms'] = [];
if ($includes && in_array('rooms', $includes)) {
// SELECT complex_rooms.*, c_house_p_i.url as plan_url FROM complex_rooms
// LEFT JOIN complex_rooms_plans c_room_p ON c_room_p.room_id = complex_rooms.id
// LEFT JOIN complex_house_plans_images c_house_p_i ON c_room_p.plan_id = c_house_p_i.plan_id AND c_house_p_i.position = 1
// WHERE complex_rooms.floor_id={$floor['id']}
// ORDER BY complex_rooms.position
// $rooms_sql = "SELECT complex_rooms.*, MAX(c_house_p_i.url) as plan_url FROM complex_rooms
// LEFT JOIN complex_rooms_plans c_room_p ON c_room_p.room_id = complex_rooms.id
// LEFT JOIN complex_house_plans_images c_house_p_i ON c_room_p.plan_id = c_house_p_i.plan_id AND c_house_p_i.position = 1
// WHERE complex_rooms.floor_id = {$floor['id']}
// GROUP BY complex_rooms.id
// ORDER BY complex_rooms.position;
// ";
if ($has_token) {
if ($this->user->agencyId == 20382) {
$filter_by_status = "";
} else {
$filter_by_status = "AND cs.status IN ('available', 'reservation')";
}
} else {
$filter_by_status = "";
}
$rooms_sql = "SELECT complex_rooms.*,
MAX(c_house_p_i.url) as plan_url,
MAX(c_house_p.has_light_angle) as has_light_angle,
MAX(c_house_p.light_angle) as light_angle,
MAX(cs.name) as status_name,
MAX(cs.status) as status_type,
MAX(cs.color) as status_color,
MAX(cra.add_to_domclick_feed) as add_to_domclick_feed,
MAX(cra.add_to_avito_feed) as add_to_avito_feed,
MAX(cra.add_to_cian_feed) as add_to_cian_feed,
MAX(cra.add_to_yandex_feed) as add_to_yandex_feed,
MAX(cra.add_to_domrf_feed) as add_to_domrf_feed,
MAX(cra.add_to_site_feed) as add_to_site_feed,
MAX(crn.note) as note,
CASE
WHEN MAX(cs.status) = 'reservation' THEN (
SELECT r.id
FROM requisitions r
WHERE r.complex_room_id = complex_rooms.id
ORDER BY r.created_at DESC
LIMIT 1
)
ELSE NULL
END AS requisition_id
FROM complex_rooms
LEFT JOIN complex_rooms_plans c_room_p ON c_room_p.room_id = complex_rooms.id
LEFT JOIN complex_room_advert cra ON cra.complex_room_id = complex_rooms.id
LEFT JOIN complex_house_plans_images c_house_p_i ON c_room_p.plan_id = c_house_p_i.plan_id AND c_house_p_i.position = 1
LEFT JOIN complex_house_plans c_house_p ON c_room_p.plan_id = c_house_p.id
LEFT JOIN complex_status cs ON complex_rooms.complex_status_id = cs.id AND cs.is_archive = 0
LEFT JOIN complex_room_notes crn ON crn.room_id = complex_rooms.id
WHERE complex_rooms.floor_id = {$floor['id']}
{$filter_by_status}
GROUP BY complex_rooms.id
ORDER BY complex_rooms.position;";
$rooms_q = $this->db->query($rooms_sql);
// Modified installment plans query using only complex_house_installments
$house_id = $entrance['house_id'];
$installment_sql = "SELECT i.*,
chi.end_date as house_installment_end_date
FROM installments i
INNER JOIN complex_house_installments chi ON chi.installment_id = i.id
WHERE chi.house_id = {$house_id}
AND i.is_archive = 0
AND (chi.end_date IS NULL OR chi.end_date >= CURDATE())";
$installment_q = $this->db->query($installment_sql);
$installment_plans = [];
while ($plan = $this->db->fetch_assoc($installment_q)) {
$installment_plans[] = [
'id' => $plan['id'],
'name' => $plan['name'],
'description' => $plan['description'],
'type' => $plan['type'],
'initial_payment' => $plan['initial_payment'],
'payment_period' => json_decode($plan['payment_period'], true),
'allow_change_on_close' => $plan['allow_change_on_close'],
'interest_rate' => $plan['interest_rate'],
'comment' => $plan['comment'],
'house_installment_end_date' => $plan['house_installment_end_date']
];
}
while ($room = $this->db->fetch_assoc($rooms_q)) {
$roomIds[] = $room['id'];
$room_id = $room['id'];
$attributes_sql = "
SELECT complex_room_id, id, attribute_type, area
FROM complex_rooms_attribute
WHERE complex_room_id = $room_id
";
$attributes_q = $this->db->query($attributes_sql);
$room['attributes'] = [];
while($attributes = $this->db->fetch_assoc($attributes_q)){
$room['attributes'][] = $attributes;
}
if (!isset($room['attributes']) || !is_array($room['attributes'])) {
$room['attributes'] = [];
}
$hasRoom = false;
$hasBathroom = false;
$hasBalcony = false;
$hasLoggia = false;
foreach ($room['attributes'] as $attr) {
if ($attr['attribute_type'] === 'room') {
$hasRoom = true;
} elseif ($attr['attribute_type'] === 'bathroom') {
$hasBathroom = true;
} elseif ($attr['attribute_type'] === 'balcony') {
$hasBalcony = true;
} elseif ($attr['attribute_type'] === 'loggia') {
$hasLoggia = true;
}
}
if (!$hasRoom) {
$room['attributes'][] = ['attribute_type' => 'room', 'area' => null];
}
if (!$hasBathroom) {
$room['attributes'][] = ['attribute_type' => 'bathroom', 'area' => null];
}
if (!$hasBalcony && !$hasLoggia) {
$room['attributes'][] = ['attribute_type' => 'balcony', 'area' => null];
}
$room['floor'] = $floor['position'];
// $room['floor_has_light_angle'] = $floor['has_light_angle'];
// $room['floor_light_angle'] = $floor['light_angle'];
$room['entrance_name'] = $entrance['name'];
$room['entrance_id'] = $entrance['id'];
$room['house_name'] = $entrance['house_name'];
// $room['house_name'] = $entrance['house_name'];
$room['house_security'] = $entrance['house_security'];
$room['house_parking'] = $entrance['house_parking'];
$room['house_fenced_area'] = $entrance['house_fenced_area'];
$room['house_sports_ground'] = $entrance['house_sports_ground'];
$room['house_play_ground'] = $entrance['house_play_ground'];
$room['house_school'] = $entrance['house_school'];
$room['house_kinder_garten'] = $entrance['house_kinder_garten'];
$room['house_id'] = $entrance['house_id'];
$room['complex_name'] = $entrance['complex_name'];
// Add installment plans only if INSTALLMENT exists in room.payment_types
$paymentTypes = json_decode($room['payment_types'] ? $room['payment_types'] : '[]');
if (is_array($paymentTypes) && in_array('INSTALLMENT', $paymentTypes)) {
$room['installment_plans'] = $installment_plans;
} else {
$room['installment_plans'] = [];
}
if (in_array((string)$room['id'], $_SESSION['to_send_complexes'])) {
$room['inPdf'] = true;
}
$room['requisitions'] = $this->get_room_requisitions($room['id']);
$room['reservations'] = $this->get_room_reservations($room['id']);
$room['can_change_queue'] = $room['reservations']['can_change_queue'];
unset($room['reservations']['can_change_queue']);
// Переопределяем статусы при наличии токена
if ($has_token) {
if ($room['status_type'] == 'available') {
$room['status_name'] = 'Свободные';
} elseif ($room['status_type'] == 'reservation') {
$room['status_name'] = 'Бронь';
}
}
if($partner_id > 0){
// if($room['status_type'] == 'sold'){
// $temp_status = $complex_status->getDefaultStatusStatus('not_for_sale');
// if(!empty($temp_status)){
// $room['status_type'] = $temp_status['status'];
// $room['status_name'] = $temp_status['name'];
// $room['status_color'] = $temp_status['color'];
// $room['status_id'] = $temp_status['id'];
// }
// } else {
$temp_status = $complex_status->getDefaultStatusStatus($room['status_type']);
if(!empty($temp_status)){
$room['status_type'] = $temp_status['status'];
$room['status_name'] = $temp_status['name'];
$room['status_color'] = $temp_status['color'];
$room['status_id'] = $temp_status['id'];
}
// }
}
$room['complex_status_info'] = [
'status_id' => $room['status_id'],
'status_name' => $room['status_name'],
'status_type' => $room['status_type'],
'status_color' => $room['status_color']
];
if ($room['status_type'] != 'reservation' && is_array($room['reservations']) && count($room['reservations']))
{
// if($partner_id > 0){
// $temp_status = $complex_status->getDefaultStatusStatus('reservation');
// if(!empty($temp_status)){
// $room['complex_status_info'] = [
// 'status_id' => $temp_status['id'],
// 'status_name' => $temp_status['name'],
// 'status_type' => $temp_status['status'],
// 'status_color' => $temp_status['color']
// ];
// }
// } else {
$room['complex_status_info'] = [
'status_id' => $room['reservations'][0]['status_id'],
'status_name' => $room['reservations'][0]['status_name'],
'status_type' => $room['reservations'][0]['status_type'],
'status_color' => $room['reservations'][0]['status_color'],
];
// }
}
$floor['rooms'][] = $room;
}
}
$result[] = $floor;
}
//ищем статусы размещения в рекламу для квартир
$objAdsErrors = [];
$objAdsSended = [];
//начитываем ошибки и ссылки размещения объектов в рекламе
$sql_ads = "SELECT `object_id`, `service_id`, `errors`, `url` FROM `ads_stats_complex` WHERE `object_id` IN (" . implode(", ", $roomIds) .")";
$rezAdsErrors = mysql_query($sql_ads);
if (mysql_num_rows($rezAdsErrors) > 0) {
while ($objAdsInfo = mysql_fetch_assoc($rezAdsErrors)) {
$object_id = $objAdsInfo['object_id'];
$service_id = $objAdsInfo['service_id'];
if ($objAdsInfo['errors']) {
$objAdsErrors[$object_id][$service_id] = json_decode($objAdsInfo['errors']);
} else {
$objAdsSended[$object_id][$service_id] = $objAdsInfo['url'];
}
}
}
//идем по всем помещениям и проставляем
foreach ($result as $key => $floor) {
foreach ($floor['rooms'] as $keyRoom => $room) {
//домклик
if ($objAdsErrors[$room['id']][4]) {
$result[$key]['rooms'][$keyRoom]['ads_domclick_error'] = $objAdsErrors[$room['id']][4];
}
if ($objAdsSended[$room['id']][4]) {
$result[$key]['rooms'][$keyRoom]['ads_domclick_url'] = $objAdsSended[$room['id']][4];
}
//авито
if ($objAdsErrors[$room['id']][1]) {
$result[$key]['rooms'][$keyRoom]['ads_avito_error'] = $objAdsErrors[$room['id']][1];
}
if ($objAdsSended[$room['id']][1]) {
$result[$key]['rooms'][$keyRoom]['ads_avito_url'] = $objAdsSended[$room['id']][1];
}
//циан
if ($objAdsErrors[$room['id']][2]) {
$result[$key]['rooms'][$keyRoom]['ads_cian_error'] = $objAdsErrors[$room['id']][2];
}
if ($objAdsSended[$room['id']][2]) {
$result[$key]['rooms'][$keyRoom]['ads_cian_url'] = $objAdsSended[$room['id']][2];
}
//яндекс
if ($objAdsErrors[$room['id']][3]) {
$result[$key]['rooms'][$keyRoom]['ads_yandex_error'] = $objAdsErrors[$room['id']][3];
}
if ($objAdsSended[$room['id']][3]) {
$result[$key]['rooms'][$keyRoom]['ads_yandex_url'] = $objAdsSended[$room['id']][3];
}
}
}
//идем по всем помещениям и проставляем
foreach ($result as $key => $floor) {
foreach ($floor['rooms'] as $keyRoom => $room) {
$result[$key]['rooms'][$keyRoom]['advStat'] = [];
$result[$key]['rooms'][$keyRoom]['advStat']['avito'] = [];
$result[$key]['rooms'][$keyRoom]['advStat']['cian'] = [];
$result[$key]['rooms'][$keyRoom]['advStat']['yandex'] = [];
$result[$key]['rooms'][$keyRoom]['advStat']['domclick'] = [];
$sqlSumStat = "SELECT asc2.*, (select sum(asc1.views) as sum_view_count from ads_stats_complex asc1 where asc1.object_id = asc2.object_id) as sum_view_count from ads_stats_complex asc2 where asc2.object_id = {$room['id']}";
$rezSumStat = $this->db->query($sqlSumStat);
while ($stat = $this->db->fetch_assoc($rezSumStat)) {
$result[$key]['rooms'][$keyRoom]['advStat']['allViews'] = $stat['sum_view_count'];
$service_id = $stat['service_id'];
if ($service_id == 1) {
$result[$key]['rooms'][$keyRoom]['advStat']['avito']['views'] = $stat['views'];
$result[$key]['rooms'][$keyRoom]['advStat']['avito']['contacts'] = $stat['contacts'];
$result[$key]['rooms'][$keyRoom]['advStat']['avito']['favorites'] = $stat['favorites'];
$result[$key]['rooms'][$keyRoom]['advStat']['avito']['calls'] = $stat['calls'];
}
if ($service_id == 2) {
$result[$key]['rooms'][$keyRoom]['advStat']['cian']['views'] = $stat['views'];
$result[$key]['rooms'][$keyRoom]['advStat']['cian']['contacts'] = $stat['contacts'];
$result[$key]['rooms'][$keyRoom]['advStat']['cian']['favorites'] = $stat['favorites'];
$result[$key]['rooms'][$keyRoom]['advStat']['cian']['calls'] = $stat['calls'];
}
if ($service_id == 3) {
$result[$key]['rooms'][$keyRoom]['advStat']['yandex']['views'] = $stat['views'];
$result[$key]['rooms'][$keyRoom]['advStat']['yandex']['contacts'] = $stat['contacts'];
$result[$key]['rooms'][$keyRoom]['advStat']['yandex']['favorites'] = $stat['favorites'];
$result[$key]['rooms'][$keyRoom]['advStat']['yandex']['calls'] = $stat['calls'];
}
if ($service_id == 4) {
$result[$key]['rooms'][$keyRoom]['advStat']['domclick']['views'] = $stat['views'];
$result[$key]['rooms'][$keyRoom]['advStat']['domclick']['contacts'] = $stat['contacts'];
$result[$key]['rooms'][$keyRoom]['advStat']['domclick']['favorites'] = $stat['favorites'];
$result[$key]['rooms'][$keyRoom]['advStat']['domclick']['calls'] = $stat['calls'];
}
}
}
}
return $result;
}
public function get_room_figures($room_id)
{
$figures_sql = "SELECT
JSON_OBJECT(
'id', c_f_p_f.id,
'floor_plan_id', c_f_p_f.floor_plan_id,
'room_plan_id', c_f_p_f.room_plan_id,
'points', c_f_p_f.points,
'background', c_f_p_f.background
) AS figures
FROM complex_rooms
JOIN complex_rooms_plans c_room_p ON c_room_p.room_id = complex_rooms.id
JOIN complex_house_plans_images c_house_p_i ON c_room_p.plan_id = c_house_p_i.plan_id AND c_house_p_i.position = 1
JOIN complex_house_plans c_house_p ON c_room_p.plan_id = c_house_p.id
JOIN complex_floor_plan_figures c_f_p_f ON c_f_p_f.room_plan_id = c_house_p.id
WHERE complex_rooms.id = {$room_id};
";
$figures_q = $this->db->query($figures_sql);
return json_decode($this->db->fetch_assoc($figures_q)['figures']);
}
//Установка страниц
public function set_page_obj($page_obj)
{
$this->page_obj = $page_obj;
}
public function set_page($page)
{
$this->page = $page;
}
//Установка id юзера
public function set_user_id($user_id)
{
if ($user_id > 0) {
$this->user_id = $user_id;
}
}
//Установка юзера
public function set_user()
{
if (empty($this->user)) {
$user = new User;
$user_id = 0;
if ($this->user_id > 0) {
$user_id = $this->user_id;
} else {
$user_id = $_SESSION['id'];
}
$user->get($user_id);
$this->user = $user;
}
}
//Установка юзеров агенства
public function set_users_ids()
{
if (empty($this->userIds)) {
$userIds = array();
$this->set_user();
$agency_id = $this->user->agencyId;
$userIds[] = $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})))";
$q_users = $this->db->query($sql_users);
while ($r_users = $this->db->fetch_assoc($q_users)) {
$userIds[] = (int)$r_users['id'];
}
$this->userIds = array_unique($userIds);
}
}
private function set_types_complex()
{
$this->types_comples = array(
array('code' => 'complex', 'name' => 'Жилой комплекс в новостройке'),
array('code' => 'comerc', 'name' => 'Коммерция'),
array('code' => 'cottage_village', 'name' => 'Коттеджный поселок')
);
}
public function get_types_complex()
{
return $this->types_comples;
}
/**
*
*/
private function set_sphinx()
{
$pdo = new MysqlPdo(hstsph, null, null, null, true, '9306');
$sql = "SET NAMES 'utf8mb4'";
$pdo->query($sql);
$this->sphinx = $pdo;
}
private function set_sphinx2()
{
$pdo = new MysqlPdo(hstsph2, null, null, null, true, '9306');
$sql = "SET NAMES 'utf8mb4'";
$pdo->query($sql);
$this->sphinx2 = $pdo;
}
/**
*
*/
private function set_payment_types()
{
$this->paymentTypes = array(
array('code' => 1, 'name' => 'Субсидия'),
array('code' => 2, 'name' => 'Ипотека'),
array('code' => 3, 'name' => 'Военная ипотека'),
);
}
/**
*
*/
public function get_payment_types()
{
$this->set_payment_types();
return $this->paymentTypes;
}
/**
*
*/
private function set_housing_class()
{
$this->housingClass = array(
array('code' => 1, 'name' => 'Эконом'),
array('code' => 2, 'name' => 'Комфорт'),
array('code' => 3, 'name' => 'Комфорт+'),
array('code' => 4, 'name' => 'Бизнес'),
array('code' => 5, 'name' => 'Элитный'),
);
}
/**
* Получение отделки
*/
public function get_decarations()
{
$rezult = array('list' => array(), 'options' => array());
$sql = "SELECT * FROM avito_decoration_types order by id";
$rez = $this->db->query($sql);
while ($newFlatDecorationType = $this->db->fetch_assoc($rez)) {
$rezult['list'][$newFlatDecorationType['id']] = $newFlatDecorationType['name'];
$rezult['options'][] = array('code' => $newFlatDecorationType['id'], 'name' => $newFlatDecorationType['name']);
}
$this->listDecorations = $rezult;
return $this->listDecorations;
}
public function get_housing_class()
{
$this->set_housing_class();
return $this->housingClass;
}
public function get_decorations()
{
$sql = "SELECT * FROM decoration_types where id <= 10 ORDER BY name";
$rez = $this->db->query($sql);
$decorationTypes = array();
if ($this->db->num_rows($rez) > 0) {
while ($dbObject = $this->db->fetch_assoc($rez)) {
$decorationTypes[] = array('code' => $dbObject['id'], 'name' => $dbObject['name']);
}
}
return $decorationTypes;
}
/**
* Страны
* @return array
*
*/
public function get_country()
{
$result = array();
$country = array();
$country_list = array();
$countryListQuery = $this->db->query("select * from country_list where id=171 union select * from country_list where id <> 171");
while ($countryList = $this->db->fetch_assoc($countryListQuery)) {
$country[] = array('code' => $countryList['id'], 'name' => $countryList['name']);
$country_list[$countryList['id']] = $countryList;
}
$result['country'] = $country;
$result['country_list'] = $country_list;
return $result;
}
/**
* Регионы
* @return array
*/
public function get_rf_regions()
{
$result = array();
$regions = array();
$regions_list = array();
$region_id_user = 0;
$this->set_user();
$region_id_user = $this->user->region_rf_id;
$regions_rf = $this->db->query("select * from rf_regions where parent = 0");
while ($region_rf = $this->db->fetch_assoc($regions_rf)) {
$regions[] = array(
'code' => $region_rf['id'],
'name' => $region_rf['name'],
'rayons' => $this->get_rf_region_rayons($region_rf['id'])
);
$regions_list[$region_rf['id']] = array('kladr' => $region_rf['kladr'], 'label' => mb_strtolower($region_rf['name']));
}
$result['regions'] = $regions;
$result['region_id_user'] = $region_id_user;
$result['regions_list'] = $regions_list;
return $result;
}
public function get_rf_region_rayons($rf_region_id)
{
$result = [];
$sql = $this->db->query("SELECT id, name FROM regions WHERE rf_region_id = {$rf_region_id}");
while ($row = $this->db->fetch_assoc($sql)) {
$result[] = $row;
}
return $result;
}
/**
* Метро
* @param int $region_id
* @return array
*/
public function get_metro($region_id)
{
$result = array();
$metroRegion = $region_id;
if ($region_id == 19) {
$metroRegion = 1432;
}
if ($region_id == 1) {
$metroRegion = 80;
}
if ($region_id == 2) {
$metroRegion = 81;
}
if ($region_id == 37) {
$metroRegion = 1468;
}
if ($region_id == 55) {
$metroRegion = 1500;
}
if ($region_id == 57) {
$metroRegion = 1504;
}
if ($region_id == 66) {
$metroRegion = 1520;
}
if ($region_id == 69) {
$metroRegion = 1526;
}
$sql = empty($region_id) ? "SELECT * from metro" : "SELECT * from metro where region_rf_id = $metroRegion";
$metros_query = $this->db->query($sql);
while ($metro = $this->db->fetch_assoc($metros_query)) {
$result[] = array('code' => $metro['id'], 'name' => $metro['metro']);
}
return $result;
}
public function getUniquePeriods()
{
$result = [];
$sql = "SELECT DISTINCT deadline FROM buildings GROUP BY deadline LIMIT 1000";
$rez = $this->db->query($sql);
$date = Date::getLastPeriodDate(time());
$currentTs = strtotime($date);
if ($this->db->num_rows($rez) > 0) {
while ($dbObject = $this->db->fetch_assoc($rez)) {
$date = Date::getLastPeriodDate(strtotime($dbObject['deadline']));
$ts = strtotime($date);
$name = Date::getFormatedEndingPeriod($date);
if ($currentTs < $ts) {
$result[$ts] = $name;
}
}
}
$result[$currentTs] = Date::DEADLINE_DONE;
ksort($result);
$res = array();
foreach ($result as $key => $period) {
$res[] = array('code' => $key, 'name' => $period);
}
return $res;
}
/**
* Список застройщиков
* @return array
*/
private function building_list()
{
$building_list = array();
$building_query = $this->db->query("SELECT * FROM buildings");
while ($building = $this->db->fetch_assoc($building_query)) {
$building_list[$building['block_id']][] = $building;
}
return $building_list;
}
/**
* ЖК новостройки
* @return array
*/
public function get_blocks()
{
$result = array();
$building_list = $this->building_list();
$sql = "SELECT * FROM `blocks` order by name";
$block_query = $this->db->query($sql);
while ($block = $this->db->fetch_assoc($block_query)) {
$result['block_list'][] = array('code' => $block['id'], 'name' => $block['name']);
if (isset($building_list[$block['id']]) && !empty($building_list[$block['id']])) {
foreach ($building_list[$block['id']] as $building) {
if (!isset($block['lines'][(int)$building['line']])) {
$block['lines'][(int)$building['line']] = array(
'name' => (int)$building['line'], 'isDiv' => true,
'isEdit' => false, 'corpuses' => array(), 'isInput' => false
);
}
$block['lines'][(int)$building['line']]['corpuses'][] = array(
'corpus' => $building['corp'],
'period' => Date::getFormatedEndingPeriod($building['deadline']),
'deadline' => date('d.m.Y', strtotime($building['deadline'])),
'isDiv' => true,
'isEdit' => false,
'date' => '',
);
}
} else {
$block['lines'] = array();
}
$result['blocks'][$block['id']] = $block;
}
return $result;
}
/**
* Фото комплекса
* @param int block_id
* @return array $photos
*/
public function getPhotos($block_id)
{
$photos = array();
$sql = "SELECT image FROM blocks WHERE id={$block_id}";
$rez = $this->db->query($sql);
$appendedFiles = array();
if ($this->db->num_rows($rez) > 0) {
while ($dbObject = $this->db->fetch_assoc($rez)) {
$ph_url = $dbObject['image'];
$name = $dbObject['image'];
$pathInfo = pathinfo($name);
$appendedFiles[] = array(
"name" => $ph_url,
"file" => $ph_url,
"type" => "image/" . $pathInfo['extension'],
"data" => array(
"url" => $ph_url,
"thumbnail" => $ph_url
)
);
}
}
$sql = "SELECT image FROM block_images WHERE model_id='{$block_id}' AND type != 10";
$rez = $this->db->query($sql);
if ($this->db->num_rows($rez) > 0) {
while ($dbObject = $this->db->fetch_assoc($rez)) {
$ph_url = $dbObject['image'];
$name = $dbObject['image'];
$pathInfo = pathinfo($name);
$appendedFiles[] = array(
"name" => $ph_url,
"file" => $ph_url,
"type" => "image/" . $pathInfo['extension'],
"data" => array(
"url" => $ph_url,
"thumbnail" => $ph_url
)
);
}
}
return $appendedFiles;
}
/**
* Преобразование корпуса
* @param string $deadline
* @param string $corpus
* @return array $corpusNew
*/
public function corpus_convert($corpus, $deadline, $corpus_id, $corpus_floors, $corpus_floors_ready, $corpus_fz_214, $corpus_status)
{
$corpusNew = array();
$newDeadline = date('Y-m-d', strtotime($deadline));
$period = Date::getFormatedEndingPeriod($newDeadline);
$corpusNew = array(
'corpus' => $corpus,
'period' => $period,
'deadline' => date('d.m.Y', strtotime($newDeadline)),
'isDiv' => true,
'isEdit' => false,
'date' => '',
'corpus_id' => $corpus_id,
'corpus_floors' => $corpus_floors,
'corpus_floors_ready' => $corpus_floors_ready,
'corpus_fz_214' => $corpus_fz_214,
'corpus_status' => $corpus_status
);
return $corpusNew;
}
/**
* Список застройщиков
* @return array
*/
public function get_builder_list($agency_id = null)
{
$builder_list = array();
$builder_query = $this->db->query("SELECT id, name, logo, phone, link
FROM (
SELECT builders.id, builders.name, builders.logo, complex_builders.phone, complex_builders.link
FROM builders
LEFT JOIN complex_builders ON complex_builders.builder_id = builders.id
UNION ALL
SELECT id, name, logo, phone, link
FROM complex_builders
WHERE name IS NOT NULL AND name != ''
) AS combined_results
ORDER BY name");
$complex_builder_ids = array();
if ($agency_id > 0) {
$sql = "SELECT id , builder_id FROM complex_list WHERE agency_id = {$agency_id} AND deleted = 0 AND arhive = 0";
$q = $this->db->query($sql);
while ($r = $this->db->fetch_assoc($q)) {
if ((int)$r['builder_id'] > 0) {
$complex_builder_ids[] = (int)$r['builder_id'];
}
}
}
while ($builders = $this->db->fetch_assoc($builder_query)) {
if ($agency_id > 0) {
if (in_array($builders['id'], $complex_builder_ids)) {
$builder_list['list'][$builders['id']] = $builders;
$builder_list['options'][] = array('code' => $builders['id'], 'name' => $builders['name']);
}
} else {
$builder_list['list'][$builders['id']] = $builders;
$builder_list['options'][] = array('code' => $builders['id'], 'name' => $builders['name']);
}
}
return $builder_list;
}
/**
* Добавить застройщика
* @param string $name
* @return array
*/
public function addBuilder($name, $phone, $link)
{
$result = array();
$this_name = trim($name);
$sql_b = "SELECT id FROM builders WHERE name = '{$this_name}'";
$q_b = $this->db->query($sql_b);
if ($this->db->num_rows($q_b) > 0) {
$res = $this->db->fetch_assoc($q_b);
$id = (int)$res['id'];
$sql_info = "SELECT * FROM complex_builders WHERE builder_id = {$id}";
$q_info = $this->db->query($sql_info);
if ($this->db->num_rows($q_info) > 0) {
$sql_up = "UPDATE complex_builders SET phone='{$phone}', link='{$link}' WHERE builder_id = {$id}";
} else {
$sql_up = "INSERT INTO complex_builders SET phone='{$phone}', link='{$link}', builder_id = {$id}";
}
$this->db->query($sql_up);
$result['result'] = 'old';
$result['builder_id'] = (int)$id;
} else {
$sql_in = "INSERT INTO complex_builders SET name = '{$this_name}', phone='{$phone}', link='{$link}'";
$this->db->query($sql_in, true);
$id = $this->db->insert_id();
$result['result'] = 'new';
$result['builder_id'] = (int)$id;
}
return $result;
}
/**
*
*/
public function get_complexes()
{
$this->set_user();
$result = array();
$sql = "SELECT id, name FROM complex_list WHERE agency_id={$this->user->agencyId} AND deleted=0 AND arhive=0";
//echo $sql;
$q = $this->db->query($sql);
while ($complex = $this->db->fetch_assoc($q)) {
$result[] = array('code' => $complex['id'], 'name' => $complex['name']);
}
return $result;
}
/**
*
*/
public function get_types_room()
{
$result = array();
$sql = "SELECT * FROM room_types ORDER BY name";
$rez = $this->db->query($sql);
while ($type_room = $this->db->fetch_assoc($rez)) {
$result[] = array('code' => $type_room['id'], 'name' => $type_room['name']);
}
return $result;
}
/**
* Установка комплекса
* @param array $complex
* @return void()
*/
public function set_complex($complex)
{
$this->complex = $complex;
}
/**
* Тип дома
*/
public function get_house_types()
{
$result = array();
$sql = "SELECT * FROM house_material ORDER BY name";
$rez = $this->db->query($sql);
while ($house_material = $this->db->fetch_assoc($rez)) {
$result[] = array('code' => $house_material['id'], 'name' => $house_material['name']);
}
return $result;
}
/**
* Материал дома
*/
public function get_house_material()
{
$result = array();
$sql = "SELECT * FROM house_material ORDER BY name";
$rez = $this->db->query($sql);
while ($house_material = $this->db->fetch_assoc($rez)) {
$result[] = array('code' => $house_material['id'], 'name' => $house_material['name']);
}
return $result;
}
/**
* Сохранение фото
* @param array $photos
* @return array $photo_links
*/
private function save_photo($photos)
{
$this->set_user();
$Selectel = SelectelApi::getTokenAndUrl();
$token = $Selectel[0];
$storageUrl = $Selectel[1];
if (!is_dir($_SERVER['DOCUMENT_ROOT'] . "/photos")) {
mkdir($_SERVER['DOCUMENT_ROOT'] . "/photos");
}
if (!is_dir($_SERVER['DOCUMENT_ROOT'] . "/photos/complexes")) {
mkdir($_SERVER['DOCUMENT_ROOT'] . "/photos/complexes");
}
foreach ($photos as $filePos) {
if (strpos($filePos['file'], "https://") !== false) {
$newPhotos[$filePos['index']] = $filePos['file'];
} else {
if (strpos($filePos['file'], "0:/") !== false) {
$originalName = str_replace("0:/", "", $filePos['file']);
$strArray = explode(".", $originalName);
$ext = end($strArray);
if ($ext == "pjpeg") {
$ext = "jpeg";
}
$ext = mb_strtolower($ext);
$name = md5($originalName . time()) . "." . $ext;
$one = mb_substr($name, 0, 1);
if (!is_dir($_SERVER['DOCUMENT_ROOT'] . "/photos/complexes/$one")) {
mkdir($_SERVER['DOCUMENT_ROOT'] . "/photos/complexes/$one");
}
$two = mb_substr($name, 1, 1);
if (!is_dir($_SERVER['DOCUMENT_ROOT'] . "/photos/complexes/$one/$two")) {
mkdir($_SERVER['DOCUMENT_ROOT'] . "/photos/complexes/$one/$two");
}
$three = mb_substr($name, 3, 1);
if (!is_dir($_SERVER['DOCUMENT_ROOT'] . "/photos/complexes/$one/$two/$three")) {
mkdir($_SERVER['DOCUMENT_ROOT'] . "/photos/complexes/$one/$two/$three");
}
$new_path = "$one/$two/$three/$name";
$photo = "/photos/complexes/" . $new_path;
$oldPath = $_SERVER['DOCUMENT_ROOT'] . "/photos/complexes/complex_temp/" . $_SESSION['id'] . "/" . $originalName;
try {
copy($oldPath, $_SERVER['DOCUMENT_ROOT'] . $photo);
$oldPathList[] = $oldPath;
$index = $filePos['index'];
if (isset($filePos['editor'])) {
$editor = $filePos['editor'];
} else {
$editor = [];
}
resize($_SERVER['DOCUMENT_ROOT'] . $photo, null, null, null, (isset($editor['crop']) ? $editor['crop'] : null), 100, (isset($editor['rotation']) ? $editor['rotation'] : null));
$image = new Imagick();
$image->readImage($_SERVER['DOCUMENT_ROOT'] . $photo);
$resolution = 1024;
if ($this->user->agencyId == 10919 || $this->user->agencyId == 8826 || $this->user->agencyId == 12482 || $this->user->agencyId == 11916) {
$resolution = 1920;
}
if ($image->getImageWidth() > $resolution) {
$image->scaleImage($resolution, $resolution, true);
}
$image->writeImage();
//загрузка в Selectel
$fp = $_SERVER['DOCUMENT_ROOT'] . "/photos/complexes/" . $new_path;
$SelectelApi = new SelectelApi();
$r = $SelectelApi->uploadFile($storageUrl, $token, $fp, '/complexes/' . $new_path, 'image/' . $ext);
//если выложили в Selectel
if ($r) {
//заменяем путь на новый
$new_path = "https://data.joywork.ru/complexes/" . $new_path;
//удаляем файл с локального сервера
unlink($fp);
}
if ($index >= 0) {
$newPhotos[$index] = $new_path;
} else {
$newPhotos[] = $new_path;
}
} catch (Exception $e) {
$err = "Проблема загрузки фотографии " . $originalName . ", возможно, фото повреждено или его формат не соответствует расширению";
}
}
}
}
if (isset($err)) {
$result['error'] = $err;
}
if (isset($newPhotos)) {
$result = $newPhotos;
}
return $result;
}
/**
* Добавить фото для комплекса
* @param array $photos
* @param array $complex
*
*/
public function addPhotoToComplex($photos, $complex_id)
{
$newPhotos = $this->uploadPhotosToEntity($photos, 'complexes', $complex_id);
if (isset($newPhotos)) {
// $filesToDelete = array();
// $r = $this->db->query("SELECT `image` FROM complex_images WHERE complex_id = {$complex_id}");
// while ($row = $this->db->fetch_assoc($r)) {
// $filesToDelete[] = $row['image'];
// }
// $this->deleteFiles($filesToDelete);
// $this->db->query("DELETE FROM complex_images WHERE complex_id = {$complex_id}", true);
foreach ($newPhotos as &$image) {
$sql_in_image = "INSERT INTO complex_images SET complex_id = {$complex_id}, image = '{$image['url']}'";
$this->db->query($sql_in_image, true);
$image['id'] = (int)$this->db->insert_id();
$image['complex_id'] = (int)$complex_id;
}
return $newPhotos;
}
return '';
}
public function updateComplexPhoto($photo, $photo_id)
{
$r = $this->db->query("SELECT * FROM complex_images WHERE id = {$photo_id}");
$row = $this->db->fetch_assoc($r);
$fileToDelete = $row['image'];
$this->deleteFiles([$fileToDelete]);
$newPhotos = $this->uploadPhotosToEntity([$photo], 'complexes', $row['complex_id']);
if (count($newPhotos)) {
$sqlUpdate = "UPDATE complex_images SET image = '{$newPhotos[0]['url']}' WHERE id = {$photo_id}";
$this->db->query($sqlUpdate);
$row['image'] = $newPhotos[0]['url'];
}
return $row;
}
public function addPhotosToHouse($photos, $house_id)
{
$newPhotos = $this->uploadPhotosToEntity($photos, 'houses', $house_id);
if (isset($newPhotos)) {
foreach ($newPhotos as &$image) {
$sql_in_image = "INSERT INTO complex_house_images SET house_id = {$house_id}, `url` = '{$image['url']}', `name` = '{$image['name']}'";
$this->db->query($sql_in_image, true);
$image['id'] = (int)$this->db->insert_id();
$image['house_id'] = (int)$house_id;
}
return $newPhotos;
}
return '';
}
public function saveHouseDecoration($house_id, $desc = null, $id = null, $decorationId = null, $photo = null, $photo2 = null, $photo3 = null, $photo4 = null, $photo5 = null)
{
if (empty($house_id)) {
return ['status' => false];
}
$SQLSet = ["`house_id` = {$house_id}"];
if ($photo === null) {
if ($id) {
$selectSql = $this->db->query("SELECT photo FROM complex_house_decoration WHERE id = $id");
$foundDecoration = $this->db->fetch_assoc($selectSql);
if ($foundDecoration) {
$this->deleteFiles([$foundDecoration['photo']]);
}
}
$SQLSet[] = "`photo` = NULL";
} else if ($photo) {
if (is_string($photo) && strpos($photo, "https://") !== false) {
$SQLSet[] = "`photo` = '$photo'";
} else {
$newPhotos = $this->uploadPhotosToEntity([$photo], 'decoration', $house_id);
if (isset($newPhotos[0])) {
$img = $newPhotos[0];
$SQLSet[] = "`photo` = '{$img['url']}'";
}
}
}
if ($photo2 === null) {
if ($id) {
$selectSql = $this->db->query("SELECT photo FROM complex_house_decoration WHERE id = $id");
$foundDecoration = $this->db->fetch_assoc($selectSql);
if ($foundDecoration) {
$this->deleteFiles([$foundDecoration['photo2']]);
}
}
$SQLSet[] = "`photo2` = NULL";
} else if ($photo2) {
if (is_string($photo2) && strpos($photo2, "https://") !== false) {
$SQLSet[] = "`photo2` = '$photo2'";
} else {
$newPhotos = $this->uploadPhotosToEntity([$photo2], 'decoration', $house_id);
if (isset($newPhotos[0])) {
$img = $newPhotos[0];
$SQLSet[] = "`photo2` = '{$img['url']}'";
}
}
}
if ($photo3 === null) {
if ($id) {
$selectSql = $this->db->query("SELECT photo FROM complex_house_decoration WHERE id = $id");
$foundDecoration = $this->db->fetch_assoc($selectSql);
if ($foundDecoration) {
$this->deleteFiles([$foundDecoration['photo3']]);
}
}
$SQLSet[] = "`photo3` = NULL";
} else if ($photo3) {
if (is_string($photo3) && strpos($photo3, "https://") !== false) {
$SQLSet[] = "`photo3` = '$photo3'";
} else {
$newPhotos = $this->uploadPhotosToEntity([$photo3], 'decoration', $house_id);
if (isset($newPhotos[0])) {
$img = $newPhotos[0];
$SQLSet[] = "`photo3` = '{$img['url']}'";
}
}
}
if ($photo4 === null) {
if ($id) {
$selectSql = $this->db->query("SELECT photo FROM complex_house_decoration WHERE id = $id");
$foundDecoration = $this->db->fetch_assoc($selectSql);
if ($foundDecoration) {
$this->deleteFiles([$foundDecoration['photo4']]);
}
}
$SQLSet[] = "`photo4` = NULL";
} else if ($photo4) {
if (is_string($photo4) && strpos($photo4, "https://") !== false) {
$SQLSet[] = "`photo4` = '$photo4'";
} else {
$newPhotos = $this->uploadPhotosToEntity([$photo4], 'decoration', $house_id);
if (isset($newPhotos[0])) {
$img = $newPhotos[0];
$SQLSet[] = "`photo4` = '{$img['url']}'";
}
}
}
if ($photo5 === null) {
if ($id) {
$selectSql = $this->db->query("SELECT photo FROM complex_house_decoration WHERE id = $id");
$foundDecoration = $this->db->fetch_assoc($selectSql);
if ($foundDecoration) {
$this->deleteFiles([$foundDecoration['photo5']]);
}
}
$SQLSet[] = "`photo5` = NULL";
} else if ($photo5) {
if (is_string($photo5) && strpos($photo5, "https://") !== false) {
$SQLSet[] = "`photo5` = '$photo5'";
} else {
$newPhotos = $this->uploadPhotosToEntity([$photo5], 'decoration', $house_id);
if (isset($newPhotos[0])) {
$img = $newPhotos[0];
$SQLSet[] = "`photo5` = '{$img['url']}'";
}
}
}
if ($decorationId) {
$SQLSet[] = "`decoration_id` = {$decorationId}";
}
if ($desc) {
$SQLSet[] = "`desc` = '$desc'";
}
// EDIT
if ($id) {
$sql_in_image = "UPDATE complex_house_decoration SET " . implode(', ', $SQLSet) . " WHERE id = $id";
} else {
$sql_in_image = "INSERT INTO complex_house_decoration SET " . implode(', ', $SQLSet);
}
$this->db->query($sql_in_image, true);
if (!$id) {
$id = (int)$this->db->insert_id();
}
return $id;
}
public function deleteHouseDecoration($id)
{
if ($id) {
$selectSql = $this->db->query("SELECT photo FROM complex_house_decoration WHERE id = $id");
$foundDecoration = $this->db->fetch_assoc($selectSql);
if ($foundDecoration) {
$this->deleteFiles([$foundDecoration['photo'], $foundDecoration['photo2'], $foundDecoration['photo3'], $foundDecoration['photo4'], $foundDecoration['photo5']]);
}
$this->db->query("DELETE FROM complex_house_decoration WHERE id = $id");
return ['status' => true];
} else {
return ['status' => false, 'message' => 'field id required'];
}
}
public function saveHouseUTP($house_id, $desc = null, $id = null, $title = null, $photo)
{
if (empty($house_id)) {
return ['status' => false];
}
$SQLSet = ["`house_id` = {$house_id}"];
if ($photo === null) {
if ($id) {
$selectSql = $this->db->query("SELECT photo FROM complex_house_UTP WHERE id = $id");
$foundUtp = $this->db->fetch_assoc($selectSql);
if ($foundUtp) {
$this->deleteFiles([$foundUtp['photo']]);
}
}
$SQLSet[] = "`photo` = NULL";
} else if ($photo) {
$newPhotos = $this->uploadPhotosToEntity([$photo], 'utp', $house_id);
if (isset($newPhotos[0])) {
$img = $newPhotos[0];
$SQLSet[] = "`photo` = '{$img['url']}'";
}
}
if ($title) {
$SQLSet[] = "`title` = '$title'";
}
if ($desc) {
$SQLSet[] = "`desc` = '$desc'";
}
// EDIT
if ($id) {
$sql_in_image = "UPDATE complex_house_UTP SET " . implode(', ', $SQLSet) . " WHERE id = $id";
} else {
$sql_in_image = "INSERT INTO complex_house_UTP SET " . implode(', ', $SQLSet);
}
$this->db->query($sql_in_image, true);
if (!$id) {
$id = (int)$this->db->insert_id();
}
return $id;
}
public function deleteHouseUTP($id)
{
if ($id) {
$selectSql = $this->db->query("SELECT photo FROM complex_house_UTP WHERE id = $id");
$foundUtp = $this->db->fetch_assoc($selectSql);
if ($foundUtp) {
$this->deleteFiles([$foundUtp['photo']]);
}
$this->db->query("DELETE FROM complex_house_UTP WHERE id = $id");
return ['status' => true];
} else {
return ['status' => false, 'message' => 'field id required'];
}
}
public function uploadPhotosToEntity($photos, $entity_name, $entity_id = null)
{
if (!$entity_id) {
$entity_id = 'new';
}
$Selectel = SelectelApi::getTokenAndUrl();
$token = $Selectel[0];
$storageUrl = $Selectel[1];
$uploaddir = $_SERVER['DOCUMENT_ROOT'] . "/photos/$entity_name/";
$newPhotos = [];
foreach ($photos as $photo) {
$originalName = $photo['name'];
$strArray = explode(".", $originalName);
$ext = mb_strtolower(end($strArray));
if ($ext == "pjpeg") {
$ext = "jpeg";
}
$name = md5(time() . $originalName) . "." . $ext;
$one = mb_substr($name, 0, 1);
$two = mb_substr($name, 1, 1);
$three = mb_substr($name, 3, 1);
$new_path = "$one/$two/$three/$name";
$fp = $uploaddir . $new_path;
// create directories
if (!is_dir($uploaddir)) {
mkdir($uploaddir, 0777, true);
}
if (!is_dir("$uploaddir/$one/$two/$three")) {
mkdir("$uploaddir/$one/$two/$three", 0777, true);
}
if (move_uploaded_file($photo['tmp_name'], $fp)) {
$fileSize = filesize($fp); // get size before deletion
$SelectelApi = new SelectelApi();
$remotePath = "/$entity_name/" . $entity_id . '/' . $new_path;
$r = $SelectelApi->uploadFile(
$storageUrl,
$token,
$fp,
$remotePath,
'image/' . $ext
);
if ($r) {
$url = "https://data.joywork.ru/$entity_name/" . $entity_id . "/" . $new_path;
// remove local file
unlink($fp);
$newPhotos[] = [
'file_path' => $remotePath, // or $fp if you prefer local
'original_name' => $originalName,
'file_size' => $fileSize,
'thumbnail_path' => null,
'url' => $url
];
}
}
}
return $newPhotos;
}
public function addPlanToHouse($house_id, $photos, $position)
{
$sql = "INSERT INTO complex_house_plans SET house_id = {$house_id}";
$r = $this->db->query($sql, true);
$plan_id = $this->db->insert_id();
$plan_sql = "SELECT * FROM complex_house_plans WHERE id = {$plan_id}";
$plan_r = $this->db->query($plan_sql, true);
$plan = $this->db->fetch_assoc($plan_r);
$plan['images'] = $this->addPhotosToRoomPlan($photos, $plan_id, $position);
return $plan;
}
public function addMediaToHouse($house_id, $photos)
{
$medias = $this->uploadPhotosToEntity($photos, "medias", $house_id);
$result = [];
$thmbResult=null;
$retval=null;
$worker_script = dirname(__FILE__) . '/worker_thumbnails.php';
$logFile = $_SERVER['DOCUMENT_ROOT'] . '/cron/logs/media-thumbnail.log';
foreach ($medias as $media) {
// safe fallback escaping
$file_path = addslashes($media['file_path']);
$original_name = addslashes($media['original_name']);
$file_size = (int)$media['file_size'];
$thumbnail_path = isset($media['thumbnail_path']) && $media['thumbnail_path']
? "'" . addslashes($media['thumbnail_path']) . "'"
: "NULL";
$sql = "
INSERT INTO complex_house_media SET
complex_house_id = {$house_id},
file_path = '{$file_path}',
original_name = '{$original_name}',
file_size = {$file_size},
thumbnail_path = {$thumbnail_path},
created_at = NOW(),
updated_at = NOW()
";
$this->db->query($sql, true);
$media['id'] = $this->db->insert_id();
$mediaId = $media['id'];
exec("php $worker_script $mediaId $logFile >> $logFile 2>&1 &", $thmbResult, $retval);
$result[] = [
'id' => (int)$media['id'],
'name' => $media['original_name'],
'size' => (int)$media['file_size'],
'url' => 'https://data.joywork.ru' . $media['file_path'],
'thumbnail_url' => $media['thumbnail_path'] ? 'https://data.joywork.ru/' . $media['thumbnail_path'] : null,
'rooms' => []
];
}
return $result;
}
public function deleteMediaFromHouse($house_id, $media_ids)
{
if (empty($media_ids)) {
return ['status' => false, 'message' => 'No media IDs provided'];
}
// ensure IDs are integers to prevent SQL injection
$media_ids = array_map('intval', $media_ids);
$ids_str = implode(',', $media_ids);
// fetch only needed columns for this house
$sql = "SELECT file_path, thumbnail_path
FROM complex_house_media
WHERE complex_house_id = {$house_id}
AND id IN ({$ids_str})";
$r = $this->db->query($sql);
$medias = [];
while ($row = $this->db->fetch_assoc($r)) {
$medias[] = $row;
}
if (empty($medias)) {
return ['status' => false, 'message' => 'No media found'];
}
$baseUrl = 'https://data.joywork.ru';
$filesToDelete = [];
foreach ($medias as $media) {
if (!empty($media['file_path'])) {
$filesToDelete[] = $baseUrl . $media['file_path'];
}
if (!empty($media['thumbnail_path'])) {
$filesToDelete[] = $baseUrl . $media['thumbnail_path'];
}
}
// delete files
if (!empty($filesToDelete)) {
$this->deleteFiles($filesToDelete);
}
// delete from DB
$deleteSql = "DELETE FROM complex_house_media
WHERE complex_house_id = {$house_id}
AND id IN ({$ids_str})";
$this->db->query($deleteSql);
return ['status' => true, 'deleted_count' => count($medias)];
}
public function getHouseMedia($house_id)
{
$sql = "SELECT * FROM complex_house_media WHERE complex_house_id = {$house_id} ORDER BY created_at DESC";
$q = $this->db->query($sql);
$result = [];
while ($media = $this->db->fetch_assoc($q)) {
$result[] = [
'id' => (int)$media['id'],
'name' => $media['original_name'],
'size' => (int)$media['file_size'],
'url' => 'https://data.joywork.ru' . $media['file_path'],
'thumbnail_url' => $media['thumbnail_path'] ? 'https://data.joywork.ru/' . $media['thumbnail_path'] : null,
'rooms' => []
];
}
return $result;
}
public function addMediaSetToHouse($house_id, $mediaSetName, $photos = null)
{
$house_id = (int)$house_id;
$color = $this->generateUniqueColor($house_id);
// 1. Create set
$sql = "
INSERT INTO complex_house_media_set (complex_house_id, name, color, created_at)
VALUES ({$house_id}, '{$mediaSetName}', '{$color}', NOW())
";
$this->db->query($sql);
$set_id = $this->db->insert_id();
return [
'id' => $set_id,
'name' => $mediaSetName,
'color' => $color,
'items' => [],
'rooms' => []
];
}
public function deleteMediaSetFromHouse($house_id, $set_id)
{
try {
$house_id = (int)$house_id;
$set_id = (int)$set_id;
$sql = "DELETE FROM complex_house_media_set
WHERE id = $set_id AND complex_house_id = $house_id";
$this->db->query($sql);
return ['status' => true];
} catch (\Throwable $th) {
return ['status' => false];
}
}
public function getMediaSetsForHouse($house_id)
{
$house_id = (int)$house_id;
// 1. Fetch all sets for the house
$sql = "SELECT * FROM complex_house_media_set WHERE complex_house_id = {$house_id} ORDER BY created_at DESC";
$q = $this->db->query($sql);
$sets = [];
while ($set = $this->db->fetch_assoc($q)) {
$set_id = (int)$set['id'];
$rooms = $this->getMediaSetRooms($set_id);
// 2. Fetch items for this set, ordered by sort_order
$itemsSql = "
SELECT m.id, m.original_name AS name, m.file_size AS size, m.file_path AS url, m.thumbnail_path AS thumbnail_url, si.sort_order as sort_order
FROM complex_house_media_set_item si
JOIN complex_house_media m ON m.id = si.media_id
WHERE si.set_id = {$set_id}
ORDER BY si.sort_order ASC
";
$itemsQ = $this->db->query($itemsSql);
$items = [];
while ($item = $this->db->fetch_assoc($itemsQ)) {
$items[] = [
'id' => (int)$item['id'],
'name' => $item['name'],
'size' => (int)$item['size'],
'url' => 'https://data.joywork.ru' . $item['url'],
'thumbnail_url' => $item['thumbnail_url'] ? 'https://data.joywork.ru/' . $item['thumbnail_url'] : null,
'sort_order' => (int)$item['sort_order']
];
}
// 3. Add set with items
$sets[] = [
'id' => $set_id,
'name' => $set['name'],
'color' => $set['color'],
'items' => $items,
'rooms' => $rooms
];
}
return $sets;
}
public function updateMediaSet($set_id, $items, $name = null)
{
$sql = "
DELETE FROM complex_house_media_set_item
WHERE set_id = {$set_id}
";
$this->db->query($sql);
// Prepare bulk insert
$values = [];
foreach ($items as $item) {
$media_id = (int)$item['media_id'];
$sort_order = (int)$item['sort_order'];
$values[] = "({$set_id}, {$media_id}, {$sort_order})";
}
if (!empty($values)) {
$sql = "
INSERT INTO complex_house_media_set_item (set_id, media_id, sort_order)
VALUES " . implode(',', $values);
$this->db->query($sql);
}
if ($name) {
$sql = "
UPDATE complex_house_media_set
SET name = '{$name}'
WHERE id = {$set_id}
";
$this->db->query($sql);
}
return ['status' => true];
}
public function removeItemFromMediaSet($set_id, $media_id)
{
$set_id = (int)$set_id;
$media_id = (int)$media_id;
// Get the sort_order of the item being deleted
$sql = "
SELECT sort_order
FROM complex_house_media_set_item
WHERE set_id = {$set_id} AND media_id = {$media_id}
LIMIT 1
";
$result = $this->db->query($sql);
$row = $this->db->fetch_assoc($result);
if (!$row) {
return ['status' => false, 'error' => 'Item not found'];
}
$deletedOrder = (int)$row['sort_order'];
try {
// Delete the item
$sql = "
DELETE FROM complex_house_media_set_item
WHERE set_id = {$set_id} AND media_id = {$media_id}
";
$this->db->query($sql);
// Shift remaining items up
$sql = "
UPDATE complex_house_media_set_item
SET sort_order = sort_order - 1
WHERE set_id = {$set_id} AND sort_order > {$deletedOrder}
";
$this->db->query($sql);
return ['status' => true];
} catch (\Exception $e) {
return ['status' => false, 'error' => $e->getMessage()];
}
}
public function addRoomsToMediaSet($set_id, $room_ids)
{
if (empty($set_id)) {
return [];
}
$sqlDelete = "DELETE FROM complex_house_media_set_room WHERE set_id = $set_id";
$q = $this->db->query($sqlDelete);
if (!empty($room_ids)) {
// Prepare IDs safely
$room_ids = array_map('intval', $room_ids);
$idsStr = implode(',', $room_ids);
// 1. Remove rooms from ANY set (including current one)
$sqlDeleteRooms = "
DELETE FROM complex_house_media_set_room
WHERE complex_room_id IN ($idsStr)
";
$this->db->query($sqlDeleteRooms);
// 2. Insert into new set
$insertValues = [];
foreach ($room_ids as $room_id) {
$insertValues[] = "($set_id, $room_id)";
}
$valuesStr = implode(', ', $insertValues);
$sqlInsert = "
INSERT INTO complex_house_media_set_room (set_id, complex_room_id)
VALUES $valuesStr
";
$this->db->query($sqlInsert);
}
return $this->getMediaSetRooms($set_id);
}
public function getMediaSetRooms($set_id)
{
$sql = "SELECT r.id, r.position, r.type, r.number FROM complex_house_media_set_room msr JOIN complex_rooms r ON msr.complex_room_id = r.id WHERE msr.set_id = $set_id";
$q = $this->db->query($sql);
$rooms = [];
while ($room = $this->db->fetch_assoc($q)) {
$rooms[] = [
'id' => (int)$room['id'],
'position' => (int)$room['position'],
'type' => $room['type'],
'number' => $room['number']
];
}
return $rooms;
}
public function updateMediaItemSortOrder($set_id, $media_id, $oldIndex, $newIndex)
{
$set_id = (int)$set_id;
$media_id = (int)$media_id;
$oldIndex = (int)$oldIndex;
$newIndex = (int)$newIndex;
if ($oldIndex === $newIndex) {
return ['status' => true, 'message' => 'No change needed'];
}
// If DB sort_order is 1-based, add 1
$oldOrder = $oldIndex + 1;
$newOrder = $newIndex + 1;
try {
if ($newOrder < $oldOrder) {
// Moving up: shift items down
$sql = "
UPDATE complex_house_media_set_item
SET sort_order = sort_order + 1
WHERE set_id = {$set_id}
AND sort_order >= {$newOrder}
AND sort_order < {$oldOrder}
";
} else {
// Moving down: shift items up
$sql = "
UPDATE complex_house_media_set_item
SET sort_order = sort_order - 1
WHERE set_id = {$set_id}
AND sort_order > {$oldOrder}
AND sort_order <= {$newOrder}
";
}
$this->db->query($sql);
// Update moved item
$sql = "
UPDATE complex_house_media_set_item
SET sort_order = {$newOrder}
WHERE set_id = {$set_id} AND media_id = {$media_id}
";
$this->db->query($sql);
return ['status' => true];
} catch (\Exception $e) {
return ['status' => false, 'error' => $e->getMessage()];
}
}
public function getMediaSetForRoom($roomId)
{
// 1. Получаем сам set
$sql = "
SELECT s.id, s.name, s.color
FROM complex_house_media_set_room msr
JOIN complex_house_media_set s ON s.id = msr.set_id
WHERE msr.complex_room_id = " . (int)$roomId . "
LIMIT 1
";
$q = $this->db->query($sql);
$set = $this->db->fetch_assoc($q);
if (!$set) {
return null; // у комнаты нет набора
}
$set_id = (int)$set['id'];
// 2. Получаем items (медиа)
$sql = "
SELECT
m.id,
m.file_path,
m.thumbnail_path,
m.original_name,
m.file_size,
si.sort_order
FROM complex_house_media_set_item si
JOIN complex_house_media m ON m.id = si.media_id
WHERE si.set_id = $set_id
ORDER BY si.sort_order
";
$q = $this->db->query($sql);
$items = [];
while ($row = $this->db->fetch_assoc($q)) {
$items[] = [
'id' => (int)$row['id'],
'url' => 'https://data.joywork.ru' . $row['file_path'],
'thumbnail_url' => $row['thumbnail_path'] ? 'https://data.joywork.ru/' . $row['thumbnail_path'] : null,
'original_name' => $row['original_name'],
'file_size' => (int)$row['file_size'],
'sort_order' => (int)$row['sort_order'],
];
}
// 4. Собираем итог
return [
'id' => $set_id,
'name' => $set['name'],
'color' => $set['color'],
'items' => $items,
];
}
public function getHouseMediaCompletionPercentage($house_id)
{
$sql = "
SELECT
COUNT(DISTINCT r.id) AS total_rooms,
COUNT(DISTINCT msr.complex_room_id) AS used_rooms
FROM complex_rooms r
INNER JOIN complex_floors f
ON r.floor_id = f.id
INNER JOIN complex_entrances e
ON f.complex_entrance_id = e.id
LEFT JOIN complex_house_media_set_room msr
ON msr.complex_room_id = r.id
WHERE e.complex_house_id = {$house_id}
";
$q = $this->db->query($sql);
$r = $this->db->fetch_assoc($q);
return round(($r['used_rooms'] / $r['total_rooms']) * 100);
}
public function get_media_entrances($house_id)
{
$this->set_user();
$result = array();
$sql = "SELECT complex_entrances.*, ch.name as house_name, ch.parking as house_parking, ch.security as house_security, ch.fenced_area as house_fenced_area, ch.sports_ground as house_sports_ground, ch.play_ground as house_play_ground, ch.school as house_school, ch.kinder_garten as house_kinder_garten, ch.id as house_id, cl.name as complex_name FROM complex_entrances
JOIN complex_houses ch ON ch.id = complex_entrances.complex_house_id
JOIN complex_list cl ON cl.id = ch.complex_id
WHERE complex_entrances.complex_house_id={$house_id}";
$q = $this->db->query($sql);
while ($entrance = $this->db->fetch_assoc($q)) {
$floors = $this->get_media_entrance_floors($entrance);
$entrance['floors'] = $floors;
$result[] = $entrance;
}
return $result;
}
public function get_media_entrance_floors($entrance)
{
$this->set_user();
$entrance_id = $entrance['id'];
$sql = "SELECT DISTINCT complex_floors.*, floor_plans.has_light_angle as has_light_angle, floor_plans.light_angle as light_angle FROM complex_floors
LEFT JOIN complex_floors_plans floor_plan_link ON floor_plan_link.floor_id = complex_floors.id
LEFT JOIN complex_house_floor_plans floor_plans ON floor_plans.id = floor_plan_link.floor_plan_id
WHERE complex_entrance_id={$entrance_id}";
$q = $this->db->query($sql);
$floors = [];
while ($floor = $this->db->fetch_assoc($q)) {
$floor['rooms'] = [];
$floorId = (int)$floor['id'];
$sql = "SELECT
complex_rooms.id,
position,
type,
number,
layout_feature,
rooms_count,
cs.name as status_name,
cs.status as status_type,
cs.color as status_color
FROM complex_rooms
LEFT JOIN complex_status cs
ON complex_rooms.complex_status_id = cs.id
AND cs.is_archive = 0
WHERE floor_id = $floorId";
$roomsResult = $this->db->query($sql);
while ($room = $this->db->fetch_assoc($roomsResult)) {
$room['complex_status_info'] = [
'status_name' => $room['status_name'],
'status_type' => $room['status_type'],
'status_color' => $room['status_color']
];
unset($room['status_name'], $room['status_type'], $room['status_color']);
$floor['rooms'][] = $room;
}
$floors[] = $floor;
}
return $floors;
}
public function addFloorPlanToHouse($house_id, $photo)
{
$sql = "INSERT INTO complex_house_floor_plans SET house_id = {$house_id}";
$r = $this->db->query($sql, true);
$plan_id = $this->db->insert_id();
$this->addPhotoToFloorPlan($photo, $plan_id);
$plan_sql = "SELECT * FROM complex_house_floor_plans WHERE id = {$plan_id}";
$plan_r = $this->db->query($plan_sql, true);
$plan = $this->db->fetch_assoc($plan_r);
return $plan;
}
public function addPhotoToFloorPlan($photo, $floor_plan_id)
{
$newPhotos = $this->uploadPhotosToEntity([$photo], "floor_plans", $floor_plan_id);
$q = $this->db->query("DELETE FROM complex_floor_plan_figures WHERE floor_plan_id = {$floor_plan_id}"); // TODO
$result = '';
if (count($newPhotos)) {
$image = $newPhotos[0];
$sql_in_image = "UPDATE complex_house_floor_plans SET `image` = '{$image['url']}', `name` = '{$image['name']}' WHERE `id` = {$floor_plan_id}";
$r = $this->db->query($sql_in_image, true);
$result = $image;
}
return $result;
}
public function addPhotosToRoomPlan($photos, $plan_id, $position)
{
$newPhotos = $this->uploadPhotosToEntity($photos, "plans", $plan_id);
$result = [];
foreach ($newPhotos as $image) {
$sql_in_image = "INSERT INTO complex_house_plans_images SET plan_id = {$plan_id}, position = {$position}, url='{$image['url']}', name='{$image['name']}'";
$r = $this->db->query($sql_in_image, true);
$image_id = $this->db->insert_id();
$r = $this->db->query("SELECT * FROM complex_house_plans_images where id={$image_id}");
$plan_image = $this->db->fetch_assoc($r);
$result[] = $plan_image;
}
return $result;
}
/**
*
*/
public function save_photo2($photos, $patch)
{
$this->set_user();
$Selectel = SelectelApi::getTokenAndUrl();
$token = $Selectel[0];
$storageUrl = $Selectel[1];
foreach ($photos as $filePos) {
if (!isset($filePos->file) && strpos($filePos, "https://") !== false) {
$newPhotos[] = $filePos;
} elseif (isset($filePos->file) && strpos($filePos->file, "https://") !== false) {
$newPhotos[] = $filePos->file;
} else {
if (strpos($filePos->file, "0:/") !== false) {
$originalName = str_replace("0:/", "", $filePos->file);
$strArray = explode(".", $originalName);
$ext = end($strArray);
if ($ext == "pjpeg") {
$ext = "jpeg";
}
$ext = mb_strtolower($ext);
$name = md5(time() . $originalName) . "." . $ext;
$one = mb_substr($name, 0, 1);
$two = mb_substr($name, 1, 1);
$three = mb_substr($name, 3, 1);
$new_path = "$one/$two/$three/$name";
// $photo = "/photos/complexes/" . $new_path;
$oldPath = $_SERVER['DOCUMENT_ROOT'] . "/photos/complexes/complex_temp/" . $patch . "/" . $_SESSION['id'] . "/" . $originalName;
//загрузка в Selectel
$fp = $oldPath;
$SelectelApi = new SelectelApi();
$r = $SelectelApi->uploadFile($storageUrl, $token, $fp, '/complexes/' . $patch . '/' . $new_path, 'image/' . $ext);
//если выложили в Selectel
if ($r) {
//заменяем путь на новый
$new_path = "https://data.joywork.ru/complexes/" . $patch . "/" . $new_path;
//удаляем файл с локального сервера
unlink($fp);
}
// echo $new_path."\n";
$newPhotos[] = $new_path;
}
}
}
if (isset($err)) {
$result['error'] = $err;
}
if (isset($newPhotos)) {
$result = $newPhotos;
} else {
$result = '';
}
return $result;
}
/**
* Сохранение комплекса
* @return array $result
*/
public function save($linkBuilder, $phoneBuilder, $photo = null)
{
$this->set_user();
$photo_links = [];
if(!empty($photo) && !isset($photo['error'])){
$photo_links = $this->save_photo($photo);
}
$result = '';
$complex_id = (int)$this->complex->id;
$builder_id = (int)$this->complex->builder_id;
if ($builder_id > 0) {
$sql_info = "SELECT id FROM complex_builders WHERE builder_id = {$builder_id} or id = {$builder_id}";
$q_info = $this->db->query($sql_info);
if ($this->db->num_rows($q_info) > 0) {
$this->db->fetch_assoc($q_info);
$sql_up = "UPDATE complex_builders SET phone='{$phoneBuilder}', link='{$linkBuilder}' WHERE builder_id = {$builder_id} or id = {$builder_id}";
} else {
$sql_up = "INSERT INTO complex_builders SET phone='{$phoneBuilder}', link='{$linkBuilder}', builder_id = {$builder_id}";
}
// echo $sql_up."\n";
$this->db->query($sql_up);
}
$arrayComplexList = array('name', 'type', 'country_id', 'rf_region_id', 'rayon_id', 'builder_id', 'payment_types', 'contract_type','house_type', 'cian_id', 'avito_id', 'yandex_id', 'domclick_id', 'domclick_builder_id', 'has_show_room', 'cadastral_number', 'domrf_id',
'housing_class_id', 'number_apartments', 'first_floor', 'last_floor', 'ceiling_height', 'decoration_id', 'house_material', 'parking', 'closed_area', 'protected_area', 'concierge');
$arrayComplexSet = array();
$arrayComplexAddress = array('address', 'rayon', 'city', 'street', 'korpus', 'dom', 'litera', 'kladr_id', 'latitude', 'longitude');
$arrayComplexAddressSet = array();
//$arrayComplexInfrastructure = array('complex_id', 'school', 'kindergarten', 'playgrounds', 'sportsgrounds', 'cafes', 'shops', 'beautysalons', 'fitnessclub', 'park', 'trc', 'commercialobjects');
$arrayComplexInfrastructureSet = array();
$arrayComplexMetroSet = array();
$arrayComplexDop = array();
$arrayComplexUTP = array();
$arrayComplexUTP2 = array();
foreach ($this->complex as $key => $complex_val) {
if (in_array($key, $arrayComplexList)) {
if (($key === 'rayon_id' || $key === "domclick_id" || $key === "domclick_builder_id" || $key === "cian_id" || $key === "avito_id" || $key === "yandex_id" || $key === "domrf_id") && empty($complex_val)) {
$arrayComplexSet[] = $key . " = 0";
} else if ($key == 'payment_types') {
$arrayComplexSet[] = $key . " = '" . json_encode($complex_val) . "'";
} else {
$arrayComplexSet[] = $key . " = '" . $complex_val . "'";
}
}
if ($key == 'address') {
foreach ($complex_val as $address_key => $address_value) {
if (in_array($address_key, $arrayComplexAddress)) {
$arrayComplexAddressSet[] = $address_key . " = '" . $address_value . "'";
}
}
}
if ($key == 'infrastructure') {
foreach ($complex_val as $keyi => $infrastructure_val) {
$arrayComplexInfrastructureSet[] = $keyi . " = " . $infrastructure_val;
}
}
if ($key == 'metros') {
if ($this->complex->id > 0) {
$this->db->query("DELETE FROM complex_metro WHERE complex_id = {$this->complex->id}");
foreach ($complex_val as $metro) {
foreach ($metro as $keym => $metro_val) {
if ($keym == 'id') {
continue;
}
if ($keym != 'metro') {
if (!is_numeric($metro_val)) {
$metro_val = "'$metro_val'";
}
$arrayComplexMetroSet[] = $keym . " = $metro_val";
}
}
$arrayComplexMetroSet[] = 'complex_id = ' . $this->complex->id;
$sql_in_metro = "INSERT INTO complex_metro SET " . implode(',', $arrayComplexMetroSet);
$this->db->query($sql_in_metro, true);
$arrayComplexMetroSet = [];
}
}
}
if ($key == 'dop') {
foreach ($complex_val as $key_dop => $dop_val) {
if ($key_dop != 'complex_id' && $key_dop != 'UTP' && $key_dop != 'UTP2' && $key_dop != 'workdays_op') {
$arrayComplexDop[] = $key_dop . " = '" . $dop_val . "'";
} else if ($key_dop == 'UTP') {
$arrayComplexUTP = $dop_val;
} else if ($key_dop == 'UTP2') {
$arrayComplexUTP2 = $dop_val;
} else if ($key_dop == 'workdays_op') {
if (empty($dop_val) || $dop_val == 'null') {
$arrayComplexDop[] = $key_dop . " = ''";
} else {
$arrayComplexDop[] = $key_dop . " = '" . json_encode($dop_val, JSON_UNESCAPED_UNICODE) . "'";
}
}
}
}
}
$arrayComplexSet[] = 'user_id = ' . $this->user->id;
$arrayComplexSet[] = 'agency_id = ' . $this->user->agencyId;
$sql_in = '';
$set_query_complex = implode(',', $arrayComplexSet);
if ($this->complex->id > 0) {
$sql_in = "UPDATE " . $this->table . " SET " . $set_query_complex . " WHERE id = " . $this->complex->id;
} else {
$sql_in = "INSERT INTO " . $this->table . " SET " . $set_query_complex;
}
if ($this->db->query($sql_in, true)) {
$complex_id = $this->db->insert_id();
if ($this->complex->id > 0) {
$sql_in_infrastructure = "UPDATE complex_infrastructure SET " . implode(',', $arrayComplexInfrastructureSet) . " WHERE complex_id = " . $this->complex->id;
$sql_in_address = "UPDATE complex_address SET " . implode(',', $arrayComplexAddressSet) . " WHERE complex_id = " . $this->complex->id;
// $sql_in_metro = "UPDATE complex_metro SET " . implode(',', $arrayComplexMetroSet) . " WHERE complex_id = " . $this->complex->id;
if ($this->db->num_rows($this->db->query("SELECT id FROM complex_dop WHERE complex_id = {$this->complex->id}")) > 0) {
$sql_in_dop = "UPDATE complex_dop SET " . implode(', ', $arrayComplexDop) . " WHERE complex_id = " . $this->complex->id;
} else {
$arrayComplexDop[] = 'complex_id = ' . $this->complex->id;
$sql_in_dop = "INSERT INTO complex_dop SET " . implode(', ', $arrayComplexDop);
}
} else {
$arrayComplexInfrastructureSet[] = 'complex_id = ' . $complex_id;
$arrayComplexAddressSet[] = 'complex_id = ' . $complex_id;
$arrayComplexMetroSet = [];
if (isset($this->complex->metros)) {
foreach ($this->complex->metros as $metro) {
foreach ($metro as $keym => $metro_val) {
if ($keym != 'metro') {
if (!is_numeric($metro_val)) {
$metro_val = "'$metro_val'";
}
$arrayComplexMetroSet[] = $keym . " = $metro_val";
}
}
$arrayComplexMetroSet[] = 'complex_id = ' . $complex_id;
$sql_in_metro = "INSERT INTO complex_metro SET " . implode(',', $arrayComplexMetroSet);
$this->db->query($sql_in_metro, true);
$arrayComplexMetroSet = [];
}
}
// $arrayComplexMetroSet[] = 'complex_id = ' . $complex_id;
$arrayComplexDop[] = 'complex_id = ' . $complex_id;
$sql_in_infrastructure = "INSERT INTO complex_infrastructure SET " . implode(',', $arrayComplexInfrastructureSet);
$sql_in_address = "INSERT INTO complex_address SET " . implode(',', $arrayComplexAddressSet);
// var_dump($sql_in_address);die;
// if(!empty($arrayComplexDop)){
$sql_in_dop = "INSERT INTO complex_dop SET " . implode(',', $arrayComplexDop);
// }
}
//echo $sql_in_dop."\n";
$this->db->query($sql_in_address, true);
$this->db->query($sql_in_infrastructure, true);
$this->db->query($sql_in_dop, true);
if ($complex_id == 0 && $this->complex->id > 0) {
$complex_id = $this->complex->id;
}
if (count($photo_links)) {
$this->db->query("DELETE FROM complex_images WHERE complex_id = {$complex_id}", true);
foreach ($photo_links as $image) {
$sql_in_image = "INSERT INTO complex_images SET complex_id = {$complex_id}, image = '" . $image . "'";
$this->db->query($sql_in_image, true);
}
}
if (property_exists($this->complex, 'lines')) {
foreach ($this->complex->lines as $lines) {
foreach ($lines->corpuses as $deadline) {
$period = (int)strtotime($deadline->deadline);
// var_dump($deadline);
$deadline_base = date('Y-m-d', $period);
if ($deadline->del == 0 and $deadline->id == 0) {
$sql_in_deadline = "INSERT INTO complex_corpuses SET
complex_id = {$complex_id},
corpus = '{$deadline->corpus}',
line='{$lines->name}',
deadline='{$deadline_base}',
period='{$period}',
corpus_id = '{$deadline->corpus_id}',
corpus_floors = {$deadline->corpus_floors},
corpus_floors_ready = {$deadline->corpus_floors_ready},
corpus_fz_214 = {$deadline->corpus_fz_214},
corpus_status = '{$deadline->corpus_status}'
";
$this->db->query($sql_in_deadline, true);
} else if ($deadline->del == 0 and $deadline->id > 0) {
$sql_in_deadline = "UPDATE complex_corpuses SET
complex_id = {$complex_id},
corpus = '{$deadline->corpus}',
line='{$lines->name}',
deadline='{$deadline_base}',
period='{$period}',
corpus_id = '{$deadline->corpus_id}',
corpus_floors = {$deadline->corpus_floors},
corpus_floors_ready = {$deadline->corpus_floors_ready},
corpus_fz_214 = {$deadline->corpus_fz_214},
corpus_status = '{$deadline->corpus_status}'
WHERE id = {$deadline->id}
";
$this->db->query($sql_in_deadline, true);
} else if ($deadline->del > 0 && $deadline->id > 0) {
$sql_del_deadline = "DELETE FROM complex_corpuses WHERE id = {$deadline->id}";
$this->db->query($sql_del_deadline);
}
}
}
}
$this->saveUTP($arrayComplexUTP, $complex_id);
$this->saveUTP($arrayComplexUTP2, $complex_id, 'secondary');
// $this->saveActions($this->complex->actions, $complex_id);
$result = array('result' => 'done', 'complex_id' => $complex_id, 'sql' => $sql_in_dop);
} else {
$result = 'error';
}
//echo $sql_in;
return $result;
}
/**
*
*/
public function saveUTP($arrayUTP, $complex_id, $type = 'main')
{
$this->db->query("DELETE FROM complex_UTP WHERE complex_id = {$complex_id} and type='{$type}'");
foreach ($arrayUTP as $utp) {
$set = '';
$set = "title = '{$utp->title}', desck = '{$utp->desc}'";
// if(!empty($utp->images)){
//var_dump($utp->images);
if ($type == 'main') {
$images = $this->save_photo2($utp->images, 'UTP');
} else if ($type == 'secondary') {
$images = $this->save_photo2($utp->images, 'UTP2');
}
//if(!empty($images)){
$photos = json_encode($images);
//var_dump($photos);
if ($photos == 'null') $photos = '';
$set .= ", photos = '{$photos}'";
$set .= ", type = '{$type}'";
//}
//}
$set .= ", complex_id = {$complex_id}";
$sql_insert = "INSERT INTO complex_UTP SET {$set}";
//echo $sql_insert."\n";
$this->db->query($sql_insert);
}
}
// public function saveActions($actions, $complex_id)
// {
// $this->db->query("DELETE FROM complex_actions WHERE complex_id = {$complex_id}");
// foreach ($actions as $action) {
// //var_dump($action);
// $set = '';
// if (empty($action->name)) $action->name = 'Название не указано';
// $set .= "name = '{$action->name}', `desc` = '{$action->desc}', link = '{$action->link}'";
// $images = $this->save_photo2($action->images, 'Action');
// $photos = json_encode($images);
// if ($photos == 'null') $photos = '';
// $set .= ", images = '{$photos}'";
// $set .= ", complex_id = {$complex_id}";
// $sql_insert = "INSERT INTO complex_actions SET {$set}";
// //echo $sql_insert;
// $this->db->query($sql_insert);
// }
// }
public function saveComplexAction($name, $desc, $image, $link, $id, $complex_id)
{
if (empty($complex_id)) {
return ['status' => false, 'message' => 'complex_id required'];
}
if (empty($name)) $name = 'Название не указано';
$set = [];
if (!empty($name)) {
$set[] = "`name` = '$name'";
}
if (!empty($desc)) {
$set[] = "`desc` = '$desc'";
}
if (!empty($link)) {
$set[] = "`link` = '$link'";
}
$image = $this->uploadPhotosToEntity([$image], 'ComplexAction', $complex_id);
$photo = isset($image[0]) ? $image[0] : '';
$set[] = "`image` = '{$photo['url']}'";
$set[] = "`complex_id` = {$complex_id}";
if ($id) {
$sql_insert = "UPDATE complex_actions SET " . implode(', ', $set) . " WHERE id = $id";
} else {
$sql_insert = "INSERT INTO complex_actions SET " . implode(', ', $set) . "";
}
//echo $sql_insert;
$this->db->query($sql_insert, true);
if (!$id) {
$id = (int)$this->db->insert_id();
}
return [
'status' => true,
'action' => [
'id' => $id,
'name' => $name,
'desc' => $desc,
'link' => $link,
'complex_id' => $complex_id,
'image' => $photo['url']
]
];
}
public function deletecComplesAction($id)
{
if ($id) {
$selectSql = $this->db->query("SELECT image FROM complex_actions WHERE id = $id");
$foundUtp = $this->db->fetch_assoc($selectSql);
if ($foundUtp) {
$this->deleteFiles([$foundUtp['image']]);
}
$this->db->query("DELETE FROM complex_actions WHERE id = $id");
return ['status' => true];
} else {
return ['status' => false, 'message' => 'field id required'];
}
}
/**
* Добавление дома
*/
public function add_edit_house($house)
{
$this->set_user();
$house = json_decode(json_encode($house), true);
// var_dump($house);
$arrColumnHouse = [
'id',
'complex_id',
'name',
'address',
'type_building',
'placement_type',
'decoration_id',
'house_type',
'status_corpus',
'deadline_quarter',
'deadline_year',
'development_start_quarter',
'development_start_year',
'development_end_quarter',
'development_end_year',
'sales_start_month',
'sales_start_year',
'sales_end_month',
'sales_end_year',
'is_archive',
'agency_id',
'user_id',
'security',
'parking',
'fenced_area',
'sports_ground',
'play_ground',
'school',
'kinder_garten',
'cian_id',
'avito_id',
'yandex_id',
'domclick_id',
'domclick_builder_id',
'is_partner_show',
'domrf_id',
];
$arrUTPColumns = [
'id',
'house_id',
'title',
'desck',
'type',
'photo'
];
$arrUKeys = array();
$arrUVals = array();
$arrKeys = array();
$arrVals = array();
foreach ($arrColumnHouse as $column) {
if ($column == 'deadline_quarter' || $column == 'development_end_quarter' || $column == 'development_start_quarter') {
$temp_column = str_replace('_quarter', '', $column);
if (isset($house[$temp_column]['quarter']) && ($house[$temp_column]['quarter'] != null || $house[$temp_column]['quarter'] != 0)) {
$arrKeys[] = $column;
$arrVals[] = "'" . $house[$temp_column]['quarter'] . "'";
}
} else if ($column == 'deadline_year' || $column == 'development_start_year' || $column == 'development_end_year' || $column == 'sales_start_year' || $column == 'sales_end_year') {
$temp_column = str_replace('_year', '', $column);
if (isset($house[$temp_column]['year']) && ($house[$temp_column]['year'] != null || $house[$temp_column]['year'] != 0)) {
$arrKeys[] = $column;
$arrVals[] = "'" . $house[$temp_column]['year'] . "'";
}
} else if ($column == 'sales_start_month' || $column == 'sales_end_month') {
$temp_column = str_replace('_month', '', $column);
// var_dump($temp_column);
// var_dump($house[$temp_column]);
if (isset($house[$temp_column]['month']) && ($house[$temp_column]['month'] != null || $house[$temp_column]['month'] != 0)) {
$arrKeys[] = $column;
$arrVals[] = "'" . $house[$temp_column]['month'] . "'";
}
} else if ($column == 'agency_id') {
$arrKeys[] = $column;
$arrVals[] = $this->user->agencyId;
} else if ($column == 'user_id') {
$arrKeys[] = $column;
$arrVals[] = $this->user->id;
} else {
if (isset($house[$column]) && ($house[$column] !== null || $house[$column] !== 0)) {
$arrKeys[] = $column;
if ($column == 'is_archive') {
$arrVals[] = (int)$house[$column];
} else if ($column == 'is_partner_show') {
$arrVals[] = (int) $house[$column];
} else if ($column == 'security') {
$arrVals[] = (int) $house[$column];
} else if ($column == 'sports_ground') {
$arrVals[] = (int) $house[$column];
} else if ($column == 'play_ground') {
$arrVals[] = (int) $house[$column];
} else if ($column == 'school') {
$arrVals[] = (int) $house[$column];
} else if ($column == 'kinder_garten') {
$arrVals[] = (int) $house[$column];
} else if ($column == 'fenced_area') {
$arrVals[] = (int) $house[$column];
} else {
$arrVals[] = "'" . $house[$column] . "'";
}
} else if (isset($house[$column]) && filter_var($house[$column], FILTER_VALIDATE_BOOLEAN)) {
$arrVals[] = $house[$column] == 'true' ? 1 : 0;
} else if (isset($house[$column]) && is_string($house[$column])) {
$arrVals[] = "'$house[$column]'";
}
}
}
if ($house['id'] > 0) {
$sql = "UPDATE `complex_houses` SET ";
$updatePairs = array();
foreach ($arrKeys as $index => $key) {
$updatePairs[] = "`$key` = " . $arrVals[$index];
}
$sql .= implode(',', $updatePairs);
$sql .= " WHERE id = {$house['id']}";
if ($this->db->query($sql)) {
// Сохраняем связи с программами рассрочек
if (is_array($house['installments'])) {
$house_id = (int)$house['id'];
(new Installments())->updateHouseInstallments($house_id, $house['installments']);
}
$result = array('id' => $house['id']);
} else {
$result = array('error' => $this->db->error());
}
return $result;
} else {
$sql = "INSERT INTO `complex_houses` (" . implode(',', $arrKeys) . ") VALUES (" . implode(',', $arrVals) . ")";
// echo $sql;
if ($this->db->query($sql)) {
$id = $this->db->insert_id();
// Сохраняем связи с программами рассрочек
if (is_array($house['installments'])) {
$house_id = $house['id'] > 0 ? (int)$house['id'] : $id;
(new Installments())->updateHouseInstallments($house_id, $house['installments']);
}
$result = array('id' => $id);
} else {
$result = array('error' => $this->db->error());
}
return $result;
}
}
/**
* Очериди комплекса
* @param int complex_id
*/
public function get_corpuses($complex_id)
{
$result = array();
$sql = "SELECT * FROM complex_corpuses WHERE complex_id = {$complex_id}";
$q = $this->db->query($sql);
while ($corpus = $this->db->fetch_assoc($q)) {
$corpus['deadline'] = Date::getFormatedEndingPeriod($corpus['deadline']);
$result[] = $corpus;
}
return $result;
}
/**
*
*/
private function showAds($obj)
{
$showAds = true;
if ((in_array($_SESSION['agency_id'], array(8353, 8375, 8376, 8399, 8867, 8910, 9082, 9072, 9077, 9110, 9588, 9805, 9973, 7864, 10203, 10041, 10493, 4873, 10876, 10982, 11086, 10933, 11456, 11501, 11397, 7507, 8826))) && !in_array($_SESSION['id'], array(8373, 8353, 8375, 8376, 8399, 8867, 8910, 9082, 9072, 9077, 9110, 9588, 9805, 9973, 7864, 10203, 10041, 10493, 4873, 10876, 10982, 11086, 10933, 11456, 11501, 11397, 7507, 8826))) {
$showAds = false;
}
if ($showAds && $obj['archive'])
$showAds = false;
/* if ($post['selected'] == "potential" || $post['selected'] == "favor")
$showAds = false;*/
if ($_SESSION['agency_id'] == 8435 && (!in_array($_SESSION['id'], array(8435, 8532, 8541, 8555))))
$showAds = false;
if ($_SESSION['agency_id'] == 8649 && (!in_array($_SESSION['id'], array(8649, 8653)))) {
$showAds = false;
}
if ($_SESSION['agency_id'] == 8867 && (!in_array($_SESSION['id'], array(8867, 8910, 9082, 9072, 9077)))) {
$showAds = false;
}
if ($_SESSION['id'] == 9170) {
$showAds = true;
}
if ($_SESSION['id'] == 9588 || $_SESSION['id'] == 9904) {
$showAds = true;
}
if ($_SESSION['id'] == 9110 || $_SESSION['id'] == 9892) {
$showAds = true;
}
if ($_SESSION['id'] == 9805 || $_SESSION['id'] == 9927) {
$showAds = true;
}
if ($_SESSION['id'] == 9973) {
$showAds = true;
}
if ($_SESSION['id'] == 10203) {
$showAds = true;
}
if ($_SESSION['id'] == 10041) {
$showAds = true;
}
if ($_SESSION['id'] == 7864 || $_SESSION['id'] == 8118 || $_SESSION['id'] == 7866 || $_SESSION['id'] == 8432 || $_SESSION['id'] == 9152 || $_SESSION['id'] == 9426) {
$showAds = true;
}
if ($_SESSION['id'] == 10493 || $_SESSION['id'] == 10606) {
$showAds = true;
}
if ($_SESSION['id'] == 4873) {
$showAds = true;
}
if ($_SESSION['id'] == 10876) {
$showAds = true;
}
if ($_SESSION['id'] == 10982 || $_SESSION['id'] == 10992 || $_SESSION['id'] == 11299) {
$showAds = true;
}
if ($_SESSION['id'] == 11086) {
$showAds = true;
}
if ($_SESSION['id'] == 10933 || $_SESSION['id'] == 11547 || $_SESSION['id'] == 11538) {
$showAds = true;
}
if ($_SESSION['id'] == 11456 || $_SESSION['id'] == 11552) {
$showAds = true;
}
if ($_SESSION['id'] == 11501 || $_SESSION['id'] == 11549) {
$showAds = true;
}
if ($_SESSION['id'] == 11397 || $_SESSION['id'] == 11583) {
$showAds = true;
}
if (in_array((int)$_SESSION['id'], [11378, 11688, 11690, 11691, 11694, 11696, 11698, 11700, 11702, 11864, 11865, 11868, 11873, 8829, 11799, 11801, 11803, 11806, 11808, 11810, 11812, 11814, 11816, 11818, 11819, 11821, 11822, 11824, 11825, 11827, 11830, 11831, 11833, 11835, 11850, 11837, 11839, 11840, 11841, 11843, 11845, 11847, 11849, 11851, 11854, 11856, 11859, 11861, 11683, 11877, 11879, 11880, 11882, 11705, 11709, 11711, 11713, 11715, 11720, 11722, 11723, 11725, 11726, 11728, 11731, 11733, 11735, 11737, 11739, 11741, 11743, 11745, 11747, 11749, 11753, 11763, 11765, 11769, 11770, 11771, 11772, 11773, 11774, 11775, 11776, 11777, 11779, 11781, 11784, 11786, 11788, 11791, 11793, 11795, 11796, 11797, 11798, 11800, 11802, 11804, 11807, 11809, 11811, 11813, 11815, 11817, 11820, 11823, 11826, 11828, 11829, 11832, 11834, 11836, 11838, 11842, 11844, 11846, 11848, 11852, 11853, 11855, 11857, 11858, 11860, 11862, 11863, 11866, 11869, 11871, 11872, 11875, 11876, 11878, 11881, 11703, 11704, 11706, 11708, 11710, 11712, 11714, 11716, 11717, 11718, 11719, 11721, 11724, 11727, 11729, 11730, 11732, 11734, 11736, 11738, 11740, 11742, 11744, 11746, 11748, 11750, 11751, 11752, 11754, 11755, 11756, 11757, 11758, 11759, 11760, 11761, 11762, 11764, 11766, 11767, 11768, 11778, 11780, 11782, 11783, 11785, 11787, 11789, 11790, 11792, 11794, 11883, 11884, 11885, 11886, 11887, 11888, 11889, 11890, 11891, 11892, 11893, 11894, 11895, 11679, 11680, 11681, 11682, 11684, 11685, 11686, 11687, 11689, 11692, 11693, 11695, 11697, 11699, 11701, 11896, 11897, 11898, 11899, 11900, 11901, 11902, 11903, 11904, 11905, 11906])) {
$showAds = false;
}
if (in_array((int)$_SESSION['id'], [8826, 8827, 11867, 11870, 11874])) {
$showAds = true;
}
if (in_array((int)$_SESSION['id'], [7507, 7719, 7513, 8787, 9878, 10483, 10815, 7514, 7516, 7517, 7518, 7519, 7614, 7762, 8364, 10484, 9047, 9928, 10386, 10522, 10530, 10531, 7548, 7931, 8893, 9048, 9809, 11039, 11805, 10589, 11329, 11516, 9770, 10338, 7905, 8569, 11641, 11707, 7520, 7540, 7541, 7826, 8729, 8737, 9861, 10156, 11034, 7508, 7509, 7510, 7512, 7515, 7543, 7553, 10499])) // АН ООО МИДОМ
$showAds = false;
if (in_array((int)$_SESSION['id'], [7507, 7509, 7543, 7905, 8364, 11707]))
$showAds = true;
return $showAds;
}
private function object_details($obj)
{
global $SROK_ARENDY;
global $etaz_first_types;
// var_dump($hasAutoSearchLayout);
$obj['price'] = number_format($obj['stoim'], 0, ',', ' ');
$sql_nb_info = "SELECT id, nb_end_date, zipal_new_flat_decoration_type_id FROM object_nb_info WHERE object_id = {$obj['id']}";
$info_obj = $this->db->fetch_assoc($this->db->query($sql_nb_info));
$obj['nb_end_date'] = Date::getFormatedEndingPeriod($info_obj['nb_end_date']);
$obj['decaration'] = "";
if (isset($this->listDecorations['list'][$info_obj['zipal_new_flat_decoration_type_id']])) {
$obj['decaration'] = $this->listDecorations['list'][$info_obj['zipal_new_flat_decoration_type_id']];
}
$obj['plan'] = '';
$sqlP = "SELECT * FROM objects_plan WHERE object_id = {$obj['id']}";
$rez_plan = $this->db->query($sqlP);
if ($this->db->num_rows($rez_plan) > 0) {
$obj_plan = $this->db->fetch_assoc($rez_plan);
if ($obj_plan['img_plan'] != '') {
if (stripos($obj_plan['img_plan'], "http://") === false && stripos($obj_plan['img_plan'], "https://") === false) {
$obj_plan['img_plan'] = "/photos/" . $obj_plan['img_plan'];
}
$obj['plan'] = $obj_plan['img_plan'];
}
}
$obj['photos'] = array();
$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 = $this->db->query($sqlPhotoInfo);
if ($this->db->num_rows($rezPhotoInfo) > 0) {
while ($photoInfo = $this->db->fetch_assoc($rezPhotoInfo)) {
if (stripos($photoInfo['photo'], "http://") === false && stripos($photoInfo['photo'], "https://") === false) {
$obj['photos'][] = '/photos/' . $photoInfo['photo'];
} else {
$obj['photos'][] = $photoInfo['photo'];
}
}
}
//Доп обработка
if (!$obj['etazh']) {
$obj['etazh'] = Filter::getFloorFromName($obj['nazv'], true);
} else {
Filter::getFloorFromName($obj['nazv'], true);
}
if (!$obj['etazh_iz']) {
$obj['etazh_iz'] = Filter::getMaxFloorFromName($obj['nazv'], true);
} else {
Filter::getMaxFloorFromName($obj['nazv'], true);
}
Filter::getSpaceFromName($obj['nazv'], true);
$obj['nazv'] = Filter::name($obj['nazv']);
$obj['sobstv'] = Filter::replaceSobstv($obj['sobstv']);
$obj['opis'] = cleanHtml($obj['opis'], '<p><br><strong><em><ul><ol><li>');
if ($obj['stoim_prim'] == 0) {
$obj['stoim_prim'] = '';
}
//$canEdit = false;
$date_add_temp = explode(" ", date("d.m.Y H:i", strtotime($obj['date_add'])));
if (isset($obj['date'])) $date_add_temp = explode(" ", date("d.m.Y H:i", strtotime($obj['date'])));
list($dateAdd, $timeAdd) = $date_add_temp;
list($d, $m, $y) = explode(".", $dateAdd);
$date_add = $d . " " . getRusMonth($m) . " " . $y;
$date = $date_add . " " . $timeAdd;
$obj['date'] = $date;
if ($obj['operation_type'] == 0) {
$obj['SROK_AREND'] = "Сдается " . $SROK_ARENDY[$obj['srok']];
if (!empty($obj['prim_srok'])) {
$obj['SROK_AREND'] .= " (" . $obj['prim_srok'] . ")";
}
}
$canDeleteOwn = false;
if (!empty($this->user)) {
if ($this->user->agencyId == 8307) {
$canDeleteOwn = false;
if ($_SESSION['id'] == 8307) {
$canDeleteOwn = true;
}
} else {
if ($_SESSION['id'] == 10499) {
$canDeleteOwn = false;
} else {
if ($this->user->agency == 1 || $this->user->users_admin == 1) {
$canDeleteOwn = true;
}
}
}
}
$obj['canDeleteOwn'] = $canDeleteOwn;
$filesTotal = 0;
$sql_f = "SELECT * FROM clients_files WHERE object_id = {$obj['id']} AND event_id > 0";
$q_f = $this->db->query($sql_f);
$filesTotal += $this->db->num_rows($q_f);
$obj['filesTotal'] = $filesTotal;
//$obj['hasAutoSearchLayout'] = $hasAutoSearchLayout;
$mtr = array();
$sql = "SELECT metro.metro FROM metro, sp_metro WHERE sp_metro.id_metro = metro.id AND sp_metro.id_obj = {$obj['id']}";
$result = $this->db->query($sql);
while ($m = $this->db->fetch_row($result)) {
$mtr[] = $m[0];
}
if (!empty($obj['rayon'])) {
$obj['rayon'] = str_replace([' район', 'район', ' р-н', 'р-н'], '', $obj['rayon']) . ' район';
}
$obj['mtr'] = $mtr;
$objCoordinates = [];
$obj['address'] = '';
if (isset($objCoordinatesArray)) {
foreach ($objCoordinatesArray as $objCoords) {
if ($objCoords['object_id'] == $obj['id']) {
$objCoordinates = $objCoords;
break;
}
}
} else {
$sql_coordinates = "SELECT address FROM object_location WHERE object_id=" . $obj['id'];
$rezCoordinates = $this->db->query($sql_coordinates);
if ($this->db->num_rows($rezCoordinates) > 0) {
$objCoordinates = $this->db->fetch_assoc($rezCoordinates);
}
}
if ($objCoordinates && isset($objCoordinates['address'])) {
$obj['address'] = $objCoordinates['address'];
} else {
$obj['address'] = $obj['adres'];
if ($obj['dom']) {
$obj['address'] .= ", " . $obj['dom'];
}
if ($obj['korpus']) {
$obj['address'] .= ", корпус " . $obj['korpus'];
}
if ($obj['litera']) {
$obj['address'] .= ", литера " . $obj['litera'];
}
}
if ((int)$obj['etazh'] > 0) {
if ((int)$obj['etazh'] == 1 && !empty($obj['etaz_first_type'])) {
$obj['etazh'] = $etaz_first_types[$obj['etaz_first_type']];
} else {
$obj['etazh'] = $obj['etazh'] . ' этаж';
}
}
$objClientsArrayCurrent = [];
$clients_count = 0;
if (isset($objClientsArray)) {
foreach ($objClientsArray as $objClient) {
if (strpos($objClient["objects"], $obj['id']) !== false) {
$clients_count++;
$objClientsArrayCurrent[] = $objClient;
}
}
} else {
$objClientsArray = [];
$clientObjIds = [];
$sql_cl_obj = "SELECT client_id FROM client_objects WHERE object_id = {$obj['id']}";
$q_cl_obj = mysql_query($sql_cl_obj);
while ($r_cl_obj = mysql_fetch_assoc($q_cl_obj)) {
$clientObjIds[] = $r_cl_obj['client_id'];
}
if (!empty($clientObjIds)) {
$sql_clients = "SELECT `id`, `fio`, `email`, `phone` FROM `clients` WHERE id in (" . implode(',', $clientObjIds) . ")";
$q_client = $this->db->query($sql_clients);
$clients_count = $this->db->num_rows($q_client);
if ($clients_count > 0) {
while ($objCl = $this->db->fetch_assoc($q_client)) {
$objClientsArrayCurrent[] = $objCl;
}
}
}
}
$obj['clientsArrayCurrent'] = $objClientsArrayCurrent;
$obj['isPdf'] = 0;
if (in_array($obj['id'], $_SESSION['to_send'])) {
$obj['isPdf'] = 1;
}
$obj['isVK'] = 0;
if ($this->user->agencyId != 5530 || $this->user->agencyId == 5530) {
if (!empty($this->user->vk_token)) {
$obj['isVK'] = 1;
}
}
$notes_bd_usl = ' true';
$sql_count_notes = "SELECT COUNT(*) FROM object_notes WHERE object_id = $obj[id] AND $notes_bd_usl";
$obj['notes'] = $this->db->result($this->db->query($sql_count_notes), 0);
$requestsCount = 0;
if ($this->objRequisitionsArray) {
foreach ($this->objRequisitionsArray as $objRequisition) {
if ($objRequisition["object_id"] == $obj["id"]) {
$requestsCount = $objRequisition["cnt"];
break;
}
}
} else {
$sqlRequest = "SELECT id FROM requisitions WHERE type_id=4 and object_id = $obj[id] and cancel=0";
$qRequest = $this->db->query($sqlRequest);
$requestsCount = $this->db->num_rows($qRequest);
}
if ($this->objPricesArray) {
foreach ($this->objPricesArray as $objPrice) {
if ($objPrice["object_id"] == $obj["id"]) {
if (!is_null($objPrice['prep_price'])) {
$obj['prep_price'] = $objPrice['prep_price'];
}
if (!is_null($objPrice['start_price'])) {
$obj['start_price'] = $objPrice['start_price'];
}
if (!is_null($objPrice['fact_price'])) {
$obj['fact_price'] = $objPrice['fact_price'];
}
break;
}
}
}
$obj['requestsCount'] = $requestsCount;
$obj['showAds'] = $this->showAds($obj);
$obj['stoim_format'] = number_format($obj['stoim'], 0, ',', ' ');
if (!isset($obj['prep_price']))
$obj['prep_price'] = 0;
if (!isset($obj['start_price']))
$obj['start_price'] = 0;
if (!isset($obj['fact_price']))
$obj['fact_price'] = 0;
//if(isset())
$obj['prep_price'] = number_format($obj['prep_price'], 0, ',', ' ');
$obj['start_price'] = number_format($obj['start_price'], 0, ',', ' ');
$obj['fact_price'] = number_format($obj['fact_price'], 0, ',', ' ');
$obj['objPriceHistory'] = array();
$sqlPriceHistory = "SELECT date_change_price, price, price_ku FROM objects_price_history WHERE object_id ={$obj['id']}";
$rezPriceHistory = $this->db->query($sqlPriceHistory);
while ($objPriceHistory = $this->db->fetch_assoc($rezPriceHistory)) {
$objPriceHistory['price'] = number_format($objPriceHistory['price'], 0, ',', ' ');
$objPriceHistory['date_change_price'] = date('d.m.Y', strtotime($objPriceHistory['date_change_price']));
$obj['objPriceHistory'][] = $objPriceHistory;
}
$obj['type_k'] = "-";
if ((int)$obj['komnat'] > 0) {
$obj['type_k'] = (int)$obj['komnat'] . " к.кв.";
if ($obj['studio_flag'] > 0) {
$obj['type_k'] = "студия";
}
}
$result = $obj;
return $result;
}
/**
*
*/
public function set_filter($filter)
{
$this->filter = $filter;
}
/**
* Комплекс
* @param int $complex_id
*/
public function get_complex_one($complex_id, $photo_visible = true, $objects_list = true, $object_info_id = 0)
{
$this->get_decarations();
$this->set_user();
$sql = "SELECT * FROM complex_list WHERE id={$complex_id} AND agency_id={$this->user->agencyId}";
$q = $this->db->query($sql);
$complex = $this->db->fetch_assoc($q);
if (!$complex) {
echo(json_encode([
'error' => 'Complex not Found'
]));
exit;
}
$result['images'] = array();
$result['builder'] = array();
$result = array();
$complex['can_delete'] = 0;
if ($this->user->agency > 0 || $this->user->users_admin) {
$complex['can_delete'] = 1;
}
$result = $complex;
//С фотками
if ($photo_visible) {
$appendedFiles = array();
$sql_images = "SELECT * FROM complex_images WHERE complex_id = {$complex_id}";
$q_images = $this->db->query($sql_images);
while ($r_images = $this->db->fetch_assoc($q_images)) {
$result['images'][] = $r_images;
$ph_url = $r_images['image'];
$name = $r_images['image'];
$pathInfo = pathinfo($name);
$appendedFiles[] = array(
"name" => $ph_url,
"file" => $ph_url,
"type" => "image/" . $pathInfo['extension'],
"data" => array(
"url" => $ph_url,
"thumbnail" => $ph_url
)
);
}
$result['images_uploader'] = $appendedFiles;
}
$sql_builder = "SELECT * FROM builders WHERE id = {$complex['builder_id']}";
if ($complex['builder_id'] >= 10000) {
$sql_builder = "SELECT * FROM complex_builders WHERE id = {$complex['builder_id']}";
}
$q_builder = $this->db->query($sql_builder);
if ($this->db->num_rows($q_builder) > 0) {
$logo = '';
$builder = $this->db->fetch_assoc($q_builder);
if (!empty($builder['logo']) && file_exists($_SERVER['DOCUMENT_ROOT'] . '/photos/builder/' . $builder['logo'])) {
$logo = '/photos/builder/' . $builder['logo'];
}
$result['builder'] = array('name' => $builder['name'], 'logo' => $logo);
} else {
$result['builder'] = array('name' => '', 'logo' => '');
}
$sql_metro = "SELECT metro.id, metro.metro, m.metro_id, m.subway_time, m.subway_type FROM complex_metro as m
JOIN metro on metro.id = m.metro_id
WHERE m.complex_id={$complex_id}";
$result['metros'] = [];
$mQuery = $this->db->query($sql_metro);
while ($metro = $this->db->fetch_assoc($mQuery)) {
$result['metros'][] = $metro;
}
$result['dop'] = array('domclick_id' => null);
$sql_dop = "SELECT * FROM complex_dop WHERE complex_id={$complex_id}";
$dop = $this->db->fetch_assoc($this->db->query($sql_dop));
if ($dop) {
$result['dop'] = $dop;
if ($result['dop']['domclick_id'] == 0) $result['dop']['domclick_id'] = null;
if (!empty($result['dop']['workdays_op'])) $result['dop']['workdays_op'] = json_decode($result['dop']['workdays_op'], true);
$result['dop']['UTP'] = array();
$result['dop']['UTP2'] = array();
$sql_dop_utp = "SELECT * FROM complex_UTP WHERE complex_id = {$complex_id}";
$q_dop_utp = $this->db->query($sql_dop_utp);
while ($r_dop_utp = $this->db->fetch_assoc($q_dop_utp)) {
$otpImages = [];
if (!empty($r_dop_utp['photos'])) {
// echo $r_dop_utp['photos'];
$otpImages = json_decode($r_dop_utp['photos'], true);
}
if ($r_dop_utp['type'] == 'main') {
$result['dop']['UTP'][] = array('title' => $r_dop_utp['title'], 'desc' => $r_dop_utp['desck'], 'isDiv' => true, 'isEdit' => false, 'images' => $otpImages, 'imagesUTP' => $otpImages, 'isInput' => false);
} else if ($r_dop_utp['type'] == 'secondary') {
$result['dop']['UTP2'][] = array('title' => $r_dop_utp['title'], 'desc' => $r_dop_utp['desck'], 'isDiv' => true, 'isEdit' => false, 'images' => $otpImages, 'imagesUTP' => $otpImages, 'isInput' => false);
}
}
}
$result['actions'] = [];
$sql_action = "SELECT * FROM complex_actions WHERE complex_id = {$complex_id}";
$q_action = $this->db->query($sql_action);
while ($r_action = $this->db->fetch_assoc($q_action)) {
$result['actions'][] = $r_action;
}
$sql_address = "SELECT * FROM complex_address WHERE complex_id={$complex_id}";
$q_address = $this->db->query($sql_address);
$result['address'] = $this->db->fetch_assoc($q_address);
$decoration = '';
$decoration_res = $this->db->fetch_assoc($this->db->query("SELECT name FROM decoration_types WHERE id={$complex['decoration_id']}"));
if (isset($decoration_res['name'])) {
$decoration = $decoration_res['name'];
}
$result['decoration'] = $decoration;
//Тип дома
$house_types = '';
if ($complex['house_type'] > 0) {
$house_types_res = $this->db->fetch_assoc($this->db->query("SELECT name FROM house_material WHERE id={$complex['house_type']}"));
if (isset($house_types_res['name'])) {
$house_types = $house_types_res['name'];
}
}
$result['house_type_name'] = $house_types;
$house_material = '';
if ($complex['house_material'] > 0) {
$house_material_res = $this->db->fetch_assoc($this->db->query("SELECT name FROM house_material WHERE id={$complex['house_material']}"));
if (isset($house_material_res['name'])) {
$house_material = $house_material_res['name'];
}
}
$result['house_material_name'] = $house_material;
$result['infrastructure'] = array();
$infrastructure = $this->db->fetch_assoc($this->db->query("SELECT * FROM complex_infrastructure WHERE complex_id = {$complex['id']}"));
$result['infrastructure'] = $infrastructure;
$result['corpuses'] = $this->get_corpuses($complex_id);
$result['lines_info'] = array();
/*$block['lines'][(int)$building['line']]['corpuses'][] = array('corpus'=> $building['corp'],
'period' => Date::getFormatedEndingPeriod($building['deadline']),
'deadline' => date('d.m.Y', strtotime($building['deadline'])),
'isDiv' => true,
'isEdit' => false,
'date' => '',
);*/
foreach ($result['corpuses'] as $corpus) {
// var_dump($corpus);
if (!isset($result['lines_info'][$corpus['line']])) $result['lines_info'][$corpus['line']] = array();
$result['lines_info'][$corpus['line']]['corpuses'][] = array(
'id' => $corpus['id'],
'corpus' => $corpus['corpus'],
'period' => $corpus['deadline'],
'deadline' => date('d.m.Y', $corpus['period']),
'isDiv' => true,
'isEdit' => false,
'date' => '',
'corpus_id' => $corpus['corpus_id'],
'corpus_floors' => $corpus['corpus_floors'],
'corpus_floors_ready' => $corpus['corpus_floors_ready'],
'corpus_fz_214' => $corpus['corpus_fz_214'],
'corpus_status' => $corpus['corpus_status'],
'del' => 0
);
}
// var_dump($result['lines']);
$result['use_in_advert'] = 0;
$result['add_to_bn_feed'] = 0;
$result['add_to_yandex_feed'] = 0;
$result['add_to_domclick_feed'] = 0;
$result['add_to_avito_feed'] = 0;
$result['add_to_emls_feed'] = 0;
$result['add_to_cian_feed'] = 0;
$result['add_to_zipal'] = 0;
$sql_advert = "SELECT * FROM complex_advert WHERE complex_id = {$complex_id}";
$q_advert = $this->db->query($sql_advert);
if ($this->db->num_rows($q_advert) > 0) {
$r_advert = $this->db->fetch_assoc($q_advert);
$result['use_in_advert'] = (int)$r_advert['use_in_advert'];
$result['add_to_bn_feed'] = (int)$r_advert['add_to_bn_feed'];
$result['add_to_yandex_feed'] = (int)$r_advert['add_to_yandex_feed'];
$result['add_to_domclick_feed'] = (int)$r_advert['add_to_domclick_feed'];
$result['add_to_avito_feed'] = (int)$r_advert['add_to_avito_feed'];
$result['add_to_emls_feed'] = (int)$r_advert['add_to_emls_feed'];
$result['add_to_cian_feed'] = (int)$r_advert['add_to_cian_feed'];
$result['add_to_zipal'] = (int)$r_advert['add_to_zipal'];
}
$this->set_sphinx2();
$result['objects_total'] = 0;
$sql_obj_total = "SELECT id FROM objects WHERE archive=0 and complex_id = {$complex_id} LIMIT 1000000 OPTION max_matches=1000000";
$q_obj_total = $this->sphinx2->query($sql_obj_total);
$result['objects_total'] = $this->sphinx2->num_rows($q_obj_total);
/*$sql_obj_total = "SELECT count(*) as total FROM complex_objects WHERE complex_id = {$complex_id}";
$q_obj_total = $this->db->query($sql_obj_total);
$result['objects_total'] = $this->db->result($q_obj_total);*/
//Инфа по заданному объекту
if ($object_info_id > 0) {
$sql_object = "SELECT * FROM complex_objects WHERE object_id = {$object_info_id}";
$q_object = $this->db->query($sql_object);
if ($this->db->num_rows($q_object) > 0) {
$compl_obj = $this->db->fetch_assoc($q_object);
$result['corpus_id_object'] = $compl_obj['corpus_id'];
} else {
$result['corpus_id_object'] = 0;
}
}
//С объектами
if ($objects_list) {
$result['objects'] = array();
$obj_ids = array();
$objLines = array();
$objCorpuses = array();
$whereObjects = '';
if (!empty($this->filter)) {
//Фильтр
if (!empty($this->filter->metros)) {
$whereObjects .= " AND id_metro in (" . implode(',', $this->filter->metros) . ")";
}
if (!empty($this->filter->period)) {
$whereObjects .= " AND nb_end_date <= {$this->filter->period}";
}
if (!empty($this->filter->sq_all_ot)) {
$whereObjects .= " AND ploshad >= {$this->filter->sq_all_ot}";
}
if (!empty($this->filter->sq_all_do)) {
$whereObjects .= " AND ploshad <= {$this->filter->sq_all_do}";
}
if (!empty($this->filter->flat_floor_ot)) {
$whereObjects .= " AND etazh >= {$this->filter->flat_floor_ot}";
}
if (!empty($this->filter->flat_floor_do)) {
$whereObjects .= " AND etazh <= {$this->filter->flat_floor_do}";
}
if (!empty($this->filter->stoim_ot)) {
$whereObjects .= " AND stoim >= {$this->filter->stoim_ot}";
}
if (!empty($this->filter->stoim_do)) {
$whereObjects .= " AND stoim <= {$this->filter->stoim_do}";
}
if (!empty($this->filter->types_room)) {
$types_room = array();
$sql = "SELECT * FROM room_types where id in (" . implode(',', $this->filter->types_room) . ")";
$rez = $this->db->query($sql);
while ($type_room = $this->db->fetch_assoc($rez)) {
$types_room[] = (int)$type_room['name'];
}
$whereObjects .= " AND komnat in (" . implode(',', $types_room) . ")";
}
if (!empty($this->filter->decaration_types)) {
$objDIds = array();
$sql_d = "SELECT id, object_id FROM object_nb_info WHERE zipal_new_flat_decoration_type_id in (" . implode(',', $this->filter->decaration_types) . ")";
$rez_d = $this->db->query($sql_d);
while ($r_d = $this->db->fetch_assoc($rez_d)) {
$objDIds[] = (int)$r_d['object_id'];
}
if (!empty($objDIds)) {
$whereObjects .= " AND id in (" . implode(',', $objDIds) . ")";
} else {
$whereObjects .= " AND id in (0)";
}
}
}
$this->set_users_ids();
/* if(!empty($whereObjects)){
$complexObjIds = array();
$this->set_sphinx2();
//$sql_obj = "SELECT id FROM objects WHERE archive=0 and complex_id = {$complex_id} and id_add_user in (".implode(',', $this->userIds).") {$whereObjects} LIMIT 1000000 OPTION max_matches=1000000";
echo $sql_obj;
$q_obj = $this->sphinx2->query($sql_obj, true);
while($r_obj = $this->sphinx2->fetch_assoc($q_obj)){
$complexObjIds[] = (int)$r_obj['id'];
}
}*/
$obj_ids = array();
$objects = array();
$limitSqlObj = " limit 10";
if ($_SESSION['id'] == 5238) {
$this->limit = 2;
}
if ($this->page_obj > 0) {
$limitSqlObj = ' limit ' . ($this->page_obj - 1) * $this->limit . ', ' . $this->limit;
}
$sql_obj_total = "SELECT id FROM objects WHERE archive=0 and complex_id = {$complex_id} and id_add_user in (" . implode(',', $this->userIds) . ") {$whereObjects} LIMIT 1000000 OPTION max_matches=1000000";
$q_obj_total = $this->sphinx2->query($sql_obj_total);
$result['objects_total'] = $this->sphinx2->num_rows($q_obj_total);
$sql_obj = "SELECT * FROM objects WHERE archive=0 and complex_id = {$complex_id} and id_add_user in (" . implode(',', $this->userIds) . ") {$whereObjects} order by date_add desc {$limitSqlObj} OPTION max_matches=1000000";
// echo $sql_obj;
$q_obj = $this->sphinx2->query($sql_obj, true);
while ($r_obj = $this->sphinx2->fetch_assoc($q_obj)) {
$objects[] = $r_obj;
$obj_ids[] = (int)$r_obj['id'];
}
if (!empty($obj_ids)) {
$sql_complex_object = "SELECT * FROM complex_objects WHERE complex_id = {$complex_id} and object_id in (" . implode(", ", $obj_ids) . ")";
//echo $sql_complex_object;
$q_complex_object = $this->db->query($sql_complex_object);
while ($complex_obj = $this->db->fetch_assoc($q_complex_object)) {
//$obj_ids[] = $complex_obj['object_id'];
$objLines[$complex_obj['object_id']] = array();
$objCorpuses[$complex_obj['object_id']] = array();
if ($complex_obj['corpus_id'] > 0) {
$sql_line = "SELECT * FROM complex_corpuses WHERE id = {$complex_obj['corpus_id']}";
$q_line = $this->db->query($sql_line);
$r_line = $this->db->fetch_assoc($q_line);
$objLines[$complex_obj['object_id']] = $r_line;
} else {
$objLines[$complex_obj['object_id']] = array('line' => 1, 'corpus' => 1);
}
}
}
//var_dump($objLines);
$objAddInfoList = array();
$objSaleInfoList = array();
if (!empty($obj_ids)) {
//Доп инфа
$sqlAddInfo = "SELECT * FROM objects_additional_information WHERE object_id in (" . implode(", ", $obj_ids) . ")";
$rezAddInfo = $this->db->query($sqlAddInfo);
while ($objAddInfo = $this->db->fetch_assoc($rezAddInfo)) {
$objAddInfoList[$objAddInfo['object_id']] = $objAddInfo;
}
//sale инфа
$sqlSaleInfo = "SELECT * FROM sale_objects WHERE object_id in (" . implode(", ", $obj_ids) . ")";
$rezSaleInfo = $this->db->query($sqlSaleInfo);
while ($objSaleInfo = $this->db->fetch_assoc($rezSaleInfo)) {
$objSaleInfoList[$objSaleInfo['object_id']] = $objSaleInfo;
}
//начитываем кол-во заявок для объектов
$objRequisitionsArray = [];
$sqlRequisitions = "SELECT count(id) as cnt, object_id FROM requisitions WHERE (type_id = 4 or type_id in (SELECT id FROM requisitions_type WHERE heir = 4 AND agency_id = {$this->user->agencyId})) AND cancel = 0 AND object_id in (" . implode(", ", $obj_ids) . ") GROUP BY object_id";
$qRequisitions = $this->db->query($sqlRequisitions);
if ($this->db->num_rows($qRequisitions) > 0) {
while ($objRequisitions = $this->db->fetch_assoc($qRequisitions)) {
$objRequisitionsArray[] = $objRequisitions;
}
}
$this->objRequisitionsArray = $objRequisitionsArray;
$objPricesArray = [];
$sqlPrices = "SELECT * FROM `object_prices`
WHERE `object_id` in (" . implode(", ", $obj_ids) . ") AND `agency_id`='{$this->user->agencyId}'";
if ($queryPrices = $this->db->query($sqlPrices)) {
if ($this->db->num_rows($queryPrices) > 0) {
while ($objPrice = $this->db->fetch_assoc($queryPrices)) {
$objPricesArray[] = $objPrice;
}
}
}
$this->objPricesArray = $objPricesArray;
$objects1 = array();
$sql_obj1 = "SELECT *, DATE_FORMAT(date_add,'%d.%m.%Y %H:%i') as date_add
FROM objects
WHERE id in (" . implode(", ", $obj_ids) . ") ";
// echo $sql_obj;
$q_obj1 = $this->db->query($sql_obj1);
while ($r_obj1 = $this->db->fetch_assoc($q_obj1)) {
$objects1[$r_obj1['id']] = $r_obj1;
}
//var_dump($objects1);
$result['allPages'] = ceil($result['objects_total'] / $this->limit);
foreach ($objects as $obj) {
// var_dump($obj);
$obj['line'] = $objLines[$obj['id']]['line'];
if (isset($objAddInfoList[$obj['id']])) {
$obj['flat_number'] = $objAddInfoList[$obj['id']]['flat_number'];
} else {
$obj['flat_number'] = "-";
}
$obj['nazv'] = $objects1[$obj['id']]['nazv'];
$obj['opis'] = $objects1[$obj['id']]['opis'];
$obj['etazh'] = $objects1[$obj['id']]['etazh'];
$obj['ploshad'] = $objects1[$obj['id']]['ploshad'];
$obj['ploshad_komn'] = $objects1[$obj['id']]['ploshad_komn'];
$obj['ploshad_k'] = $objects1[$obj['id']]['ploshad_k'];
$obj['etazh_iz'] = $objects1[$obj['id']]['etazh_iz'];
$obj['sobstv'] = $objects1[$obj['id']]['sobstv'];
$obj['date_add'] = $objects1[$obj['id']]['date_add'];
$obj['korpus'] = $objLines[$obj['id']]['corpus'];
$obj['stoim'] = $objects1[$obj['id']]['stoim'];
// $obj['zipal_new_flat_decoration_type_id']
if (isset($objSaleInfoList[$obj['id']])) {
$obj['entrance_number'] = $objSaleInfoList[$obj['id']]['entrance_number'];
} else {
$obj['entrance_number'] = "-";
}
$result['objects']['object_' . $obj['id']] = $this->object_details($obj);
}
}
}
return $result;
}
public function getComplexNames($use_empty_rooms = false)
{
$result = array();
$this->set_user();
$this->set_users_ids();
// $use_empty_rooms = true;
if ($use_empty_rooms) {
$query = $this->db->query("SELECT id, `name`
FROM complex_list
WHERE agency_id={$this->user->agencyId}
AND complex_list.arhive = 0
AND complex_list.deleted = 0
");
} else {
$query = $this->db->query("SELECT complex_list.id, complex_list.name FROM complex_list
LEFT JOIN complex_houses ON complex_houses.complex_id = complex_list.id
LEFT JOIN complex_metro ON complex_metro.complex_id = complex_list.id
LEFT JOIN complex_address ON complex_address.complex_id = complex_list.id
LEFT JOIN complex_entrances complex_entrances ON complex_entrances.complex_house_id = complex_houses.id
LEFT JOIN complex_floors complex_floors ON complex_floors.complex_entrance_id = complex_entrances.id
LEFT JOIN complex_rooms complex_rooms ON complex_rooms.floor_id = complex_floors.id
WHERE complex_list.agency_id={$this->user->agencyId}
AND complex_list.arhive = 0
AND complex_list.deleted = 0
AND complex_houses.id IS NOT NULL AND complex_rooms.id IS NOT NULL
GROUP BY complex_list.id
HAVING COUNT(complex_houses.id) > 0 AND COUNT(complex_rooms.id) > 0
ORDER BY complex_list.id DESC
");
}
// print_r($query);die;
while ($row = $this->db->fetch_assoc($query)) {
$result[] = $row;
}
// var_dump($result);die;
return $result;
}
/**
* Поиск
*/
public function search($filter, $use_empty_rooms = false)
{
$whereComplex = '';
$whereRoom = '';
$whereAddress = '';
$whereHouse = '';
$whereFloor = '';
$priceFilterKey = ' complex_rooms.total_amount ';
$havingComplex = "";
if (!$use_empty_rooms) {
$havingComplex .= " HAVING COUNT(complex_houses.id) > 0 AND COUNT(complex_rooms.id) > 0";
$whereComplex .= " AND complex_houses.id IS NOT NULL AND complex_rooms.id IS NOT NULL ";
// $whereHouse .= " AND COUNT(complex_rooms.id) > 0 ";
}
if ($filter) {
if (!empty($filter->selectedDecorations)) {
$whereRoom .= " AND complex_rooms.decoration_id in (" . implode(',', $filter->selectedDecorations) . ") ";
}
if (!empty($filter->selectedTypes)) {
$whereRoom .= " AND complex_rooms.type in ('" . implode('\',\'', $filter->selectedTypes) . "') ";
}
if (!empty($filter->rooms)) {
$isMoreThenFive = in_array('5-more', $filter->rooms);
$isSelectedStudio = in_array('studio', $filter->rooms);
$filteredArray = array_filter($filter->rooms, function ($element) {
return !in_array($element, ["5-more", "studio"]);
});
if ($isSelectedStudio) {
$whereRoom .= " AND complex_rooms.layout_feature = 'studio' ";
}
if (count($filteredArray)) {
if ($isMoreThenFive) {
$whereRoom .= " AND (complex_rooms.rooms_count >= 5 OR complex_rooms.rooms_count IN (" . implode(',', $filteredArray) . "))";
} else {
$whereRoom .= " AND complex_rooms.rooms_count IN (" . implode(',', $filteredArray) . ")";
}
} else if ($isMoreThenFive) {
$whereRoom .= " AND complex_rooms.rooms_count >= 5 ";
}
}
if (!empty($filter->rayons)) {
$whereComplex .= " AND (";
foreach ($filter->rayons as $index => $rayon) {
$whereComplex .= " complex_address.rayon LIKE '%{$rayon}%'";
if (isset($filter->rayons[$index + 1])) {
$whereComplex .= " OR ";
}
}
$whereComplex .= " ) ";
// var_dump($whereAddress);die;
}
if (!empty($filter->selectedMetros)) {
$whereComplex .= " AND complex_metro.metro_id in (" . implode(',', $filter->selectedMetros) . ")";
}
if (!empty($filter->complexes)) {
$whereComplex .= " AND complex_list.id in (" . implode(',', $filter->complexes) . ")";
}
if (!empty($filter->address)) {
$whereComplex .= " AND complex_address.address like '%{$filter->address}%'";
}
if (!empty($filter->squareKitchen_min)) {
$whereRoom .= " AND complex_rooms.kitchen_area >= {$filter->squareKitchen_min}";
}
if (!empty($filter->squareKitchen_max)) {
$whereRoom .= " AND complex_rooms.kitchen_area <= {$filter->squareKitchen_max}";
}
if (!empty($filter->area_from)) {
$whereRoom .= " AND complex_rooms.area >= {$filter->area_from}";
}
if (!empty($filter->area_to)) {
$whereRoom .= " AND complex_rooms.area <= {$filter->area_to}";
}
if (filter_var($filter->useSquarePrice, FILTER_VALIDATE_BOOLEAN)) {
$priceFilterKey = " complex_rooms.total_amount / complex_rooms.area ";
}
if (!empty($filter->price_from)) {
$whereRoom .= " AND {$priceFilterKey} >= {$filter->price_from}";
}
if (!empty($filter->price_to)) {
$whereRoom .= " AND {$priceFilterKey} <= {$filter->price_to}";
}
if (!empty($filter->floor_from)) {
$whereFloor .= " AND complex_floors.position >= {$filter->floor_from}";
}
if (!empty($filter->floor_to)) {
$whereFloor .= " AND complex_floors.position <= {$filter->floor_to}";
}
if (!empty($filter->selectedComplexTypes)) {
$whereComplex .= " AND complex_list.type in ('" . implode('\',\'', $filter->selectedComplexTypes) . "')";
}
if (!empty($filter->period)) {
if ($filter->period == 'completed') {
$currentMonth = date('n');
$currentYear = date('Y');
$currentQuarter = ceil($currentMonth / 3);
$whereHouse .= " AND complex_houses.deadline_quarter <= $currentQuarter AND complex_houses.deadline_year <= $currentYear ";
} else {
list($year, $quarter) = explode('Q', $filter->period);
$whereHouse .= " AND complex_houses.deadline_quarter = $quarter AND complex_houses.deadline_year = $year ";
}
}
if(!empty($filter->is_partner_show)){
$whereHouse .= " AND complex_houses.is_partner_show = 1 ";
}
if (!empty($filter->is_archive)) {
$whereComplex .= " AND complex_list.arhive = 1 ";
} else {
$whereComplex .= " AND complex_list.arhive = 0 ";
}
// Фильтрация по способам оплаты
if (!empty($filter->selectedPaymentTypes)) {
$conditions = [];
foreach ($filter->selectedPaymentTypes as $pt) {
$conditions[] = "complex_rooms.payment_types LIKE '%\"{$pt}\"%'";
}
if (!empty($conditions)) {
$whereRoom .= " AND (" . implode(' OR ', $conditions) . ")";
}
// Installment-specific filtering
if (in_array('INSTALLMENT', $filter->selectedPaymentTypes)) {
$whereRoom .= " AND EXISTS (
SELECT 1
FROM complex_house_installments chi
JOIN complex_entrances ce ON ce.complex_house_id = chi.house_id
JOIN complex_floors cf ON cf.complex_entrance_id = ce.id
JOIN installments i ON i.id = chi.installment_id
WHERE cf.id = complex_rooms.floor_id
AND i.is_archive = 0"
. (!empty($filter->selectedInstallments)
? " AND chi.installment_id IN (" . implode(',', $filter->selectedInstallments) . ")"
: "")
. ((isset($filter->initialPayment) && is_numeric($filter->initialPayment))
? " AND complex_rooms.installment_price IS NOT NULL AND complex_rooms.installment_price > 0 AND ((i.initial_payment / 100.0) * complex_rooms.installment_price) <= " . (float)$filter->initialPayment
: "")
. ((isset($filter->paymentTerm) && is_numeric($filter->paymentTerm))
? " AND (DATEDIFF(chi.end_date, CURDATE()) / 30.44) >= " . (float)$filter->paymentTerm
: "")
. ((isset($filter->installmentPrice->min) && is_numeric($filter->installmentPrice->min))
? " AND complex_rooms.installment_price >= " . (float)$filter->installmentPrice->min
: "")
. ((isset($filter->installmentPrice->max) && is_numeric($filter->installmentPrice->max))
? " AND complex_rooms.installment_price <= " . (float)$filter->installmentPrice->max
: "")
. ")";
}
}
}
$this->limit = 12;
$limitSqlComolex = " limit {$this->limit}";
$this->set_user();
$this->set_users_ids();
if ($this->page > 0) {
$limitSqlComolex = ' limit ' . ($this->page - 1) * $this->limit . ', ' . $this->limit;
}
// var_dump($limitSqlComolex);die;
$result = array();
$sql_total = "SELECT count(DISTINCT complex_list.id) as total, count( DISTINCT complex_houses.id) as houses_total, COUNT(DISTINCT complex_rooms.id) as total_rooms FROM complex_list
LEFT JOIN complex_houses ON complex_houses.complex_id = complex_list.id AND (complex_houses.deleted_at IS NULL OR complex_houses.deleted_at = '0000-00-00 00:00:00') {$whereHouse}
LEFT JOIN complex_metro ON complex_metro.complex_id = complex_list.id
LEFT JOIN complex_address ON complex_address.complex_id = complex_list.id
LEFT JOIN complex_entrances complex_entrances ON complex_entrances.complex_house_id = complex_houses.id
LEFT JOIN complex_floors complex_floors ON complex_floors.complex_entrance_id = complex_entrances.id {$whereFloor}
LEFT JOIN complex_rooms complex_rooms ON complex_rooms.floor_id = complex_floors.id {$whereRoom}
WHERE complex_list.agency_id={$this->user->agencyId}
AND complex_list.deleted = 0
{$whereComplex}
{$havingComplex}
ORDER BY complex_list.id DESC
";
$q_total = $this->db->query($sql_total);
$result['total'] = (int)$this->db->fetch_assoc($q_total)['total'];
$sql = "SELECT complex_list.*, count( DISTINCT CASE
WHEN (complex_houses.deleted_at IS NULL OR complex_houses.deleted_at = '0000-00-00 00:00:00')
THEN complex_houses.id
ELSE NULL
END) as houses_total, COUNT(DISTINCT CASE
WHEN (complex_houses.deleted_at IS NULL OR complex_houses.deleted_at = '0000-00-00 00:00:00')
THEN complex_rooms.id
ELSE NULL
END) as total_rooms, MIN(CASE
WHEN (complex_houses.deleted_at IS NULL OR complex_houses.deleted_at = '0000-00-00 00:00:00')
THEN complex_rooms.total_amount
ELSE NULL
END) AS min_total_amount FROM complex_list
LEFT JOIN complex_houses ON complex_houses.complex_id = complex_list.id AND (complex_houses.deleted_at IS NULL OR complex_houses.deleted_at = '0000-00-00 00:00:00') {$whereHouse}
LEFT JOIN complex_metro ON complex_metro.complex_id = complex_list.id
LEFT JOIN complex_address ON complex_address.complex_id = complex_list.id
LEFT JOIN complex_entrances complex_entrances ON complex_entrances.complex_house_id = complex_houses.id
LEFT JOIN complex_floors complex_floors ON complex_floors.complex_entrance_id = complex_entrances.id {$whereFloor}
LEFT JOIN complex_rooms complex_rooms ON complex_rooms.floor_id = complex_floors.id {$whereRoom}
WHERE complex_list.agency_id={$this->user->agencyId}
AND complex_list.deleted = 0
{$whereComplex}
GROUP BY complex_list.id
{$havingComplex}
ORDER BY complex_list.id DESC {$limitSqlComolex}
";
$q = $this->db->query($sql);
// , MIN(complex_rooms.total_amount) AS min_total_amount
// echo '<pre>';
// print_r($q->queryString);
// echo '</pre>';
// die();
// var_dump($q);die;
// $result['total'] = $this->db->num_rows($q);
// var_dump('test');die;
$result['allPages'] = ceil($result['total'] / $this->limit);
$result['agency_name'] = $this->user->agencyName;
$result['agency_logo'] = $this->user->photo;
$result['agency_phone'] = $this->user->agencyPhone;
// var_dump($result['agency_phone']);die;
// var_dump($this->user);die;
// var_dump($result);die;
$complexIds = [];
while ($r = $this->db->fetch_assoc($q)) {
$cid = (int)$r['id'];
$complexIds[] = $cid;
$result['list']['complex_' . $r['id']] = $this->get_complex_one($r['id'], true, false);
$result['list']['complex_' . $r['id']]['houses_total'] = $r['houses_total'];
$result['list']['complex_' . $r['id']]['houses_total_unarchived'] = 0;
$result['list']['complex_' . $r['id']]['total_rooms'] = $r['total_rooms'];
$result['list']['complex_' . $r['id']]['total_rooms_unarchived'] = 0;
$result['list']['complex_' . $r['id']]['min_total_amount'] = $r['min_total_amount'];
// var_dump($r);die;
}
// var_dump($result);die;
//Подсчет кол-ва домов и комнат не в архиве
if (!empty($complexIds)) {
$idsString = implode(',', $complexIds);
$sql_unarchived_counts = "
SELECT
cl.id as complex_id,
COUNT(DISTINCT ch.id) as houses_total_unarchived,
COUNT(DISTINCT cr.id) as total_rooms_unarchived
FROM complex_list cl
LEFT JOIN complex_houses ch
ON ch.complex_id = cl.id
AND ch.is_archive = 0
AND (ch.deleted_at IS NULL OR ch.deleted_at = '0000-00-00 00:00:00')
LEFT JOIN complex_metro cm ON cm.complex_id = cl.id
LEFT JOIN complex_address ca ON ca.complex_id = cl.id
LEFT JOIN complex_entrances ce ON ce.complex_house_id = ch.id
LEFT JOIN complex_floors cf ON cf.complex_entrance_id = ce.id
LEFT JOIN complex_rooms cr
ON cr.floor_id = cf.id
LEFT JOIN complex_status cs ON cs.id = cr.complex_status_id
WHERE
cl.id IN ({$idsString})
AND cl.agency_id={$this->user->agencyId}
AND cl.deleted = 0
AND cs.status = 'available'
GROUP BY cl.id
";
$q_unarchived = $this->db->query($sql_unarchived_counts);
if ($q_unarchived) {
while ($u_r = $this->db->fetch_assoc($q_unarchived)) {
$cid = (int)$u_r['complex_id'];
if (isset($result['list']['complex_' . $cid])) {
$result['list']['complex_' . $cid]['houses_total_unarchived'] = (int)$u_r['houses_total_unarchived'];
$result['list']['complex_' . $cid]['total_rooms_unarchived'] = (int)$u_r['total_rooms_unarchived'];
}
}
} else {
error_log("Ошибка выполнения запроса подсчета не архивных домов и доступных помещений: " . $this->db->error . "\nЗапрос: " . $sql_unarchived_counts);
}
}
return $result;
}
public function searchOLD($filter = array())
{
$whereComplex = '';
$whereObjects = '';
$whereDecoration = '';
$complexIds = array();
//Фильтр
if (!empty($filter)) {
//var_dump($filter);
// if (!empty($filter->country_id)) {
// $whereComplex .= " AND country_id = {$filter->country_id}";
// }
// if (!empty($filter->region_id)) {
// $whereComplex .= " AND rf_region_id = {$filter->region_id}";
// }
// if (!empty($filter->complexes)) {
// $complexIds = $filter->complexes;
// //$whereComplex .= " AND id in (".implode(',',$filter->complexes).")";
// }
if (!empty($filter->selectedDecorations)) {
$whereComplex .= " AND type in ('" . implode('\',\'', $filter->selectedDecorations) . "')";
}
// if (!empty($filter->builders)) {
// $whereComplex .= " AND builder_id in (" . implode(',', $filter->builders) . ")";
// }
// if (!empty($filter->payment_types)) {
// $whereComplex .= " AND (JSON_EXTRACT(`payment_types`, '$[0]') in (" . implode(',', $filter->payment_types) . ")
// or JSON_EXTRACT(`payment_types`, '$[1]') in (" . implode(',', $filter->payment_types) . ")
// or JSON_EXTRACT(`payment_types`, '$[2]') in (" . implode(',', $filter->payment_types) . ")
// )";
// }
// if (!empty($filter->selectedMetros)) {
// $whereObjects .= " AND id_metro in (" . implode(',', $filter->selectedMetros) . ")";
// }
// if (!empty($filter->period)) {
// $whereObjects .= " AND nb_end_date <= {$filter->period}";
// }
// if (!empty($filter->area_from)) {
// $whereObjects .= " AND ploshad >= {$filter->area_from}";
// }
// if (!empty($filter->area_to)) {
// $whereObjects .= " AND ploshad <= {$filter->area_to}";
// }
// if (!empty($filter->floor_from)) {
// $whereObjects .= " AND etazh >= {$filter->floor_from}";
// }
// if (!empty($filter->floor_to)) {
// $whereObjects .= " AND etazh <= {$filter->floor_to}";
// }
// if (!empty($filter->price_from)) {
// $whereObjects .= " AND stoim >= {$filter->price_from}";
// }
// if (!empty($filter->price_to)) {
// $whereObjects .= " AND stoim <= {$filter->price_to}";
// }
if (!empty($filter->types_room)) {
$types_room = array();
$sql = "SELECT * FROM room_types WHERE id in (" . implode(',', $filter->types_room) . ")";
$rez = $this->db->query($sql);
while ($type_room = $this->db->fetch_assoc($rez)) {
$types_room[] = (int)$type_room['name'];
}
$whereObjects .= " AND komnat in (" . implode(',', $types_room) . ")";
}
if (!empty($filter->decaration_types)) {
$whereDecoration = "AND decoration_id IN (" . implode(',', $filter->decaration_types) . ")";
// $objDIds = array();
// $sql_d = "SELECT id, object_id FROM object_nb_info WHERE zipal_new_flat_decoration_type_id in (" . implode(',', $filter->decaration_types) . ")";
// $rez_d = $this->db->query($sql_d);
// while ($r_d = $this->db->fetch_assoc($rez_d)) {
// $objDIds[] = (int)$r_d['object_id'];
// }
// if (!empty($objDIds)) {
// $whereObjects .= " AND id in (" . implode(',', $objDIds) . ")";
// } else {
// $whereObjects .= " AND id in (0)";
// }
}
}
$this->set_user();
$this->set_users_ids();
// if (!empty($whereObjects)) {
// $complexIds = array();
// $complexTotalObject = array();
// $this->set_sphinx2();
// $sql_obj = "SELECT * FROM objects WHERE archive=0 and complex_id > 0 and id_add_user in (" . implode(',', $this->userIds) . ") {$whereObjects} LIMIT 1000000 OPTION max_matches=1000000";
// //echo $sql_obj;
// $q_obj = $this->sphinx2->query($sql_obj, true);
// while ($r_obj = $this->sphinx2->fetch_assoc($q_obj)) {
// $complexIds[] = (int)$r_obj['complex_id'];
// if (!isset($complexTotalObject[(int)$r_obj['complex_id']])) $complexTotalObject[(int)$r_obj['complex_id']] = 0;
// $complexTotalObject[(int)$r_obj['complex_id']]++;
// }
// }
if (!empty($complexIds)) {
$complexIds = array_unique($complexIds);
$whereComplex .= " AND id in (" . implode(',', $complexIds) . ")";
} else {
if (!empty($whereObjects) || !empty($filter->complexes))
$whereComplex .= " AND id in (-1)";
}
$limitSqlComolex = " limit 20";
if ($this->page > 0) {
$limitSqlComolex = ' limit ' . ($this->page - 1) * $this->limit . ', ' . $this->limit;
}
$result = array();
$sql_total = "SELECT count(*) as total FROM complex_list
WHERE agency_id={$this->user->agencyId}
AND arhive = 0
AND deleted = 0 {$whereComplex}
";
//echo $sql;
$q_total = $this->db->query($sql_total);
$result['total'] = (int)$this->db->fetch_assoc($q_total)['total'];
$sql = "SELECT * FROM complex_list WHERE agency_id={$this->user->agencyId} AND arhive = 0 AND deleted = 0 {$whereComplex} ORDER BY id DESC {$limitSqlComolex}";
//echo $sql;
$q = $this->db->query($sql);
//$result['total'] = $this->db->num_rows($q);
$result['allPages'] = ceil($result['total'] / $this->limit);
$complex_ids = array();
while ($r = $this->db->fetch_assoc($q)) {
$objects_list = true;
$complex_ids[] = $r['id'];
if (isset($complexTotalObject[$r['id']])) $objects_list = false;
$result['list']['complex_' . $r['id']] = $this->get_complex_one($r['id'], true, false);
if (!$objects_list) $result['list']['complex_' . $r['id']]['objects_total'] = $complexTotalObject[$r['id']];
}
$totalsHouse = array();
if (!empty($complex_ids)) {
$sql_houses = "SELECT count(*) as total, complex_id FROM complex_houses WHERE complex_id in (" . implode(',', $complex_ids) . ") AND deleted_at IS NULL group by complex_id";
//echo $sql_houses;
$q_houses = $this->db->query($sql_houses);
while ($r_houses = $this->db->fetch_assoc($q_houses)) {
$totalsHouse[$r_houses['complex_id']] = $r_houses['total'];
}
}
foreach ($complex_ids as $id_c) {
if (isset($totalsHouse[$id_c])) {
$result['list']['complex_' . $id_c]['houses_total'] = $totalsHouse[$id_c];
} else {
$result['list']['complex_' . $id_c]['houses_total'] = 0;
}
$queryCountRooms = $this->db->query("SELECT SUM(cr.total_rooms) as total_rooms
FROM (
SELECT COUNT(cr.id) as total_rooms
FROM complex_houses as ch
LEFT JOIN complex_entrances ce ON ce.complex_house_id = ch.id
LEFT JOIN complex_floors cf ON cf.complex_entrance_id = ce.id
LEFT OUTER JOIN complex_rooms cr ON cr.floor_id = cf.id {$whereDecoration}
WHERE ch.complex_id = {$id_c}
GROUP BY ch.id
) as cr");
$rowCount = $this->db->fetch_assoc($queryCountRooms);
$result['list']['complex_' . $id_c]['total_rooms'] = (int)$rowCount['total_rooms'];
}
return $result;
}
/**
*
*/
public function complex_add_object($complex_id, $object_id)
{
if ($complex_id > 0 && $object_id > 0) {
$sql_complex = "SELECT id FROM complex_objects WHERE complex_id={$complex_id} AND object_id={$object_id}";
$q_complex = $this->db->query($sql_complex);
if ($this->db->num_rows($q_complex) == 0) {
$this->db->query("INSERT INTO complex_objects SET complex_id={$complex_id}, object_id={$object_id}");
$this->set_sphinx2();
$sql = "UPDATE objects SET complex_id = $complex_id
WHERE id = {$object_id}";
$this->sphinx2->query($sql, true);
}
}
return 'done';
}
/**
*
*/
public function complex_archive($complex_id, $archive)
{
if ($archive) {
$this->db->query("UPDATE complex_list SET arhive=1 WHERE id = {$complex_id}");
} else {
$this->db->query("UPDATE complex_list SET arhive=0 WHERE id = {$complex_id}");
}
return array('result' => 'done', 'complex_id' => $complex_id);;
}
private function update_complex($complex_id, $fields, $table)
{
if ($table == 'complex_advert') {
$sql = "SELECT id FROM {$table} WHERE complex_id = {$complex_id}";
$q = $this->db->query($sql);
if ($this->db->num_rows($q) == 0) {
$sql_in = "INSERT INTO {$table} SET " . implode(',', $fields) . ", complex_id = {$complex_id}";
} else {
$sql_in = "UPDATE {$table} SET " . implode(',', $fields) . " WHERE complex_id = {$complex_id}";
}
// echo $sql_in;
$this->db->query($sql_in);
}
}
/**
*
*/
public function complex_advert($complex_id, $yes_no = 1)
{
$this->set_sphinx2();
$obj_ids = array();
$sql_complex_object = "SELECT * FROM complex_objects WHERE complex_id = {$complex_id}";
$q_complex_object = $this->db->query($sql_complex_object);
while ($complex_obj = $this->db->fetch_assoc($q_complex_object)) {
$obj_ids[] = $complex_obj['object_id'];
}
$fields[] = "use_in_advert={$yes_no}";
$this->update_complex($complex_id, $fields, 'complex_advert');
if (!empty($obj_ids) && $yes_no > 0) {
$sql = "UPDATE objects SET archive = 0, use_in_advert=1, is_main = 0
WHERE id in (" . implode(',', $obj_ids) . ")";
$this->db->query($sql);
//Запрос к сфинкс
$sql = "UPDATE objects SET archive = 0, use_in_advert=1
WHERE id in (" . implode(',', $obj_ids) . ")";
$this->sphinx2->query($sql, true);
}
if (!empty($obj_ids) && $yes_no == 0) {
$sql = "UPDATE objects
SET use_in_advert = 0,
add_to_bn_feed = 0,
add_to_yandex_feed = 0,
add_to_domclick_feed = 0,
add_to_avito_feed = 0,
add_to_emls_feed = 0,
add_to_cian_feed = 0,
add_to_zipal = 0
WHERE id in (" . implode(',', $obj_ids) . ")";
$this->db->query($sql);
$sql_sph = "UPDATE objects
SET use_in_advert = 0,
add_to_bn_feed = 0,
add_to_yandex_feed = 0,
add_to_domclick_feed = 0,
add_to_avito_feed = 0,
add_to_emls_feed = 0,
add_to_cian_feed = 0,
add_to_zipal = 0
WHERE id in (" . implode(',', $obj_ids) . ")";
$this->sphinx2->query($sql_sph, true);
}
}
/**
* Отправка объектов в рекламу на площадки
* @param int $complex_id id комплекса
* @param int $yes_no вкл/выкл
* @param string $type
*/
public function complex_advert_plases($complex_id, $yes_no, $type, $days)
{
if ($complex_id > 0) {
$this->set_sphinx2();
$feed = '';
$stat_feed = '';
$user_id = (int)$_SESSION['id'];
switch ($type) {
case 'COMPLEX_YANDEX_JW_FEED': {
$feed = 'add_to_bn_feed';
$stat_feed = 'YANDEX_JW_FEED';
$del_query = 'use_in_advert = IF(
add_to_yandex_feed = 0 AND
add_to_domclick_feed = 0 AND
add_to_avito_feed = 0 AND
add_to_emls_feed = 0 AND
add_to_cian_feed = 0 AND
add_to_zipal = 0, 0, 1)';
$del_query_sph = 'if(
add_to_yandex_feed = 0 AND
add_to_domclick_feed = 0 AND
add_to_avito_feed = 0 AND
add_to_emls_feed = 0 AND
add_to_cian_feed = 0 AND
add_to_zipal = 0, 0, 1)';
$advert_stat = 'yandex';
break;
}
case 'COMPLEX_EMLS_JW_FEED': {
$feed = 'add_to_emls_feed';
$stat_feed = 'EMLS_JW_FEED';
$del_query = 'use_in_advert = IF(
add_to_bn_feed = 0 AND
add_to_yandex_feed = 0 AND
add_to_domclick_feed = 0 AND
add_to_avito_feed = 0 AND
add_to_cian_feed = 0 AND
add_to_zipal = 0, 0, 1)';
$del_query_sph = 'if(
add_to_bn_feed = 0 AND
add_to_yandex_feed = 0 AND
add_to_domclick_feed = 0 AND
add_to_avito_feed = 0 AND
add_to_cian_feed = 0 AND
add_to_zipal = 0, 0, 1)';
$advert_stat = '';
break;
}
case 'COMPLEX_DOMCLICK_JW_FEED': {
$feed = 'add_to_domclick_feed';
$stat_feed = 'DOMCLICK_JW_FEED';
$del_query = 'use_in_advert = IF(
add_to_bn_feed = 0 AND
add_to_yandex_feed = 0 AND
add_to_cian_feed = 0 AND
add_to_avito_feed = 0 AND
add_to_emls_feed = 0 AND
add_to_zipal = 0, 0, 1)';
$del_query_sph = 'if(
add_to_bn_feed = 0 AND
add_to_yandex_feed = 0 AND
add_to_cian_feed = 0 AND
add_to_avito_feed = 0 AND
add_to_emls_feed = 0 AND
add_to_zipal = 0, 0, 1)';
$advert_stat = 'domclick';
break;
}
case 'COMPLEX_CIAN_JW_FEED': {
$feed = 'add_to_cian_feed';
$stat_feed = 'CIAN_JW_FEED';
$del_query = 'use_in_advert = IF(
add_to_bn_feed = 0 AND
add_to_yandex_feed = 0 AND
add_to_domclick_feed = 0 AND
add_to_avito_feed = 0 AND
add_to_emls_feed = 0 AND
add_to_zipal = 0, 0, 1)';
$del_query_sph = 'if(
add_to_bn_feed = 0 AND
add_to_yandex_feed = 0 AND
add_to_domclick_feed = 0 AND
add_to_avito_feed = 0 AND
add_to_emls_feed = 0 AND
add_to_zipal = 0, 0, 1)';
$advert_stat = 'cian';
break;
}
case 'COMPLEX_AVITO_JW_FEED': {
$feed = 'add_to_avito_feed';
$stat_feed = 'AVITO_JW_FEED';
$del_query = 'use_in_advert = IF(
add_to_bn_feed = 0 AND
add_to_yandex_feed = 0 AND
add_to_domclick_feed = 0 AND
add_to_emls_feed = 0 AND
add_to_cian_feed = 0 AND
add_to_zipal = 0, 0, 1)';
$del_query_sph = 'if(
add_to_bn_feed = 0 AND
add_to_yandex_feed = 0 AND
add_to_domclick_feed = 0 AND
add_to_emls_feed = 0 AND
add_to_cian_feed = 0 AND
add_to_zipal = 0, 0, 1)';
$advert_stat = 'avito';
break;
}
case 'COMPLEX_FREE_JW_FEED': {
$feed = 'add_to_yandex_feed';
$stat_feed = 'FREE_JW_FEED';
$del_query = 'use_in_advert = IF(
add_to_bn_feed = 0 AND
add_to_domclick_feed = 0 AND
add_to_avito_feed = 0 AND
add_to_emls_feed = 0 AND
add_to_cian_feed = 0 AND
add_to_zipal = 0, 0, 1)';
$del_query_sph = 'if(
add_to_bn_feed = 0 AND
add_to_domclick_feed = 0 AND
add_to_avito_feed = 0 AND
add_to_emls_feed = 0 AND
add_to_cian_feed = 0 AND
add_to_zipal = 0, 0, 1)';
$advert_stat = 'yandex';
break;
}
}
$obj_ids = array();
$sql_complex_object = "SELECT * FROM complex_objects WHERE complex_id = {$complex_id}";
$q_complex_object = $this->db->query($sql_complex_object);
while ($complex_obj = $this->db->fetch_assoc($q_complex_object)) {
$obj_ids[] = $complex_obj['object_id'];
}
$fields[] = "{$feed}={$yes_no}";
$this->update_complex($complex_id, $fields, 'complex_advert');
$objData = array();
//Начитываем объекты
$sqlObjData = "SELECT id, nazv, id_add_user from objects WHERE id in (" . implode(',', $obj_ids) . ")";
$qObjData = $this->db->query($sqlObjData);
while ($rObjData = $this->db->fetch_assoc($qObjData)) {
$objData[$rObjData['id']] = $rObjData;
}
if ($yes_no > 0) {
$sql = "UPDATE objects SET use_in_advert = 1, {$feed} = {$yes_no}, is_main = 0 WHERE id in (" . implode(',', $obj_ids) . ")";
$this->db->query($sql);
$sql_sph = "UPDATE objects SET use_in_advert = 1, {$feed}={$yes_no} WHERE id in (" . implode(',', $obj_ids) . ")";
$this->sphinx2->query($sql_sph, true);
foreach ($obj_ids as $objId) {
$sqlBaseStat = "INSERT INTO object_publish_statistic(object_id, user_owner_id, publish_user_id, created_at, publish_start_date, publish_end_date, days_count, destination, price)
VALUES ({$objId}, '{$objData[$objId]['id_add_user']}', '$user_id', NOW(), NOW(), DATE_ADD(NOW(), INTERVAL $days DAY), '$days', '{$stat_feed}', '0')";
//echo $sqlBaseStat;
$this->db->query($sqlBaseStat);
if (!empty($advert_stat)) {
AdvertStats::cleanUpStats($advert_stat, $objId);
}
}
} else {
$sql = "UPDATE objects
SET {$del_query},
{$feed}='{$yes_no}',
is_main = 0
WHERE id in (" . implode(',', $obj_ids) . ")";
$this->db->query($sql);
/*$sql_sph_tmp = "SELECT {$del_query_sph} FROM objects WHERE id in (" . implode(',', $obj_ids) . ")";
$q_sph_tmp = $this->sphinx2->query($sql_sph_tmp);
$use_in_advert = $this->sphinx2->result($q_sph_tmp);*/
$sql_sph = "UPDATE objects
SET
{$feed}=$yes_no
WHERE id in (" . implode(',', $obj_ids) . ")";
$this->sphinx2->query($sql_sph, true);
//проставляем дату отмены в статистике
$sqlUpdateStat = "UPDATE object_publish_statistic SET unpublish_user_id = '$user_id', publish_end_date = NOW(), days_count = DATEDIFF(NOW(), publish_start_date) WHERE object_id in (" . implode(',', $obj_ids) . ") AND destination = '{$stat_feed}' AND (publish_end_date IS NULL OR publish_end_date > NOW())";
$this->db->query($sqlUpdateStat);
if (!empty($advert_stat)) {
foreach ($obj_ids as $objId) {
AdvertStats::cleanUpStats($advert_stat, $objId);
}
}
}
}
}
public function get_all_houses() {
$result = array();
$this->set_user();
$this->set_users_ids();
// $imgR = $this->db->query("SELECT * from complex_house_images WHERE house_id = {$r['id']}");
$sql = "
SELECT
ch.id,
ch.name,
ch.development_end_quarter,
ch.development_end_year,
COUNT(cr.id) as total_rooms,
MIN(cr.total_amount) as min_room_amount,
complex_list.name as complex_name,
complex_list.id as complex_id,
complex_address.address as complex_address,
chi.url as image_url
FROM complex_houses as ch
left JOIN complex_entrances ce ON ce.complex_house_id = ch.id
left JOIN complex_floors cf ON cf.complex_entrance_id = ce.id
LEFT OUTER JOIN complex_rooms cr ON cr.floor_id = cf.id
JOIN complex_list on complex_list.id = ch.complex_id
LEFT JOIN complex_address on complex_address.complex_id = complex_list.id
LEFT JOIN complex_house_images chi ON chi.house_id = ch.id
WHERE complex_list.agency_id={$this->user->agencyId}
AND complex_list.arhive != 1
AND ch.is_archive !=1
AND (ch.deleted_at IS NULL OR ch.deleted_at = '0000-00-00 00:00:00')
GROUP BY ch.id order by ch.id desc";
$q = $this->db->query($sql);
while ($r = $this->db->fetch_assoc($q)) {
$result[] = $r;
}
return $result;
}
/**
*
*/
public function get_houses($complex_id, $has_token = false, $filter = [])
{
$result = array();
if ($complex_id > 0) {
$name_complex = '';
$sql_complex = "SELECT name FROM complex_list WHERE id = {$complex_id}";
$q_complex = $this->db->query($sql_complex);
$r_complex = $this->db->fetch_assoc($q_complex);
if (isset($r_complex['name'])) {
$name_complex = $r_complex['name'];
}
if ($has_token) {
if ($this->user->agencyId == 20382) {
$filter_by_status = "";
} else {
$filter_by_status = "AND cs.status IN ('available', 'reservation')";
}
} else {
$filter_by_status = "";
}
$whereHouse = '';
if(!empty($filter->is_partner_show)){
$whereHouse .= " AND ch.is_partner_show = 1 ";
}
$sql = "SELECT ch.*, COUNT(cr.id) as total_rooms FROM complex_houses as ch
LEFT JOIN complex_entrances ce ON ce.complex_house_id = ch.id
LEFT JOIN complex_floors cf ON cf.complex_entrance_id = ce.id
LEFT JOIN complex_rooms cr ON cr.floor_id = cf.id
LEFT JOIN complex_status cs ON cr.complex_status_id = cs.id AND cs.is_archive = 0
WHERE ch.complex_id = {$complex_id} AND deleted_at IS NULL
{$filter_by_status}
{$whereHouse}
GROUP BY ch.id
ORDER BY ch.id DESC";
$q = $this->db->query($sql);
while ($r = $this->db->fetch_assoc($q)) {
$r['name_complex'] = $name_complex;
$r['images'] = array();
$r['floors'] = array();
$r['rooms'] = array();
$imgR = $this->db->query("SELECT * from complex_house_images WHERE house_id = {$r['id']}");
$floorsQuery = $this->db
->query("SELECT complex_floors.* from complex_floors
LEFT JOIN complex_entrances ce ON complex_floors.complex_entrance_id = ce.id
WHERE ce.complex_house_id = {$r['id']};");
$roomQuery = $this->db->query("
SELECT complex_rooms.*, cs.status
FROM complex_rooms
LEFT JOIN complex_floors AS cf ON cf.id = complex_rooms.floor_id
LEFT JOIN complex_entrances AS ce ON cf.complex_entrance_id = ce.id
LEFT JOIN complex_status cs ON complex_rooms.complex_status_id = cs.id AND cs.is_archive = 0
WHERE ce.complex_house_id = {$r['id']}
{$filter_by_status};
");
$min_total_amount = null;
while ($floor = $this->db->fetch_assoc($floorsQuery)) {
$r['floors'][] = $floor;
}
while ($room = $this->db->fetch_assoc($roomQuery)) {
if (in_array((string)$room['id'], $_SESSION['to_send_complexes'])) {
$room['inPdf'] = true;
}
$r['rooms'][] = $room;
// Вычисляем минимальную стоимость
if ($room['total_amount'] !== null && $room['total_amount'] > 0) {
if ($min_total_amount === null || $room['total_amount'] < $min_total_amount) {
$min_total_amount = $room['total_amount'];
}
}
}
$r['min_total_amount'] = $min_total_amount;
while ($row = $this->db->fetch_assoc($imgR)) {
$r['images'][] = $row;
}
$result[] = $r;
}
}
return $result;
}
/**
*
*/
public function get_house_one($house_id)
{
$types_building = [
'RESIDENTIAL' => 'Жилое',
'PARKING' => 'Паркинг',
'APARTMENT' => 'Апартаменты',
'OFFICE' => 'Офисы'
];
$placement_types = [
1 => 'Квартиры',
2 => 'Комнаты',
3 => 'Дома',
4 => 'Коммерция',
5 => 'Части домов',
7 => 'Участки'
];
$time_to_subway = [
1 => 'пешком',
2 => 'на транспорте'
];
$quarter_list = [
1 => 'I квартал',
2 => 'II квартал',
3 => 'III квартал',
4 => 'IV квартал',
];
$month_list = [
1 => 'Январь',
2 => 'Февраль',
3 => 'Март',
4 => 'Апрель',
5 => 'Май',
6 => 'Июнь',
7 => 'Июль',
8 => 'Август',
9 => 'Сентябрь',
10 => 'Октябрь',
11 => 'Ноябрь',
12 => 'Декабрь',
];
$status_corpus_list = [
1 => 'Построен, но не сдан',
2 => 'Cдан в эксплуатацию',
3 => 'Cтроится',
4 => 'Построен и сдан',
];
$work_days = [
1 => 'Понедельник',
2 => 'Вторник',
3 => 'Среда',
4 => 'Четверг',
5 => 'Пятница',
6 => 'Суббота',
7 => 'Воскресенье',
];
$result = array();
if ($house_id > 0) {
$sql = "SELECT
complex_houses.*,
COUNT(DISTINCT c_rooms.id) AS rooms_count,
COUNT(DISTINCT c_rooms_plans.id) AS rooms_count_where_has_plans,
COUNT(DISTINCT c_floors.id) as floors_count,
COUNT(DISTINCT c_floor_plans.floor_plan_id) as floors_plans_count_where_has_floor,
COUNT(DISTINCT facades.id) as facades_count,
COUNT(DISTINCT figures.floor_id) as figures_where_has_floor_count
FROM
complex_houses
LEFT JOIN
complex_entrances c_entrances ON c_entrances.complex_house_id = complex_houses.id
LEFT JOIN
complex_floors c_floors ON c_floors.complex_entrance_id = c_entrances.id
LEFT JOIN
complex_house_facades facades ON facades.house_id = complex_houses.id AND facades.is_published != 0
LEFT JOIN
complex_facade_figures figures ON figures.facade_id = facades.id
LEFT JOIN
complex_floors_plans c_floor_plans ON c_floor_plans.floor_id = c_floors.id
LEFT JOIN
complex_rooms c_rooms ON c_rooms.floor_id = c_floors.id
LEFT JOIN
complex_rooms_plans c_rooms_plans ON c_rooms_plans.room_id = c_rooms.id
WHERE
complex_houses.id = {$house_id} AND complex_houses.deleted_at IS NULL";
$q = $this->db->query($sql);
$r = $this->db->fetch_assoc($q);
if (!$r) {
return ['status' => false, 'message' => 'house not found'];
}
$r['type_building_text'] = '';
if (isset($types_building[$r['type_building']])) $r['type_building_text'] = $types_building[$r['type_building']];
$r['placement_type_text'] = '';
if (isset($placement_types[$r['placement_type']])) $r['placement_type_text'] = $placement_types[$r['placement_type']];
$r['status_corpus_text'] = '';
if (isset($status_corpus_list[$r['status_corpus']])) $r['status_corpus_text'] = $status_corpus_list[$r['status_corpus']];
$r['deadline'] = '';
if (isset($quarter_list[$r['deadline_quarter']])) $r['deadline'] .= $quarter_list[$r['deadline_quarter']];
$r['deadline'] .= ' ' . $r['deadline_year'];
$r['development'] = '';
if (isset($quarter_list[$r['development_start_quarter']])) {
$r['development'] .= $quarter_list[$r['development_start_quarter']] . ' ' . $r['development_start_year'];
}
if (isset($quarter_list[$r['development_end_quarter']])) {
$r['development'] .= ' - ' . $quarter_list[$r['development_end_quarter']] . ' ' . $r['development_end_year'];
}
$result['house'] = $r;
$result['house']['images'] = array();
$imgR = $this->db->query("SELECT * from complex_house_images WHERE house_id = $house_id");
while ($row = $this->db->fetch_assoc($imgR)) {
$result['house']['images'][] = $row;
}
$utpR = $this->db->query("SELECT * FROM complex_house_UTP WHERE house_id = {$house_id}");
$result['house']['utps'] = [];
while ($row = $this->db->fetch_assoc($utpR)) {
$result['house']['utps'][] = $row;
}
$decR = $this->db->query("SELECT chd.*, dt.name as decoration_name FROM complex_house_decoration chd, decoration_types dt WHERE dt.id = chd.decoration_id AND house_id = {$house_id}");
$result['house']['decorations'] = [];
while ($row = $this->db->fetch_assoc($decR)) {
$result['house']['decorations'][] = $row;
}
if ($r['complex_id'] > 0) {
$complex = $this->get_complex_one($r['complex_id'], false, false);
$result['complex'] = $complex;
if (isset($complex['metro']) && isset($complex['metro']['metro'])) {
$result['house']['metro'] = $complex['metro']['metro'];
} else {
$result['house']['metro'] = [];
}
}
$installmentsResult = $this->db->query("
SELECT
i.id,
i.name,
i.type,
i.description,
i.initial_payment,
i.payment_period,
i.interest_rate,
i.comment,
chi.end_date
FROM
complex_house_installments chi
LEFT JOIN
installments i ON i.id = chi.installment_id
WHERE
chi.house_id = $house_id
");
$result['house']['installments'] = [];
while ($row = $this->db->fetch_assoc($installmentsResult)) {
$result['house']['installments'][] = $row;
}
}
return $result;
}
public function get_house_plans($house_id, $has_token = false)
{
$result = array();
if ($house_id > 0) {
$sql = "SELECT * FROM complex_house_plans WHERE house_id = {$house_id}";
$q = $this->db->query($sql);
while ($plan = $this->db->fetch_assoc($q)) {
$images = $this->get_plans_images($plan['id']);
$rooms = $this->get_plan_rooms($plan['id'], $has_token);
$plan['images'] = $images;
$plan['rooms'] = $rooms;
$result[] = $plan;
}
}
return $result;
}
public function get_entrances_floor_plans($house_id, $has_token = false)
{
$result = array();
$sql = "SELECT DISTINCT entrances.*
FROM complex_entrances as entrances
JOIN complex_floors floors ON floors.complex_entrance_id = entrances.id
JOIN complex_floors_plans floor_plan_link ON floor_plan_link.floor_id = floors.id
JOIN complex_house_floor_plans floor_plans ON floor_plans.id = floor_plan_link.floor_plan_id
WHERE entrances.complex_house_id = {$house_id}
";
// JOIN complex_floor_plan_figures figures ON figures.floor_plan_id = floor_plans.id
// figures.room_plan_id IS NOT NULL AND
$res = $this->db->query($sql);
while ($entrance = $this->db->fetch_assoc($res)) {
$sql_floors = "SELECT DISTINCT complex_floors.* from complex_floors
JOIN complex_floors_plans floor_plan_link ON floor_plan_link.floor_id = complex_floors.id
WHERE complex_entrance_id = {$entrance['id']}
order by complex_floors.position
";
$entrance['floors'] = [];
$r_floors = $this->db->query($sql_floors);
while ($floor = $this->db->fetch_assoc($r_floors)) {
$sql_plan_with_not_use_all = "SELECT plan.* FROM complex_house_floor_plans as plan
JOIN complex_floors_plans floor_plan_link ON floor_plan_link.floor_plan_id = plan.id
WHERE floor_plan_link.floor_id = {$floor['id']} AND plan.is_use_all_entrances != 1
";
$sql_plan = "SELECT plan.* FROM complex_house_floor_plans as plan
JOIN complex_floors_plans floor_plan_link ON floor_plan_link.floor_plan_id = plan.id
WHERE floor_plan_link.floor_id = {$floor['id']}
";
$floor['plan'] = [];
$r_plans = $this->db->query($sql_plan_with_not_use_all);
$plan = $this->db->fetch_assoc($r_plans);
if (!$plan) {
$plan = $this->db->fetch_assoc($this->db->query($sql_plan));
}
$plan['entrances'] = json_decode($plan['entrances']);
$plan['floor_positions'] = json_decode($plan['floor_positions']);
$plan['is_use_all_entrances'] = (bool)$plan['is_use_all_entrances'];
$plan['has_light_angle'] = (bool)$plan['has_light_angle'];
$plan['figures'] = array();
$q = $this->db->query("SELECT DISTINCT figures.* FROM complex_floor_plan_figures as figures
JOIN complex_floors on complex_floors.id = {$floor['id']}
JOIN complex_rooms ON complex_rooms.floor_id = complex_floors.id
JOIN complex_rooms_plans on complex_rooms_plans.plan_id = figures.room_plan_id AND complex_rooms_plans.room_id = complex_rooms.id
WHERE figures.floor_plan_id = {$plan['id']} AND figures.room_plan_id IS NOT NULL");
$installment_plans = [];
$installment_sql = "SELECT i.*,
chi.end_date as house_installment_end_date
FROM installments i
INNER JOIN complex_house_installments chi ON chi.installment_id = i.id
WHERE chi.house_id = {$house_id}
AND i.is_archive = 0
AND (chi.end_date IS NULL OR chi.end_date >= CURDATE())";
$installment_q = $this->db->query($installment_sql);
while ($plan_installment = $this->db->fetch_assoc($installment_q)) {
$installment_plans[] = [
'id' => $plan_installment['id'],
'name' => $plan_installment['name'],
'description' => $plan_installment['description'],
'type' => $plan_installment['type'],
'initial_payment' => $plan_installment['initial_payment'],
'payment_period' => json_decode($plan_installment['payment_period'], true),
'allow_change_on_close' => $plan_installment['allow_change_on_close'],
'interest_rate' => $plan_installment['interest_rate'],
'comment' => $plan_installment['comment'],
'house_installment_end_date' => $plan_installment['house_installment_end_date']
];
}
while ($figure = $this->db->fetch_assoc($q)) {
// $r_room = $this->db->query("SELECT DISTINCT rooms.* FROM complex_rooms as rooms
// JOIN complex_rooms_plans as room_plan_link ON room_plan_link.room_id = rooms.id AND room_plan_link.plan_id = {$figure['room_plan_id']}
// WHERE rooms.floor_id = {$floor['id']}
// ");
$r_room = $this->db->query("SELECT DISTINCT
complex_rooms.*,
c_house_p_i.url as plan_url,
cs.name as status_name,
cs.status as status_type,
cs.color as status_color,
ch.name as house_name,
ch.parking as house_parking,
ch.security as house_security,
ch.fenced_area as house_fenced_area,
ch.sports_ground as house_sports_ground,
ch.play_ground as house_play_ground,
ch.school as house_school,
ch.kinder_garten as house_kinder_garten,
ch.id as house_id,
c_house_p.has_light_angle ,
c_house_p.light_angle FROM complex_rooms
LEFT JOIN complex_rooms_plans c_room_p ON c_room_p.room_id = complex_rooms.id AND c_room_p.plan_id = {$figure['room_plan_id']}
LEFT JOIN complex_house_plans_images c_house_p_i ON c_room_p.plan_id = c_house_p_i.plan_id AND c_house_p_i.position = 1
LEFT JOIN complex_status cs ON complex_rooms.complex_status_id = cs.id and cs.is_archive = 0
JOIN complex_houses ch on ch.id = {$house_id}
LEFT JOIN complex_house_plans c_house_p ON c_room_p.plan_id = c_house_p.id
WHERE complex_rooms.id=c_room_p.room_id AND complex_rooms.floor_id = {$floor['id']}
ORDER BY complex_rooms.position
");
$room = $this->db->fetch_assoc($r_room);
$reservations = $this->get_room_reservations($room['id']);
unset($reservations['can_change_queue']);
$complex_status_info = [
'status_name' => $room['status_name'],
'status_type' => $room['status_type'],
'status_color' => $room['status_color']
];
if (!$has_token) {
unset($room['status_name']);
unset($room['status_type']);
unset($room['status_color']);
}
if ($room['status_type'] != 'reservation' && is_array($reservations) && count($reservations))
{
$complex_status_info = [
'status_name' => $reservations[0]['status_name'],
'status_type' => $reservations[0]['status_type'],
'status_color' => $reservations[0]['status_color'],
];
}
$room['complex_status_info'] = $complex_status_info;
if (in_array((string)$room['id'], $_SESSION['to_send_complexes'])) {
$room['inPdf'] = true;
}
$room['installment_plans'] = $installment_plans;
$figure['room'] = $room ? $room : null;
$figure['points'] = json_decode($figure['points']);
$plan['figures'][] = $figure;
}
$floor['plan'] = $plan ? $plan : null;
// $row_floor['plan'] = $this->get_floor_plan($row_floor['id']);
$entrance['floors'][] = $floor;
}
$result[] = $entrance;
}
return $result;
}
public function get_house_floors_plans($house_id)
{
$result = array();
if ($house_id > 0) {
$sql = "SELECT * FROM complex_house_floor_plans WHERE house_id = {$house_id}";
$q = $this->db->query($sql);
while ($plan = $this->db->fetch_assoc($q)) {
$floors = $this->get_plan_floors($plan['id']);
$plan['floors'] = $floors;
$plan['entrances'] = json_decode($plan['entrances']);
$plan['floor_positions'] = json_decode($plan['floor_positions']);
$result[] = $plan;
}
}
return $result;
}
public function get_floor_plan($floor_plan_id)
{
if ($floor_plan_id > 0) {
$sql = "SELECT * FROM complex_house_floor_plans WHERE id = {$floor_plan_id}";
$q = $this->db->query($sql);
$plan = $this->db->fetch_assoc($q);
$plan['entrances'] = json_decode($plan['entrances']);
$plan['floor_positions'] = json_decode($plan['floor_positions']);
$plan['is_use_all_entrances'] = (bool)$plan['is_use_all_entrances'];
$plan['has_light_angle'] = (bool)$plan['has_light_angle'];
$plan['figures'] = array();
$q = $this->db->query("SELECT * FROM complex_floor_plan_figures WHERE floor_plan_id = {$plan['id']}");
while ($row = $this->db->fetch_assoc($q)) {
$row['points'] = json_decode($row['points']);
$plan['figures'][] = $row;
}
return $plan;
}
return ['status' => false];
}
public function save_document($blank_id, $req_id, $room,$user_id){
$room_array = json_decode(json_encode($room), true);
$room_id = $room_array['id'] ;
$q = $this->db->query("SELECT client_id, object_id FROM requisitions WHERE id = " . intval($req_id));
$client = $this->db->fetch_assoc($q);
$client_id = $client['client_id'];
$document = Docs::fillInnerDocument($blank_id, $client_id,null,null,false,$room_array);
$document_id = $document["doc_id"];
$sql_insert = "
INSERT INTO user_client_events (req_id, type, document_id, user_id)
VALUES ($req_id, 'file', $document_id, $user_id)
";
$this->db->query($sql_insert);
}
public function updateRoomsPlanLink($plan_id, $room_ids = [])
{
// $plan_id, $room_ids
if ($plan_id) {
$sqlDelete = "DELETE FROM complex_rooms_plans WHERE plan_id = $plan_id";
$q = $this->db->query($sqlDelete);
}
if (!empty($room_ids)) {
$insertValue = array();
foreach ($room_ids as $room_id) {
$insertValue[] = "($plan_id, $room_id)";
}
$insertValueStr = implode(', ', $insertValue);
$sqlAddRooms = "INSERT INTO complex_rooms_plans (plan_id, room_id) VALUES {$insertValueStr}";
$q = $this->db->query($sqlAddRooms);
}
return $this->get_plan_rooms($plan_id);
}
public function change_rooms_price_by_square($value, $room_ids, $type, $operation_type) {
foreach ($room_ids as $id) {
if (!is_numeric($id)) continue;
$q = $this->db->query("SELECT id, $operation_type, area FROM complex_rooms WHERE id = {$id}");
$room = $this->db->fetch_assoc($q);
if (!$room || $room['area'] == 0) continue;
$unitPrice = $room[$operation_type] / $room['area'];
switch ($type) {
case 'change_by_value':
$unitPrice = $value;
break;
case 'up_by_percent':
$unitPrice += $unitPrice * ($value / 100);
break;
case 'down_by_percent':
$unitPrice -= $unitPrice * ($value / 100);
break;
case 'up_by_value':
$unitPrice += $value;
break;
case 'down_by_value':
$unitPrice -= $value;
break;
default:
return ['status' => false];
}
$newTotal = $unitPrice * $room['area'];
$sql = "UPDATE complex_rooms SET $operation_type = {$newTotal} WHERE id = {$id}";
$this->db->query($sql);
}
return ['status' => true];
}
public function change_rooms_price($value, $room_ids, $type, $operation_type) {
if ($type === 'change_by_value') {
foreach ($room_ids as $id) {
if (is_numeric($id)) {
$sqlAddRooms = "UPDATE complex_rooms SET $operation_type = {$value} WHERE id = {$id}";
$this->db->query($sqlAddRooms);
}
}
return ['status' => true];
}
if ($type === 'up_by_percent') {
foreach ($room_ids as $id) {
if (is_numeric($id)) {
$q = $this->db->query("SELECT id, $operation_type FROM complex_rooms WHERE id = {$id}");
$room = $this->db->fetch_assoc($q);
$newPrice = $room[$operation_type] + ($room[$operation_type] * ($value/100));
$sqlAddRooms = "UPDATE complex_rooms SET $operation_type = {$newPrice} WHERE id = {$id}";
$this->db->query($sqlAddRooms);
}
}
return ['status' => true];
}
if ($type === 'down_by_percent') {
foreach ($room_ids as $id) {
if (is_numeric($id)) {
$q = $this->db->query("SELECT id, $operation_type FROM complex_rooms WHERE id = {$id}");
$room = $this->db->fetch_assoc($q);
$newPrice = $room[$operation_type] - ($room[$operation_type] * ($value/100));
$sqlAddRooms = "UPDATE complex_rooms SET $operation_type = {$newPrice} WHERE id = {$id}";
$this->db->query($sqlAddRooms);
}
}
return ['status' => true];
}
if ($type === 'down_by_value') {
foreach ($room_ids as $id) {
if (is_numeric($id)) {
$q = $this->db->query("SELECT id, $operation_type FROM complex_rooms WHERE id = {$id}");
$room = $this->db->fetch_assoc($q);
$newPrice = $room[$operation_type] - $value;
$sqlAddRooms = "UPDATE complex_rooms SET $operation_type = {$newPrice} WHERE id = {$id}";
$this->db->query($sqlAddRooms);
}
}
return ['status' => true];
}
if ($type === 'up_by_value') {
foreach ($room_ids as $id) {
if (is_numeric($id)) {
$q = $this->db->query("SELECT id, $operation_type FROM complex_rooms WHERE id = {$id}");
$room = $this->db->fetch_assoc($q);
$newPrice = $room[$operation_type]+ $value;
$sqlAddRooms = "UPDATE complex_rooms SET $operation_type = {$newPrice} WHERE id = {$id}";
$this->db->query($sqlAddRooms);
}
}
return ['status' => true];
}
return ['status' => false];
}
public function send_rooms_to_advert($house_id, $room_ids, $type) {
if ($type === 'domclick') {
$roomsInAdvert = [];
//ищем все помещения, которые уже размещены
$rooms_sql = "SELECT complex_rooms.id
FROM complex_rooms
LEFT JOIN complex_room_advert cra ON cra.complex_room_id = complex_rooms.id
LEFT JOIN complex_floors cf ON cf.id = complex_rooms.floor_id
LEFT JOIN complex_entrances ce ON ce.id = cf.complex_entrance_id
LEFT JOIN complex_houses ch ON ch.id = ce.complex_house_id
WHERE ce.complex_house_id = {$house_id} and cra.add_to_domclick_feed = 1
GROUP BY complex_rooms.id
ORDER BY complex_rooms.position";
$rooms_q = $this->db->query($rooms_sql);
while ($room = $this->db->fetch_assoc($rooms_q)) {
$roomsInAdvert[] = $room['id'];
}
//размещаем выбранные помещения в рекламу
foreach ($room_ids as $id) {
$sql_adv = "SELECT id FROM complex_room_advert WHERE complex_room_id={$id}";
$q_adv = $this->db->query($sql_adv);
if ($this->db->num_rows($q_adv) == 0) {
$sqlAddRooms = "INSERT INTO complex_room_advert (complex_room_id, add_to_domclick_feed) VALUES ({$id}, 1)";
$this->db->query($sqlAddRooms);
} else {
$sqlAddRooms = "UPDATE complex_room_advert SET add_to_domclick_feed = 1 WHERE complex_room_id = {$id}";
$this->db->query($sqlAddRooms);
}
//удаляем из массива уже размещенных
$key = array_search($id, $roomsInAdvert);
if ($key !== false) {
unset($roomsInAdvert[$key]);
}
}
//снимаем с рекламы то, что было в БД, но снято
foreach ($roomsInAdvert as $id) {
$sqlAddRooms = "UPDATE complex_room_advert SET add_to_domclick_feed = 0 WHERE complex_room_id = {$id}";
$this->db->query($sqlAddRooms);
}
}
if ($type === 'avito') {
$roomsInAdvert = [];
//ищем все помещения, которые уже размещены
$rooms_sql = "SELECT complex_rooms.id
FROM complex_rooms
LEFT JOIN complex_room_advert cra ON cra.complex_room_id = complex_rooms.id
LEFT JOIN complex_floors cf ON cf.id = complex_rooms.floor_id
LEFT JOIN complex_entrances ce ON ce.id = cf.complex_entrance_id
LEFT JOIN complex_houses ch ON ch.id = ce.complex_house_id
WHERE ce.complex_house_id = {$house_id} and cra.add_to_avito_feed = 1
GROUP BY complex_rooms.id
ORDER BY complex_rooms.position";
$rooms_q = $this->db->query($rooms_sql);
while ($room = $this->db->fetch_assoc($rooms_q)) {
$roomsInAdvert[] = $room['id'];
}
//размещаем выбранные помещения в рекламу
foreach ($room_ids as $id) {
$sql_adv = "SELECT id FROM complex_room_advert WHERE complex_room_id={$id}";
$q_adv = $this->db->query($sql_adv);
if ($this->db->num_rows($q_adv) == 0) {
$sqlAddRooms = "INSERT INTO complex_room_advert (complex_room_id, add_to_avito_feed) VALUES ({$id}, 1)";
$this->db->query($sqlAddRooms);
} else {
$sqlAddRooms = "UPDATE complex_room_advert SET add_to_avito_feed = 1 WHERE complex_room_id = {$id}";
$this->db->query($sqlAddRooms);
}
//удаляем из массива уже размещенных
$key = array_search($id, $roomsInAdvert);
if ($key !== false) {
unset($roomsInAdvert[$key]);
}
}
//снимаем с рекламы то, что было в БД, но снято
foreach ($roomsInAdvert as $id) {
$sqlAddRooms = "UPDATE complex_room_advert SET add_to_avito_feed = 0 WHERE complex_room_id = {$id}";
$this->db->query($sqlAddRooms);
}
}
if ($type === 'cian') {
$roomsInAdvert = [];
//ищем все помещения, которые уже размещены
$rooms_sql = "SELECT complex_rooms.id
FROM complex_rooms
LEFT JOIN complex_room_advert cra ON cra.complex_room_id = complex_rooms.id
LEFT JOIN complex_floors cf ON cf.id = complex_rooms.floor_id
LEFT JOIN complex_entrances ce ON ce.id = cf.complex_entrance_id
LEFT JOIN complex_houses ch ON ch.id = ce.complex_house_id
WHERE ce.complex_house_id = {$house_id} and cra.add_to_cian_feed = 1
GROUP BY complex_rooms.id
ORDER BY complex_rooms.position";
$rooms_q = $this->db->query($rooms_sql);
while ($room = $this->db->fetch_assoc($rooms_q)) {
$roomsInAdvert[] = $room['id'];
}
//размещаем выбранные помещения в рекламу
foreach ($room_ids as $id) {
$sql_adv = "SELECT id FROM complex_room_advert WHERE complex_room_id={$id}";
$q_adv = $this->db->query($sql_adv);
if ($this->db->num_rows($q_adv) == 0) {
$sqlAddRooms = "INSERT INTO complex_room_advert (complex_room_id, add_to_cian_feed) VALUES ({$id}, 1)";
$this->db->query($sqlAddRooms);
} else {
$sqlAddRooms = "UPDATE complex_room_advert SET add_to_cian_feed = 1 WHERE complex_room_id = {$id}";
$this->db->query($sqlAddRooms);
}
//удаляем из массива уже размещенных
$key = array_search($id, $roomsInAdvert);
if ($key !== false) {
unset($roomsInAdvert[$key]);
}
}
//снимаем с рекламы то, что было в БД, но снято
foreach ($roomsInAdvert as $id) {
$sqlAddRooms = "UPDATE complex_room_advert SET add_to_cian_feed = 0 WHERE complex_room_id = {$id}";
$this->db->query($sqlAddRooms);
}
}
if ($type === 'ya') {
$roomsInAdvert = [];
//ищем все помещения, которые уже размещены
$rooms_sql = "SELECT complex_rooms.id
FROM complex_rooms
LEFT JOIN complex_room_advert cra ON cra.complex_room_id = complex_rooms.id
LEFT JOIN complex_floors cf ON cf.id = complex_rooms.floor_id
LEFT JOIN complex_entrances ce ON ce.id = cf.complex_entrance_id
LEFT JOIN complex_houses ch ON ch.id = ce.complex_house_id
WHERE ce.complex_house_id = {$house_id} and cra.add_to_yandex_feed = 1
GROUP BY complex_rooms.id
ORDER BY complex_rooms.position";
$rooms_q = $this->db->query($rooms_sql);
while ($room = $this->db->fetch_assoc($rooms_q)) {
$roomsInAdvert[] = $room['id'];
}
//размещаем выбранные помещения в рекламу
foreach ($room_ids as $id) {
$sql_adv = "SELECT id FROM complex_room_advert WHERE complex_room_id={$id}";
$q_adv = $this->db->query($sql_adv);
if ($this->db->num_rows($q_adv) == 0) {
$sqlAddRooms = "INSERT INTO complex_room_advert (complex_room_id, add_to_yandex_feed) VALUES ({$id}, 1)";
$this->db->query($sqlAddRooms);
} else {
$sqlAddRooms = "UPDATE complex_room_advert SET add_to_yandex_feed = 1 WHERE complex_room_id = {$id}";
$this->db->query($sqlAddRooms);
}
//удаляем из массива уже размещенных
$key = array_search($id, $roomsInAdvert);
if ($key !== false) {
unset($roomsInAdvert[$key]);
}
}
//снимаем с рекламы то, что было в БД, но снято
foreach ($roomsInAdvert as $id) {
$sqlAddRooms = "UPDATE complex_room_advert SET add_to_yandex_feed = 0 WHERE complex_room_id = {$id}";
$this->db->query($sqlAddRooms);
}
}
if ($type === 'domrf') {
$roomsInAdvert = [];
//ищем все помещения, которые уже размещены
$rooms_sql = "SELECT complex_rooms.id
FROM complex_rooms
LEFT JOIN complex_room_advert cra ON cra.complex_room_id = complex_rooms.id
LEFT JOIN complex_floors cf ON cf.id = complex_rooms.floor_id
LEFT JOIN complex_entrances ce ON ce.id = cf.complex_entrance_id
LEFT JOIN complex_houses ch ON ch.id = ce.complex_house_id
WHERE ce.complex_house_id = {$house_id} and cra.add_to_domrf_feed = 1
GROUP BY complex_rooms.id
ORDER BY complex_rooms.position";
$rooms_q = $this->db->query($rooms_sql);
while ($room = $this->db->fetch_assoc($rooms_q)) {
$roomsInAdvert[] = $room['id'];
}
//размещаем выбранные помещения в рекламу
foreach ($room_ids as $id) {
$sql_adv = "SELECT id FROM complex_room_advert WHERE complex_room_id={$id}";
$q_adv = $this->db->query($sql_adv);
if ($this->db->num_rows($q_adv) == 0) {
$sqlAddRooms = "INSERT INTO complex_room_advert (complex_room_id, add_to_domrf_feed) VALUES ({$id}, 1)";
$this->db->query($sqlAddRooms);
} else {
$sqlAddRooms = "UPDATE complex_room_advert SET add_to_domrf_feed = 1 WHERE complex_room_id = {$id}";
$this->db->query($sqlAddRooms);
}
//удаляем из массива уже размещенных
$key = array_search($id, $roomsInAdvert);
if ($key !== false) {
unset($roomsInAdvert[$key]);
}
}
//снимаем с рекламы то, что было в БД, но снято
foreach ($roomsInAdvert as $id) {
$sqlAddRooms = "UPDATE complex_room_advert SET add_to_domrf_feed = 0 WHERE complex_room_id = {$id}";
$this->db->query($sqlAddRooms);
}
}
if ($type === 'site') {
$roomsInAdvert = [];
//ищем все помещения, которые уже размещены
$rooms_sql = "SELECT complex_rooms.id
FROM complex_rooms
LEFT JOIN complex_room_advert cra ON cra.complex_room_id = complex_rooms.id
LEFT JOIN complex_floors cf ON cf.id = complex_rooms.floor_id
LEFT JOIN complex_entrances ce ON ce.id = cf.complex_entrance_id
LEFT JOIN complex_houses ch ON ch.id = ce.complex_house_id
WHERE ce.complex_house_id = {$house_id} and cra.add_to_site_feed = 1
GROUP BY complex_rooms.id
ORDER BY complex_rooms.position";
$rooms_q = $this->db->query($rooms_sql);
while ($room = $this->db->fetch_assoc($rooms_q)) {
$roomsInAdvert[] = $room['id'];
}
//размещаем выбранные помещения в рекламу
foreach ($room_ids as $id) {
$sql_adv = "SELECT id FROM complex_room_advert WHERE complex_room_id={$id}";
$q_adv = $this->db->query($sql_adv);
if ($this->db->num_rows($q_adv) == 0) {
$sqlAddRooms = "INSERT INTO complex_room_advert (complex_room_id, add_to_site_feed) VALUES ({$id}, 1)";
$this->db->query($sqlAddRooms);
} else {
$sqlAddRooms = "UPDATE complex_room_advert SET add_to_site_feed = 1 WHERE complex_room_id = {$id}";
$this->db->query($sqlAddRooms);
}
//удаляем из массива уже размещенных
$key = array_search($id, $roomsInAdvert);
if ($key !== false) {
unset($roomsInAdvert[$key]);
}
}
//снимаем с рекламы то, что было в БД, но снято
foreach ($roomsInAdvert as $id) {
$sqlAddRooms = "UPDATE complex_room_advert SET add_to_site_feed = 0 WHERE complex_room_id = {$id}";
$this->db->query($sqlAddRooms);
}
}
}
public function get_plan_floors($floor_plan_id)
{
$result = array();
if ($floor_plan_id > 0) {
$sql = "SELECT floor.* FROM complex_floors as floor
JOIN complex_floors_plans floors_plans on floors_plans.floor_id = floor.id
WHERE floors_plans.floor_plan_id = {$floor_plan_id}
";
$q = $this->db->query($sql);
while ($floor = $this->db->fetch_assoc($q)) {
$result[] = $floor;
}
}
return $result;
}
public function get_house_facades($house_id, $includes = [])
{
$result = array();
$usePublished = in_array('not_published', $includes);
if ($house_id > 0) {
if ($usePublished) {
$sql = "SELECT * FROM complex_house_facades WHERE house_id = {$house_id}";
} else {
$sql = "SELECT * FROM complex_house_facades WHERE house_id = {$house_id} AND is_published != 0 ";
}
$q = $this->db->query($sql);
while ($facade = $this->db->fetch_assoc($q)) {
$facade['figures'] = $this->getFacadeFigures($house_id, $facade['id'], $includes);
$facade['is_published'] = (bool) $facade['is_published'];
$result[] = $facade;
}
}
return $result;
}
public function getFacadeFigures($house_id, $facade_id, $includes = [])
{
$result = array();
$useRooms = in_array('rooms', $includes);
$useFloor = in_array('floor', $includes);
$useEntrance = in_array('entrance', $includes);
if ($facade_id > 0) {
$sql = "SELECT * FROM complex_facade_figures WHERE facade_id = {$facade_id}";
$q = $this->db->query($sql);
// Installment plans: fetch once by house_id
$installment_plans = [];
$installment_sql = "SELECT i.*, chi.end_date as house_installment_end_date
FROM installments i
INNER JOIN complex_house_installments chi ON chi.installment_id = i.id
WHERE chi.house_id = {$house_id}
AND i.is_archive = 0
AND (chi.end_date IS NULL OR chi.end_date >= CURDATE())";
$installment_q = $this->db->query($installment_sql);
while ($plan = $this->db->fetch_assoc($installment_q)) {
$installment_plans[] = [
'id' => $plan['id'],
'name' => $plan['name'],
'description' => $plan['description'],
'type' => $plan['type'],
'initial_payment' => $plan['initial_payment'],
'payment_period' => json_decode($plan['payment_period'], true),
'allow_change_on_close' => $plan['allow_change_on_close'],
'interest_rate' => $plan['interest_rate'],
'comment' => $plan['comment'],
'house_installment_end_date' => $plan['house_installment_end_date']
];
}
while ($figure = $this->db->fetch_assoc($q)) {
$figure['points'] = json_decode($figure['points']);
if ($useRooms) {
$figure['rooms'] = [];
if ($figure['floor_id'] && $figure['entrance_id']) {
$sqlRooms = "SELECT
complex_rooms.id,
complex_rooms.number,
complex_rooms.area,
complex_rooms.kitchen_area,
complex_rooms.total_amount,
complex_rooms.installment_price,
complex_rooms.rooms_count,
complex_rooms.layout_feature,
complex_rooms.decoration_id,
complex_rooms.windows_placement_id,
complex_rooms.ceiling_height,
complex_rooms.payment_types,
MIN(complex_rooms.position) AS position,
MIN(complex_floors.position) AS floor,
complex_entrances.name AS entrance_name,
MIN(c_house_p_i.url) AS plan_url,
MIN(cs.name) AS status_name,
MIN(cs.status) AS status_type,
MIN(cs.color) AS status_color,
MIN(ch.name) AS house_name,
MIN(ch.parking) AS house_parking,
MIN(ch.security) AS house_security,
MIN(ch.fenced_area) AS house_fenced_area,
MIN(ch.sports_ground) AS house_sports_ground,
MIN(ch.play_ground) AS house_play_ground,
MIN(ch.school) AS house_school,
MIN(ch.kinder_garten) AS house_kinder_garten,
MIN(ch.id) AS house_id,
MIN(c_house_p.has_light_angle) AS has_light_angle,
MIN(c_house_p.light_angle) AS light_angle
FROM
complex_rooms
JOIN complex_floors ON complex_floors.id = complex_rooms.floor_id
JOIN complex_entrances ON complex_entrances.id = complex_floors.complex_entrance_id
LEFT JOIN complex_rooms_plans c_room_p ON c_room_p.room_id = complex_rooms.id
LEFT JOIN complex_house_plans_images c_house_p_i ON c_room_p.plan_id = c_house_p_i.plan_id AND c_house_p_i.position = 1
LEFT JOIN complex_status cs ON complex_rooms.complex_status_id = cs.id AND cs.is_archive = 0
JOIN complex_houses ch ON ch.id = {$house_id}
LEFT JOIN complex_house_plans c_house_p ON c_room_p.plan_id = c_house_p.id
WHERE
complex_floors.id = {$figure['floor_id']}
AND complex_entrances.id = {$figure['entrance_id']}
AND cs.status = 'available'
GROUP BY
complex_rooms.id,
complex_entrances.name
ORDER BY
MIN(complex_rooms.position)";
$res = $this->db->query($sqlRooms);
while ($room = $this->db->fetch_assoc($res)) {
if ($room['status_type'] == 'reservation') {
$requisition_sql = $this->db->query("SELECT id FROM requisitions where complex_room_id = {$room['id']} ORDER BY created_at DESC");
if ($row = $this->db->fetch_assoc($requisition_sql)) {
$room['requisition_id'] = $row['id'];
}
}
if (in_array((string)$room['id'], $_SESSION['to_send_complexes'])) {
$room['inPdf'] = true;
}
$reservations = $this->get_room_reservations($room['id']);
unset($reservations['can_change_queue']);
$complex_status_info = [
'status_name' => $room['status_name'],
'status_type' => $room['status_type'],
'status_color' => $room['status_color']
];
if ($room['status_type'] != 'reservation' && is_array($reservations) && count($reservations))
{
$complex_status_info = [
'status_name' => $reservations[0]['status_name'],
'status_type' => $reservations[0]['status_type'],
'status_color' => $reservations[0]['status_color'],
];
}
$room['complex_status_info'] = $complex_status_info;
// Installment plans without base_price
$room['installment_plans'] = $installment_plans;
// Payment types decode
if (!empty($room['payment_types'])) {
$decodedPaymentTypes = json_decode($room['payment_types'], true);
$room['payment_types'] = is_array($decodedPaymentTypes) ? $decodedPaymentTypes : [];
} else {
$room['payment_types'] = [];
}
$figure['rooms'][] = $room;
}
}
}
if ($useFloor) {
$figure['floor'] = null;
if ($figure['floor_id']) {
$sqlFloor = $this->db->query("SELECT DISTINCT complex_floors.*, floor_plans.image as plan_url FROM complex_floors
LEFT JOIN complex_floors_plans floor_plan_link ON floor_plan_link.floor_id = complex_floors.id
LEFT JOIN complex_house_floor_plans floor_plans ON floor_plans.id = floor_plan_link.floor_plan_id
WHERE complex_floors.id = {$figure['floor_id']} and complex_floors.complex_entrance_id = {$figure['entrance_id']} ORDER BY position ASC
");
$figure['floor'] = $this->db->fetch_assoc($sqlFloor);
}
unset($figure['floor_id']);
}
if ($useEntrance) {
$figure['entrance'] = null;
if ($figure['entrance_id']) {
$sqlEntrance = $this->db->query("SELECT * FROM complex_entrances WHERE id = {$figure['entrance_id']}");
$figure['entrance'] = $this->db->fetch_assoc($sqlEntrance);
}
unset($figure['entrance_id']);
}
$result[] = $figure;
}
}
return $result;
}
public function addFacadeToHouse($house_id, $photo, $position, $hover_color, $opacity)
{
$sql = "INSERT INTO complex_house_facades SET house_id = {$house_id}, position = {$position}, hover_color = '{$hover_color}', opacity = '{$opacity}'";
$r = $this->db->query($sql, true);
$facade_id = $this->db->insert_id();
$this->addPhotoToFacade($photo, $facade_id);
$facade_sql = "SELECT * FROM complex_house_facades WHERE id = {$facade_id}";
$facade_r = $this->db->query($facade_sql, true);
$facade = $this->db->fetch_assoc($facade_r);
$facade['is_published'] = (bool) $facade['is_published'];
$facade['figures'] = [];
return $facade;
}
public function addPhotoToFacade($photo, $facade_id)
{
$newPhotos = $this->uploadPhotosToEntity([$photo], "facades", $facade_id);
$q = $this->db->query("DELETE FROM complex_facade_figures WHERE facade_id = {$facade_id}"); // TODO
$result = '';
if (count($newPhotos)) {
$image = $newPhotos[0];
$sql_in_image = "UPDATE complex_house_facades SET `image` = '{$image['url']}', `name` = '{$image['name']}' WHERE `id` = {$facade_id}";
$r = $this->db->query($sql_in_image, true);
$result = $image;
}
return $result;
}
public function updateHouseFacade($facade_id, $fields)
{
$this->set_user();
$strArray = [];
foreach ($fields as $key => $value) {
if ($key == 'id' || (empty($value) && $value !== 0 && $value !== false)) {
continue;
}
if (is_string($value)) {
$strArray[] = "$key='$value'";
} else if (is_bool($value)) {
$value = (int)$value;
$strArray[] = "$key=$value";
} else {
$strArray[] = "$key=$value";
}
}
$str = implode(', ', $strArray);
$sql = "UPDATE complex_house_facades SET $str WHERE id = {$facade_id}";
$this->db->query($sql);
$facade = $this->db->fetch_assoc($this->db->query("SELECT * from complex_house_facades WHERE id = {$facade_id}"));
$facade['is_published'] = (bool) $facade['is_published'];
return $facade;
}
public function updateFacadeFigure($figure_id, $fields)
{
$this->set_user();
$strArray = [];
foreach ($fields as $key => $value) {
if ($key == 'id' || (empty($value) && $value !== 0 && $value !== false)) {
continue;
}
if (is_string($value)) {
$strArray[] = "$key='$value'";
} else if (is_bool($value)) {
$value = (int)$value;
$strArray[] = "$key=$value";
} else {
$strArray[] = "$key=$value";
}
}
$str = implode(', ', $strArray);
$sql = "UPDATE complex_facade_figures SET $str WHERE id = {$figure_id}";
$this->db->query($sql);
$figure = $this->db->fetch_assoc($this->db->query("SELECT * from complex_facade_figures WHERE id = {$figure_id}"));
$figure['points'] = json_decode($figure['points']);
return $figure;
}
public function addFacadeFigure($facade_id, $points)
{
$points = json_encode($points);
$sql = "INSERT INTO complex_facade_figures SET points = '{$points}', facade_id={$facade_id}";
$q = $this->db->query($sql);
$id = $this->db->insert_id();
$q = $this->db->query("SELECT * FROM complex_facade_figures WHERE id = $id ");
$figure = $this->db->fetch_assoc($q);
$figure['points'] = json_decode($figure['points']);
return $figure;
}
public function get_plan_rooms($plan_id, $has_token = false)
{
$result = array();
if ($plan_id > 0) {
// Get house_id based on plan_id
$house_id_sql = "SELECT ch.id as house_id
FROM complex_house_plans chp
JOIN complex_houses ch ON ch.id = chp.house_id
WHERE chp.id = {$plan_id}
LIMIT 1";
$house_id_result = $this->db->query($house_id_sql);
$house_row = $this->db->fetch_assoc($house_id_result);
$house_id = (int)($house_row['house_id'] ? $house_row['house_id'] : 0);
// Fetch installment plans for the house
$installment_plans = [];
if ($house_id > 0) {
$installment_sql = "SELECT i.*, chi.end_date as house_installment_end_date
FROM installments i
INNER JOIN complex_house_installments chi ON chi.installment_id = i.id
WHERE chi.house_id = {$house_id}
AND i.is_archive = 0
AND (chi.end_date IS NULL OR chi.end_date >= CURDATE())";
$installment_q = $this->db->query($installment_sql);
while ($plan = $this->db->fetch_assoc($installment_q)) {
$installment_plans[] = [
'id' => $plan['id'],
'name' => $plan['name'],
'description' => $plan['description'],
'type' => $plan['type'],
'initial_payment' => $plan['initial_payment'],
'payment_period' => json_decode($plan['payment_period'], true),
'allow_change_on_close' => $plan['allow_change_on_close'],
'interest_rate' => $plan['interest_rate'],
'comment' => $plan['comment'],
'house_installment_end_date' => $plan['house_installment_end_date'],
];
}
}
if ($has_token) {
if ($this->user->agencyId == 20382) {
$filter_by_status = "";
} else {
$filter_by_status = "AND cs.status IN ('available', 'reservation')";
}
} else {
$filter_by_status = "";
}
$sql = "SELECT
room.id,
room.number,
room.area,
room.kitchen_area,
room.total_amount,
room.installment_price,
room.rooms_count,
room.layout_feature,
room.decoration_id,
room.windows_placement_id,
room.payment_types,
room.type,
MIN(room.position) AS position,
MIN(cs.name) AS status_name,
MIN(cs.status) AS status_type,
MIN(cs.color) AS status_color,
MIN(c_house_p_i.url) AS plan_url,
MIN(floors.position) AS floor,
entrances.name AS entrance_name,
MIN(ch.name) AS house_name,
MIN(ch.parking) AS house_parking,
MIN(ch.security) AS house_security,
MIN(ch.fenced_area) AS house_fenced_area,
MIN(ch.sports_ground) AS sports_ground,
MIN(ch.play_ground) AS play_ground,
MIN(ch.school) AS school,
MIN(ch.kinder_garten) AS kinder_garten,
MIN(ch.id) AS house_id,
MIN(c_house_p.has_light_angle) AS has_light_angle,
MIN(c_house_p.light_angle) AS light_angle
FROM complex_rooms AS room
JOIN complex_rooms_plans rooms_plans ON rooms_plans.room_id = room.id
LEFT JOIN complex_house_plans_images c_house_p_i ON rooms_plans.plan_id = c_house_p_i.plan_id AND c_house_p_i.position = 1
LEFT JOIN complex_status cs ON room.complex_status_id = cs.id AND cs.is_archive = 0
JOIN complex_floors floors ON floors.id = room.floor_id
JOIN complex_entrances entrances ON entrances.id = floors.complex_entrance_id
JOIN complex_houses ch ON ch.id = entrances.complex_house_id
LEFT JOIN complex_house_plans c_house_p ON rooms_plans.plan_id = c_house_p.id
WHERE rooms_plans.plan_id = {$plan_id} {$filter_by_status}
GROUP BY room.id, entrances.name
ORDER BY MIN(room.position)";
$q = $this->db->query($sql);
while ($room = $this->db->fetch_assoc($q)) {
$reservations = $this->get_room_reservations($room['id']);
unset($reservations['can_change_queue']);
$complex_status_info = [
'status_name' => $room['status_name'],
'status_type' => $room['status_type'],
'status_color' => $room['status_color']
];
unset($room['status_name']);
unset($room['status_type']);
unset($room['status_color']);
if ($room['status_type'] != 'reservation' && is_array($reservations) && count($reservations))
{
$complex_status_info = [
'status_name' => $reservations[0]['status_name'],
'status_type' => $reservations[0]['status_type'],
'status_color' => $reservations[0]['status_color'],
];
}
$room['complex_status_info'] = $complex_status_info;
// Add installment_plans
$room['installment_plans'] = $installment_plans;
// Decode payment_types safely
if (!empty($room['payment_types'])) {
$decodedPaymentTypes = json_decode($room['payment_types'], true);
$room['payment_types'] = is_array($decodedPaymentTypes) ? $decodedPaymentTypes : [];
} else {
$room['payment_types'] = [];
}
if (in_array((string)$room['id'], $_SESSION['to_send_complexes'])) {
$room['inPdf'] = true;
}
$result[] = $room;
}
}
return $result;
}
public function get_windows_placements()
{
$result = array();
$sql = "SELECT * FROM complex_rooms_windows_placements";
$q = $this->db->query($sql);
while ($window = $this->db->fetch_assoc($q)) {
$result[] = $window;
}
return $result;
}
public function get_plans_images($plan_id)
{
$result = array();
if ($plan_id > 0) {
$sql = "SELECT * FROM complex_house_plans_images WHERE plan_id = {$plan_id} ORDER BY `position`";
$q = $this->db->query($sql);
while ($res = $this->db->fetch_assoc($q)) {
$result[] = $res;
}
}
return $result;
}
public function complex_delete($complex_id)
{
$this->deleteComplexFiles($complex_id);
$this->db->query("UPDATE complex_list SET deleted=1 WHERE id = {$complex_id}");
return array('result' => 'done', 'complex_id' => $complex_id);;
}
public function delete_house($house_id)
{
$house_id = (int)$house_id;
$sql = "UPDATE complex_houses SET deleted_at = NOW() WHERE id = {$house_id}";
$q = $this->db->query($sql);
return [
'status' => $q,
'message' => $q ? 'Дом перемещен в корзину' : 'Ошибка при удалении дома',
'house_id' => $house_id
];
}
public function deleteComplexFiles($complex_id)
{
$this->db->query('SET SESSION group_concat_max_len = 9999999;');
$sql = $this->db->query("SELECT
complex_list.id AS complex_id,
GROUP_CONCAT(complex_house_floor_plans.image SEPARATOR ',') AS floor_plan_images,
GROUP_CONCAT(complex_house_plans_images.url SEPARATOR ',') AS room_plan_images,
GROUP_CONCAT(complex_house_images.url SEPARATOR ',') AS house_images,
GROUP_CONCAT(complex_house_facades.image SEPARATOR ',') AS house_facade_images,
GROUP_CONCAT(complex_images.image SEPARATOR ',') AS complex_images,
GROUP_CONCAT(complex_house_UTP.photo SEPARATOR ',') AS house_utp_images,
GROUP_CONCAT(complex_house_decoration.photo SEPARATOR ',') AS house_dec_images,
GROUP_CONCAT(complex_house_decoration.photo2 SEPARATOR ',') AS house_dec_images2,
GROUP_CONCAT(complex_house_decoration.photo3 SEPARATOR ',') AS house_dec_images3,
GROUP_CONCAT(complex_house_decoration.photo4 SEPARATOR ',') AS house_dec_images4,
GROUP_CONCAT(complex_house_decoration.photo5 SEPARATOR ',') AS house_dec_images5,
GROUP_CONCAT(complex_actions.image SEPARATOR ',') AS complex_actions_images
FROM complex_list
LEFT JOIN complex_houses ON complex_houses.complex_id = complex_list.id
LEFT JOIN complex_entrances ON complex_entrances.complex_house_id = complex_houses.id
LEFT JOIN complex_floors ON complex_floors.complex_entrance_id = complex_entrances.id
LEFT JOIN complex_floors_plans ON complex_floors_plans.floor_id = complex_floors.id
LEFT JOIN complex_house_floor_plans ON complex_house_floor_plans.id = complex_floors_plans.floor_plan_id
LEFT JOIN complex_rooms ON complex_rooms.floor_id = complex_floors.id
LEFT JOIN complex_rooms_plans ON complex_rooms_plans.room_id = complex_rooms.id
LEFT JOIN complex_house_plans_images ON complex_house_plans_images.plan_id = complex_rooms_plans.plan_id
LEFT JOIN complex_house_images ON complex_house_images.house_id = complex_houses.id
LEFT JOIN complex_house_facades ON complex_house_facades.house_id = complex_houses.id
LEFT JOIN complex_images ON complex_images.complex_id = complex_list.id
LEFT JOIN complex_house_UTP ON complex_house_UTP.house_id = complex_houses.id
LEFT JOIN complex_house_decoration ON complex_house_decoration.house_id = complex_houses.id
LEFT JOIN complex_actions ON complex_actions.complex_id = complex_list.id
WHERE complex_list.id = {$complex_id}
GROUP BY complex_list.id;");
$urls = [];
while ($row = $this->db->fetch_assoc($sql)) {
$mergedArray = array_merge(
explode(',', $row['floor_plan_images']),
explode(',', $row['room_plan_images']),
explode(',', $row['house_images']),
explode(',', $row['house_facade_images']),
explode(',', $row['complex_images']),
explode(',', $row['house_utp_images']),
explode(',', $row['house_dec_images']),
explode(',', $row['house_dec_images2']),
explode(',', $row['house_dec_images3']),
explode(',', $row['house_dec_images4']),
explode(',', $row['house_dec_images5']),
explode(',', $row['complex_actions_images'])
);
$mergedArray = array_filter($mergedArray);
$urls = array_merge(
$mergedArray,
$urls
);
};
$this->deleteFiles($urls);
}
public function deleteHouseFiles($house_id)
{
$this->db->query('SET SESSION group_concat_max_len = 9999999;');
$sql = $this->db->query("SELECT
complex_houses.id AS complex_house_id,
GROUP_CONCAT(complex_house_floor_plans.image SEPARATOR ',') AS floor_plan_images,
GROUP_CONCAT(complex_house_plans_images.url SEPARATOR ',') AS room_plan_images,
GROUP_CONCAT(complex_house_images.url SEPARATOR ',') AS house_images,
GROUP_CONCAT(complex_house_facades.image SEPARATOR ',') AS house_facade_images,
GROUP_CONCAT(complex_house_UTP.photo SEPARATOR ',') AS house_utp_images,
GROUP_CONCAT(complex_house_decoration.photo SEPARATOR ',') AS house_dec_images,
GROUP_CONCAT(complex_house_decoration.photo2 SEPARATOR ',') AS house_dec_images2,
GROUP_CONCAT(complex_house_decoration.photo3 SEPARATOR ',') AS house_dec_images3,
GROUP_CONCAT(complex_house_decoration.photo4 SEPARATOR ',') AS house_dec_images4,
GROUP_CONCAT(complex_house_decoration.photo5 SEPARATOR ',') AS house_dec_images5
FROM complex_houses
LEFT JOIN complex_entrances ON complex_entrances.complex_house_id = complex_houses.id
LEFT JOIN complex_floors ON complex_floors.complex_entrance_id = complex_entrances.id
LEFT JOIN complex_floors_plans ON complex_floors_plans.floor_id = complex_floors.id
LEFT JOIN complex_house_floor_plans ON complex_house_floor_plans.id = complex_floors_plans.floor_plan_id
LEFT JOIN complex_rooms ON complex_rooms.floor_id = complex_floors.id
LEFT JOIN complex_rooms_plans ON complex_rooms_plans.room_id = complex_rooms.id
LEFT JOIN complex_house_plans_images ON complex_house_plans_images.plan_id = complex_rooms_plans.plan_id
LEFT JOIN complex_house_images ON complex_house_images.house_id = complex_houses.id
LEFT JOIN complex_house_facades ON complex_house_facades.house_id = complex_houses.id
LEFT JOIN complex_house_UTP ON complex_house_UTP.house_id = complex_houses.id
LEFT JOIN complex_house_decoration ON complex_house_decoration.house_id = complex_houses.id
WHERE complex_houses.id = {$house_id}
GROUP BY
complex_entrances.id;");
$urls = [];
while ($row = $this->db->fetch_assoc($sql)) {
$mergedArray = array_merge(
explode(',', $row['floor_plan_images']),
explode(',', $row['room_plan_images']),
explode(',', $row['house_images']),
explode(',', $row['house_facade_images']),
explode(',', $row['house_utp_images']),
explode(',', $row['house_dec_images2']),
explode(',', $row['house_dec_images3']),
explode(',', $row['house_dec_images4']),
explode(',', $row['house_dec_images5'])
);
$mergedArray = array_filter($mergedArray);
$urls = array_merge(
$mergedArray,
$urls
);
};
$this->deleteFiles($urls);
}
public function deleteEntranceFiles($entrance_id)
{
$this->db->query('SET SESSION group_concat_max_len = 9999999;');
$sql = $this->db->query("SELECT
complex_entrances.id AS entrance_id,
GROUP_CONCAT(complex_house_floor_plans.image SEPARATOR ',') AS floor_plan_images,
GROUP_CONCAT(complex_house_plans_images.url SEPARATOR ',') AS room_plan_images
FROM complex_entrances
LEFT JOIN complex_floors ON complex_floors.complex_entrance_id = complex_entrances.id
LEFT JOIN complex_floors_plans ON complex_floors_plans.floor_id = complex_floors.id
LEFT JOIN complex_house_floor_plans ON complex_house_floor_plans.id = complex_floors_plans.floor_plan_id
LEFT JOIN complex_rooms ON complex_rooms.floor_id = complex_floors.id
LEFT JOIN complex_rooms_plans ON complex_rooms_plans.room_id = complex_rooms.id
LEFT JOIN complex_house_plans_images ON complex_house_plans_images.plan_id = complex_rooms_plans.plan_id
WHERE complex_entrances.id = {$entrance_id}
GROUP BY
complex_entrances.id;");
$urls = [];
while ($row = $this->db->fetch_assoc($sql)) {
$mergedArray = array_merge(
explode(',', $row['floor_plan_images']),
explode(',', $row['room_plan_images'])
);
$mergedArray = array_filter($mergedArray);
$urls = array_merge(
$mergedArray,
$urls
);
};
$this->deleteFiles($urls);
}
public function deleteFloorFiles($floor_id)
{
$this->db->query('SET SESSION group_concat_max_len = 9999999;');
$sql = $this->db->query(
"SELECT
complex_floors.id AS floor_id,
GROUP_CONCAT(complex_house_floor_plans.image SEPARATOR ',') AS floor_plan_images,
GROUP_CONCAT(complex_house_plans_images.url SEPARATOR ',') AS room_plan_images
FROM complex_floors
LEFT JOIN complex_floors_plans ON complex_floors_plans.floor_id = complex_floors.id
LEFT JOIN complex_house_floor_plans ON complex_house_floor_plans.id = complex_floors_plans.floor_plan_id
LEFT JOIN complex_rooms ON complex_rooms.floor_id = complex_floors.id
LEFT JOIN complex_rooms_plans ON complex_rooms_plans.room_id = complex_rooms.id
LEFT JOIN complex_house_plans_images ON complex_house_plans_images.plan_id = complex_rooms_plans.plan_id
WHERE complex_floors.id = {$floor_id}
GROUP BY complex_floors.id;"
);
$urls = [];
while ($row = $this->db->fetch_assoc($sql)) {
$mergedArray = array_merge(
explode(',', $row['floor_plan_images']),
explode(',', $row['room_plan_images'])
);
$mergedArray = array_filter($mergedArray);
$urls = array_merge(
$mergedArray,
$urls
);
};
$this->deleteFiles($urls);
}
public function delete_house_entrance($entrance_id)
{
$this->set_user();
$this->deleteEntranceFiles($entrance_id);
$sql = "DELETE FROM complex_entrances WHERE id={$entrance_id}";
$q = $this->db->query($sql);
return ['status' => $q];
}
// TODO FIX DELETE ENTRIES WHILE DELETING THEIR PARENTS
public function delete_floor($floor_id)
{
$this->set_user();
$this->deleteFloorFiles($floor_id);
$sql = "DELETE FROM complex_floors WHERE id={$floor_id}";
$q = $this->db->query($sql);
// $sql = "DELETE FROM complex_rooms WHERE floor_id={$floor_id}";
// $q_ = $this->db->query($sql);
return ['status' => $q];
}
public function delete_room($room_id)
{
$this->set_user();
$sql = "DELETE FROM complex_room_notes WHERE room_id={$room_id}";
$this->db->query($sql);
$sql = "DELETE FROM complex_rooms_plans WHERE room_id={$room_id}";
$this->db->query($sql);
$sql = "DELETE FROM complex_rooms WHERE id={$room_id}";
$q = $this->db->query($sql);
return ['status' => $q];
}
public function deleteFiles(array $urls)
{
if (empty($urls)) {
return false;
}
$urls = array_map(function ($url) {
return "('$url')";
}, $urls);
$urls = implode(',', $urls);
$sql = "INSERT INTO job_delete_files (`url`) VALUES {$urls}";
$this->db->query($sql);
return true;
// $Selectel = SelectelApi::getTokenAndUrl();
// $api = new SelectelApi();
// $token = $Selectel[0];
// $storageUrl = $Selectel[1];
// foreach ($urls as $url) {
// $parsed_url = parse_url($url);
// if (isset($parsed_url['path'])) {
// $api->deleteFile($storageUrl, $token, $parsed_url['path']);
// }
// }
}
public function deleteComplexPhoto($photo_id)
{
$r = $this->db->query("SELECT `image` FROM complex_images WHERE id = {$photo_id}");
$row = $this->db->fetch_assoc($r);
$this->deleteFiles([$row['image']]);
$this->db->query("DELETE FROM complex_images WHERE id = {$photo_id}", true);
return ['status' => true];
}
public function deleteHousePhoto($photo_id)
{
$r = $this->db->query("SELECT `url` FROM complex_house_images WHERE id = {$photo_id}");
$row = $this->db->fetch_assoc($r);
$this->deleteFiles([$row['url']]);
$this->db->query("DELETE FROM complex_house_images WHERE id = {$photo_id}", true);
return ['status' => true];
}
public function deleteHouseFacede($facade_id)
{
$r = $this->db->query("SELECT `image` FROM complex_house_facades WHERE id = {$facade_id}");
$row = $this->db->fetch_assoc($r);
$this->deleteFiles([$row['image']]);
$q = $this->db->query("DELETE FROM complex_facade_figures WHERE facade_id = {$facade_id}"); // TODO
$q = $this->db->query("DELETE FROM complex_house_facades WHERE `id` = {$facade_id}");
return ['status' => true];
}
public function deleteFacedeFigure($figure_id)
{
$q = $this->db->query("DELETE FROM complex_facade_figures WHERE id = {$figure_id}"); // TODO
return ['status' => true, 'sql' => $q];
}
public function deletePhotoFloorPlan($floor_plan_id)
{
$sql = "SELECT `image` FROM complex_house_floor_plans WHERE id = {$floor_plan_id}";
$r = $this->db->query($sql);
$row = $this->db->fetch_assoc($r);
$this->deleteFiles([$row['image']]);
}
public function delete_floor_plan_figure($figure_id)
{
$q = $this->db->query("DELETE FROM complex_floor_plan_figures WHERE id = {$figure_id}"); // TODO
return ['status' => true];
}
public function delete_floor_plan($floor_plan_id)
{
$q = $this->db->query("DELETE FROM complex_house_floor_plans WHERE id = {$floor_plan_id}"); // TODO
$q = $this->db->query("DELETE FROM complex_floor_plan_figures WHERE floor_plan_id = {$floor_plan_id}"); // TODO
$q = $this->db->query("DELETE FROM complex_floors_plans WHERE floor_plan_id = {$floor_plan_id}"); // TODO
return ['status' => true];
}
public function deleteHousePlans($plan_ids)
{
$plan_ids_str = implode(', ', $plan_ids);
$filesToDelete = array();
// die("SELECT `url` FROM complex_house_plans_images where plan_id in ({$plan_ids_str})");
$r = $this->db->query("SELECT `url` FROM complex_house_plans_images where plan_id in ({$plan_ids_str})");
while ($res = $this->db->fetch_assoc($r)) {
$filesToDelete[] = $res['url'];
}
$this->deleteFiles($filesToDelete);
$plans_sql = "DELETE FROM complex_house_plans where id in ({$plan_ids_str})";
$images_sql = "DELETE FROM complex_house_plans_images where plan_id in ({$plan_ids_str})";
$room_plans_sql = "DELETE FROM complex_rooms_plans where plan_id in ({$plan_ids_str})";
$figures_sql = "UPDATE complex_floor_plan_figures SET room_plan_id = NULL WHERE room_plan_id in ($plan_ids_str)";
$this->db->query($figures_sql);
$this->db->query($plans_sql);
$this->db->query($images_sql);
$this->db->query($room_plans_sql);
return $plan_ids;
}
public function deletePhotoFromRoomPlan($photo_id)
{
$res = $this->db->query("SELECT `url` FROM complex_house_plans_images where id = {$photo_id}");
$photo = $this->db->fetch_assoc($res);
$sql = "DELETE FROM complex_house_plans_images where id = {$photo_id}";
$r = $this->db->query($sql);
$this->deleteFiles([$photo['url']]);
return ['success' => true];
}
protected function parseCsv($input)
{
$possibleSeparators = [',', ';', "\t", '|'];
$separatorCounts = [];
$for_first_line = fopen('php://memory', 'rw');
fwrite($for_first_line, $input);
fseek($for_first_line, 0);
$firstLine = fgets($for_first_line);
fclose($for_first_line);
$temp = fopen('php://memory', 'rw');
fwrite($temp, $input);
fseek($temp, 0);
$res = array();
foreach ($possibleSeparators as $separator) {
$columns = str_getcsv($firstLine, $separator);
$separatorCounts[$separator] = count($columns);
}
$mostLikelySeparator = array_search(max($separatorCounts), $separatorCounts);
while (($data = fgetcsv($temp, null, $mostLikelySeparator)) !== false) {
$res[] = $data;
}
fclose($temp);
return $res;
}
protected function endsWith($haystack, $needle) {
$length = strlen($needle);
return $length > 0 ? substr($haystack, -$length) === $needle : true;
}
public function createRequisition($room_id = null, $requisition, $partner_id, $employee_id){
$this->set_user();
$this->set_users_ids();
$phone = $requisition->phone;
$fio_client = $requisition->fio;
$opis = $requisition->description;
$partners = new Partners($this->user->agencyId);
$partner = $partners->getPartner($partner_id);
$user_id = $user_id_client = $this->user->id;
$confirm = 1;
$confirm_client = 1;
$who_work = (int)$partner['who_work_req'];
$who_work_client = (int)$partner['who_work_client'];
$funnel_id = (int)$partner['funnel_id_req'];
$funnel_id_client = (int)$partner['funnel_id_client'];
if($who_work == 0) {
$confirm = 0;
} else {
$user_id = $who_work;
}
if($who_work_client == 0){
$confirm_client = 0;
} else {
$user_id_client = $who_work_client;
}
$sql = "SELECT `id`, `stage`, `deleted`, `fio` FROM `clients` WHERE cancel=0 AND (phone = '$phone' OR id in (SELECT client_id FROM clients_phone2 WHERE phone = '$phone')) and (id_agent in (".implode(',', $this->userIds).") or who_work in (".implode(',', $this->userIds)."))";
$client = $this->db->fetch_assoc($this->db->query($sql));
if(!empty($client) && $client){
$client_id = (int)$client['id'];
//$fio_client = $client['fio'];
} else {
$sql = "INSERT INTO clients SET phone='{$phone}', fio='{$fio_client}', opis='{$opis}', employee_id='{$employee_id}', id_agent={$user_id_client}, who_work={$who_work_client}, date_add=NOW(), confirm={$confirm_client}, funnel_id={$funnel_id_client}, stage=1, integration=10";
$this->db->query($sql);
$client_id = $this->db->insert_id();
if($funnel_id_client > 0){
$Clients = new Clients();
$Clients->get_class_etap($client_id, $funnel_id_client);
}
}
$type_id = 1;
$name = $fio_client;
$sql = "SELECT name FROM requisitions_type WHERE id = {$type_id}";
$q = $this->db->query($sql);
$r = $this->db->fetch_assoc($q);
$name = $r['name'].' для '.$fio_client;
if($client_id > 0){
$sql = "INSERT INTO requisitions SET
client_id={$client_id},
name='{$name}',
description='{$opis}',
user_id={$user_id},
who_work={$who_work},
type_id={$type_id},
confirm={$confirm},
funnel_id={$funnel_id},
stage=1,
employee_id = {$employee_id}
";
if ($room_id !== 0) {
$sql .= ", complex_room_id = {$room_id}";
}
$this->db->query($sql);
$req_id = $this->db->insert_id();
if($funnel_id > 0){
$Requisitions = new Requisitions();
$Requisitions->get_class_etap($req_id, $funnel_id);
}
}
}
public function get_filter_fields($house_id = null, $complex_id = null)
{
$where = "";
if (!empty($house_id)) {
$house_id = (int)$house_id;
$where = "complex_houses.`id` = {$house_id}";
} elseif (!empty($complex_id)) {
$complex_id = (int)$complex_id;
$where = "complex_houses.`complex_id` = {$complex_id}";
} else {
return [
'total' => (object)['min' => null, 'max' => null],
'area' => (object)['min' => null, 'max' => null],
'kitchen_area' => (object)['min' => null, 'max' => null],
'room_types' => [],
'decoration_types' => [],
'window_placements' => [],
'payment_types' => [],
];
}
$sql = "SELECT
JSON_OBJECT(
'min', MIN(c_rooms.total_amount),
'max', MAX(c_rooms.total_amount)
) AS total,
JSON_OBJECT(
'min', MIN(c_rooms.area),
'max', MAX(c_rooms.area)
) AS area,
JSON_OBJECT(
'min', MIN(c_rooms.kitchen_area),
'max', MAX(c_rooms.kitchen_area)
) AS kitchen_area,
GROUP_CONCAT(DISTINCT c_rooms.type SEPARATOR ',') AS room_types,
GROUP_CONCAT(DISTINCT c_r_w_p.id SEPARATOR ',') AS window_placements,
GROUP_CONCAT(DISTINCT d_types.id SEPARATOR ',') AS decoration_types,
GROUP_CONCAT(DISTINCT apt.code SEPARATOR ',') AS payment_types
FROM
complex_houses
LEFT JOIN
complex_entrances AS c_entrances ON c_entrances.complex_house_id = complex_houses.id
LEFT JOIN
complex_floors AS c_floors ON c_floors.complex_entrance_id = c_entrances.id
LEFT JOIN
complex_house_facades AS facades ON facades.house_id = complex_houses.id AND facades.is_published != 0
LEFT JOIN
complex_facade_figures AS figures ON figures.facade_id = facades.id
LEFT JOIN
complex_floors_plans AS c_floor_plans ON c_floor_plans.floor_id = c_floors.id
LEFT JOIN
complex_rooms AS c_rooms ON c_rooms.floor_id = c_floors.id
LEFT JOIN
complex_rooms_plans AS c_rooms_plans ON c_rooms_plans.room_id = c_rooms.id
LEFT JOIN
complex_status AS cs ON cs.id = c_rooms.complex_status_id
LEFT JOIN
complex_rooms_windows_placements AS c_r_w_p ON c_r_w_p.id = c_rooms.windows_placement_id
LEFT JOIN
decoration_types AS d_types ON d_types.id = c_rooms.decoration_id
LEFT JOIN
apartment_payment_types AS apt ON JSON_CONTAINS(c_rooms.payment_types, JSON_QUOTE(apt.code))
WHERE
{$where}
AND (cs.status = 'available' OR cs.status = 'reservation')
AND c_rooms.id IS NOT NULL";
$q = $this->db->query($sql);
$fields = $this->db->fetch_assoc($q);
// Convert JSON strings to PHP objects
$fields['total'] = json_decode($fields['total']);
$fields['area'] = json_decode($fields['area']);
$fields['kitchen_area'] = json_decode($fields['kitchen_area']);
// Process other fields safely
$fields['room_types'] = !empty($fields['room_types']) ? explode(',', $fields['room_types']) : [];
$fields['decoration_types'] = !empty($fields['decoration_types']) ? array_map('intval', explode(',', $fields['decoration_types'])) : [];
$fields['window_placements'] = !empty($fields['window_placements']) ? array_map('intval', explode(',', $fields['window_placements'])) : [];
$fields['payment_types'] = !empty($fields['payment_types']) ? array_filter(explode(',', $fields['payment_types'])) : [];
return $fields;
}
public function get_frame_access($token) {
$sql = "SELECT * FROM complexes_frame cf WHERE cf.token = '$token' AND cf.end_date >= NOW()";
$query = $this->db->query($sql);
$result = $this->db->fetch_assoc($query);
if ($result) {
return [
'access' => true,
'agency_id' => $result['agency_id'],
];
} else {
return ['access' => 'denied'];
}
}
public function get_frame_colors($token) {
$sql = "SELECT cf.frame_color, cf.color_reserved, cf.color_free FROM complexes_frame cf WHERE cf.token = '$token'";
$query = $this->db->query($sql);
$colors = $this->db->fetch_assoc($query);
return $colors;
}
public function create_frame_requisition($data) {
$token = $data['token'];
$full_name = $data['full_name'];
$phone_number = $data['phone_number'];
$sql = "SELECT cf.agency_id, cf.client_funnel_id, cf.req_funnel_id FROM complexes_frame cf WHERE cf.token = '$token'";
$query = $this->db->query($sql);
$funnels = $this->db->fetch_assoc($query);
$agency_id = $funnels['agency_id'];
$client_funnel_id = $funnels['client_funnel_id'];
$requisition_funnel_id = $funnels['req_funnel_id'];
$confirm = 1;
$complex_name = $data['complex_name'];
$house_name = $data['house_name'];
$entrance_name = $data['entrance_name'];
$room_id = $data['room_number'];
$description = "Заявка с каталога комплексов по объекту в {$complex_name}, {$house_name}, {$entrance_name}, № кв {$room_id}";
// Добавляем клиента
$client_sql = "INSERT INTO clients (`fio`, `phone`, `opis`, `id_agent`, `date_add`, `who_work`, `confirm`, `funnel_id`)
VALUES ('$full_name', '$phone_number', '$description', '$agency_id', NOW(), '$agency_id', '$confirm', '$client_funnel_id' )";
$this->db->query($client_sql);
$new_client_id = $this->db->insert_id();
// Добавляем заявку
$requisition_sql = "INSERT INTO requisitions (`name`, `user_id`, `client_id`, `who_work`, `type_id`, `description`, `stage`, `funnel_id`)
VALUES ('Подбор объекта для $full_name', '$agency_id', '$new_client_id', '$agency_id', 1, '$description', 1, '$requisition_funnel_id')";
$this->db->query($requisition_sql);
}
public function getComplexNamesForIframe($use_empty_rooms = false, $page = 1)
{
$limit = 10;
$offset = ($page - 1) * $limit;
$result = array();
$this->set_user();
$this->set_users_ids();
// Формируем SQL-запрос
if ($use_empty_rooms) {
$sql = "SELECT id, `name`
FROM complex_list
WHERE agency_id={$this->user->agencyId}
AND complex_list.arhive = 0
AND complex_list.deleted = 0";
} else {
$sql = "SELECT complex_list.id, complex_list.name
FROM complex_list
LEFT JOIN complex_houses ON complex_houses.complex_id = complex_list.id
LEFT JOIN complex_entrances complex_entrances ON complex_entrances.complex_house_id = complex_houses.id
LEFT JOIN complex_floors complex_floors ON complex_floors.complex_entrance_id = complex_entrances.id
LEFT JOIN complex_rooms complex_rooms ON complex_rooms.floor_id = complex_floors.id
WHERE complex_list.agency_id={$this->user->agencyId}
AND complex_list.arhive = 0
AND complex_list.deleted = 0
AND complex_houses.id IS NOT NULL
AND complex_rooms.id IS NOT NULL
GROUP BY complex_list.id
HAVING COUNT(complex_houses.id) > 0 AND COUNT(complex_rooms.id) > 0";
}
// Для подсчёта общего количества записей
$count_sql = "SELECT COUNT(*) as count FROM ($sql) AS subquery";
// Добавляем LIMIT и OFFSET для основного запроса
$sql .= " ORDER BY id DESC LIMIT {$limit} OFFSET {$offset}";
// Выполняем основной запрос
$query = $this->db->query($sql);
while ($row = $this->db->fetch_assoc($query)) {
$result[] = $row;
}
// Выполняем запрос на подсчёт общего числа записей
$count_query = $this->db->query($count_sql);
$count_row = $this->db->fetch_assoc($count_query);
$total = (int)$count_row['count'];
$allPages = ceil($total / $limit);
return [
'list' => $result,
'total' => $total,
'allPages' => $allPages
];
}
public function searchForIframe($filter, $use_empty_rooms = false)
{
$whereComplex = '';
$whereRoom = '';
$whereAddress = '';
$whereHouse = '';
$whereFloor = '';
$priceFilterKey = ' complex_rooms.total_amount ';
$havingComplex = "";
if (!$use_empty_rooms) {
$havingComplex .= " HAVING COUNT(complex_houses.id) > 0 AND COUNT(complex_rooms.id) > 0";
$whereComplex .= " AND complex_houses.id IS NOT NULL AND complex_rooms.id IS NOT NULL ";
// $whereHouse .= " AND COUNT(complex_rooms.id) > 0 ";
}
if ($filter) {
if (!empty($filter->selectedDecorations)) {
$whereRoom .= " AND complex_rooms.decoration_id in (" . implode(',', $filter->selectedDecorations) . ") ";
}
if (!empty($filter->selectedTypes)) {
$whereRoom .= " AND complex_rooms.type in ('" . implode('\',\'', $filter->selectedTypes) . "') ";
}
if (!empty($filter->rooms)) {
$isMoreThenFive = in_array('5-more', $filter->rooms);
$isSelectedStudio = in_array('studio', $filter->rooms);
$filteredArray = array_filter($filter->rooms, function ($element) {
return !in_array($element, ["5-more", "studio"]);
});
if ($isSelectedStudio) {
$whereRoom .= " AND complex_rooms.layout_feature = 'studio' ";
}
if (count($filteredArray)) {
if ($isMoreThenFive) {
$whereRoom .= " AND (complex_rooms.rooms_count >= 5 OR complex_rooms.rooms_count IN (" . implode(',', $filteredArray) . "))";
} else {
$whereRoom .= " AND complex_rooms.rooms_count IN (" . implode(',', $filteredArray) . ")";
}
} else if ($isMoreThenFive) {
$whereRoom .= " AND complex_rooms.rooms_count >= 5 ";
}
}
if (!empty($filter->rayons)) {
$whereComplex .= " AND (";
foreach ($filter->rayons as $index => $rayon) {
$whereComplex .= " complex_address.rayon LIKE '%{$rayon}%'";
if (isset($filter->rayons[$index + 1])) {
$whereComplex .= " OR ";
}
}
$whereComplex .= " ) ";
// var_dump($whereAddress);die;
}
if (!empty($filter->selectedMetros)) {
$whereComplex .= " AND complex_metro.metro_id in (" . implode(',', $filter->selectedMetros) . ")";
}
if (!empty($filter->complexes)) {
$whereComplex .= " AND complex_list.id in (" . implode(',', $filter->complexes) . ")";
}
if (!empty($filter->address)) {
$whereComplex .= " AND complex_address.address like '%{$filter->address}%'";
}
if (!empty($filter->squareKitchen_min)) {
$whereRoom .= " AND complex_rooms.kitchen_area >= {$filter->squareKitchen_min}";
}
if (!empty($filter->squareKitchen_max)) {
$whereRoom .= " AND complex_rooms.kitchen_area <= {$filter->squareKitchen_max}";
}
if (!empty($filter->area_from)) {
$whereRoom .= " AND complex_rooms.area >= {$filter->area_from}";
}
if (!empty($filter->area_to)) {
$whereRoom .= " AND complex_rooms.area <= {$filter->area_to}";
}
if (filter_var($filter->useSquarePrice, FILTER_VALIDATE_BOOLEAN)) {
$priceFilterKey = " complex_rooms.total_amount / complex_rooms.area ";
}
if (!empty($filter->price_from)) {
$whereRoom .= " AND {$priceFilterKey} >= {$filter->price_from}";
}
if (!empty($filter->price_to)) {
$whereRoom .= " AND {$priceFilterKey} <= {$filter->price_to}";
}
if (!empty($filter->floor_from)) {
$whereFloor .= " AND complex_floors.position >= {$filter->floor_from}";
}
if (!empty($filter->floor_to)) {
$whereFloor .= " AND complex_floors.position <= {$filter->floor_to}";
}
if (!empty($filter->selectedComplexTypes)) {
$whereComplex .= " AND complex_list.type in ('" . implode('\',\'', $filter->selectedComplexTypes) . "')";
}
if (!empty($filter->period)) {
if ($filter->period == 'completed') {
$currentMonth = date('n');
$currentYear = date('Y');
$currentQuarter = ceil($currentMonth / 3);
$whereHouse .= " AND complex_houses.deadline_quarter <= $currentQuarter AND complex_houses.deadline_year <= $currentYear ";
} else {
list($year, $quarter) = explode('Q', $filter->period);
$whereHouse .= " AND complex_houses.deadline_quarter = $quarter AND complex_houses.deadline_year = $year ";
}
}
if(!empty($filter->is_partner_show)){
$whereHouse .= " AND complex_houses.is_partner_show = 1 ";
}
// if (!empty($filter->is_archive)) {
// $whereComplex .= " AND complex_list.arhive = 1 ";
// } else {
// $whereComplex .= " AND complex_list.arhive = 0 ";
// }
// Фильтрация по способам оплаты
if (!empty($filter->selectedPaymentTypes)) {
$conditions = [];
foreach ($filter->selectedPaymentTypes as $pt) {
$conditions[] = "complex_rooms.payment_types LIKE '%\"{$pt}\"%'";
}
if (!empty($conditions)) {
$whereRoom .= " AND (" . implode(' OR ', $conditions) . ")";
}
// Installment-specific filtering
if (in_array('INSTALLMENT', $filter->selectedPaymentTypes)) {
$whereRoom .= " AND EXISTS (
SELECT 1
FROM complex_house_installments chi
JOIN complex_entrances ce ON ce.complex_house_id = chi.house_id
JOIN complex_floors cf ON cf.complex_entrance_id = ce.id
JOIN installments i ON i.id = chi.installment_id
WHERE cf.id = complex_rooms.floor_id
AND i.is_archive = 0"
. (!empty($filter->selectedInstallments)
? " AND chi.installment_id IN (" . implode(',', $filter->selectedInstallments) . ")"
: "")
. ((isset($filter->initialPayment) && is_numeric($filter->initialPayment))
? " AND complex_rooms.installment_price IS NOT NULL AND complex_rooms.installment_price > 0 AND ((i.initial_payment / 100.0) * complex_rooms.installment_price) <= " . (float)$filter->initialPayment
: "")
. ((isset($filter->paymentTerm) && is_numeric($filter->paymentTerm))
? " AND (DATEDIFF(chi.end_date, CURDATE()) / 30.44) >= " . (float)$filter->paymentTerm
: "")
. ((isset($filter->installmentPrice->min) && is_numeric($filter->installmentPrice->min))
? " AND complex_rooms.installment_price >= " . (float)$filter->installmentPrice->min
: "")
. ((isset($filter->installmentPrice->max) && is_numeric($filter->installmentPrice->max))
? " AND complex_rooms.installment_price <= " . (float)$filter->installmentPrice->max
: "")
. ")";
}
}
}
$whereComplex .= " AND complex_list.arhive = 0 ";
$this->limit = 10;
$limitSqlComolex = " limit {$this->limit}";
$this->set_user();
$this->set_users_ids();
if ($this->page > 0) {
$limitSqlComolex = ' limit ' . ($this->page - 1) * $this->limit . ', ' . $this->limit;
}
if ($this->user->agencyId == 20382) {
$filter_by_status = "";
} else {
$filter_by_status = "AND cs.status IN ('available', 'reservation')";
}
// var_dump($limitSqlComolex);die;
$result = array();
$sql_total = "SELECT count(DISTINCT complex_list.id) as total, count( DISTINCT complex_houses.id) as houses_total, COUNT(DISTINCT complex_rooms.id) as total_rooms FROM complex_list
LEFT JOIN complex_houses ON complex_houses.complex_id = complex_list.id AND (complex_houses.deleted_at IS NULL OR complex_houses.deleted_at = '0000-00-00 00:00:00') {$whereHouse}
LEFT JOIN complex_metro ON complex_metro.complex_id = complex_list.id
LEFT JOIN complex_address ON complex_address.complex_id = complex_list.id
LEFT JOIN complex_entrances complex_entrances ON complex_entrances.complex_house_id = complex_houses.id
LEFT JOIN complex_floors complex_floors ON complex_floors.complex_entrance_id = complex_entrances.id {$whereFloor}
LEFT JOIN complex_rooms complex_rooms ON complex_rooms.floor_id = complex_floors.id {$whereRoom}
LEFT JOIN complex_status cs ON complex_rooms.complex_status_id = cs.id AND cs.is_archive = 0
WHERE complex_list.agency_id={$this->user->agencyId}
AND complex_list.deleted = 0
{$filter_by_status}
{$whereComplex}
{$havingComplex}
ORDER BY complex_list.id DESC
";
$q_total = $this->db->query($sql_total);
$result['total'] = (int)$this->db->fetch_assoc($q_total)['total'];
$sql = "SELECT complex_list.*, count( DISTINCT complex_houses.id) as houses_total, COUNT(DISTINCT complex_rooms.id) as total_rooms, MIN(complex_rooms.total_amount) AS min_total_amount FROM complex_list
LEFT JOIN complex_houses ON complex_houses.complex_id = complex_list.id AND (complex_houses.deleted_at IS NULL OR complex_houses.deleted_at = '0000-00-00 00:00:00') {$whereHouse}
LEFT JOIN complex_metro ON complex_metro.complex_id = complex_list.id
LEFT JOIN complex_address ON complex_address.complex_id = complex_list.id
LEFT JOIN complex_entrances complex_entrances ON complex_entrances.complex_house_id = complex_houses.id
LEFT JOIN complex_floors complex_floors ON complex_floors.complex_entrance_id = complex_entrances.id {$whereFloor}
LEFT JOIN complex_rooms complex_rooms ON complex_rooms.floor_id = complex_floors.id {$whereRoom}
LEFT JOIN complex_status cs ON complex_rooms.complex_status_id = cs.id AND cs.is_archive = 0
WHERE complex_list.agency_id={$this->user->agencyId}
AND complex_list.deleted = 0
{$filter_by_status}
{$whereComplex}
GROUP BY complex_list.id
{$havingComplex}
ORDER BY complex_list.id DESC {$limitSqlComolex}
";
$q = $this->db->query($sql);
// , MIN(complex_rooms.total_amount) AS min_total_amount
// echo '<pre>';
// print_r($q->queryString);
// echo '</pre>';
// die();
// var_dump($q);die;
// $result['total'] = $this->db->num_rows($q);
// var_dump('test');die;
$result['allPages'] = ceil($result['total'] / $this->limit);
$result['agency_name'] = $this->user->agencyName;
$result['agency_logo'] = $this->user->photo;
$result['agency_phone'] = $this->user->agencyPhone;
// var_dump($result['agency_phone']);die;
// var_dump($this->user);die;
// var_dump($result);die;
while ($r = $this->db->fetch_assoc($q)) {
$result['list']['complex_' . $r['id']] = $this->get_complex_one($r['id'], true, false);
$result['list']['complex_' . $r['id']]['houses_total'] = $r['houses_total'];
$result['list']['complex_' . $r['id']]['total_rooms'] = $r['total_rooms'];
$result['list']['complex_' . $r['id']]['min_total_amount'] = $r['min_total_amount'];
// var_dump($r);die;
}
$result['debug']['sql'] = $q;
// var_dump($result);die;
return $result;
}
private function generateUniqueColor($house_id)
{
$colors = [
'#F44336', // red
'#E91E63', // pink
'#9C27B0', // purple
'#673AB7',
'#3F51B5',
'#2196F3',
'#03A9F4',
'#00BCD4',
'#009688',
'#4CAF50',
'#8BC34A',
'#CDDC39',
'#FFC107',
'#FF9800',
'#FF5722'
];
// get used colors
$sql = "SELECT color FROM complex_house_media_set WHERE complex_house_id = {$house_id}";
$q = $this->db->query($sql);
$used = [];
while ($row = $this->db->fetch_assoc($q)) {
$used[] = $row['color'];
}
// find unused
foreach ($colors as $color) {
if (!in_array($color, $used)) {
return $color;
}
}
// fallback → random color
return sprintf('#%06X', mt_rand(0, 0xFFFFFF));
}
public function findUser($sessionId)
{
$userSql = "SELECT id, agency, users_admin, role_developer FROM users where id={$sessionId}";
$query = $this->db->query($userSql);
return $this->db->fetch_assoc($query);
}
public function getMediaThumbnails(array $mediaIds)
{
if (empty($mediaIds)) {
return [];
}
// Sanitize IDs (ensure integers)
$mediaIds = array_map('intval', $mediaIds);
$idsList = implode(',', $mediaIds);
$sql = "SELECT id, thumbnail_path
FROM complex_house_media
WHERE id IN ($idsList)";
$query = $this->db->query($sql);
$results = [];
while ($row = $this->db->fetch_assoc($query)) {
$results[] = [
'id' => $row['id'],
'thumbnail' => !empty($row['thumbnail_path'])
? 'https://data.joywork.ru' . $row['thumbnail_path']
: null
];
}
return $results;
}
public function findHouseComplexAgency($homeId)
{
$sql = "
SELECT cl.agency_id
FROM complex_houses ch
JOIN complex_list cl ON cl.id = ch.complex_id
WHERE ch.id = {$homeId}
";
$query = $this->db->query($sql);
$result = $this->db->fetch_assoc($query);
return isset($result['agency_id']) && $result['agency_id'] ? $result['agency_id'] : null;
}
}