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/', " ", $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(' ', " ", $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'], '