Joywork/presentation-api/Models/ComplexesModel.php

295 lines
15 KiB
PHP
Raw Permalink Normal View History

2026-05-22 20:21:54 +02:00
<?php
class ComplexesModel extends BaseModel {
public function getComplexes($params) {
if (!is_array($params)) {
return false;
}
$id = $this->arrToString($params);
$catalog = "SELECT * FROM sent_catalog WHERE id = '$id'";
$catalogQuery = $this->db->query($catalog);
if ($catalogRes = $this->db->fetch_assoc($catalogQuery)) {
$agent_id = $catalogRes['agent_id'];
$agent = "SELECT users.first_name, last_name, middle_name, id_manager, phone, photo, email, user_logo, phoneAgency, site, agency_name FROM users WHERE id = '$agent_id'";
$agentQuery = $this->db->query($agent);
$agentArr = [];
if ($agentRes = $this->db->fetch_assoc($agentQuery)) {
$agentRes['agency_name'] = html_entity_decode($agentRes['agency_name'], ENT_QUOTES, 'UTF-8');
if ($agentRes['id_manager']) {
$managerSql = "SELECT id_manager, photo, agency_name FROM users WHERE id = '$agentRes[id_manager]'";
$managerQuery = $this->db->query($managerSql);
$manager = $this->db->fetch_assoc($managerQuery);
if ($manager && $manager['id_manager']) {
$agencySql = "SELECT photo, agency_name FROM users WHERE id = '$manager[id_manager]'";
$agencyQuery = $this->db->query($agencySql);
$agency = $this->db->fetch_assoc($agencyQuery);
if ($agency) {
$agentRes['photo'] = $agency['photo'];
$agentRes['agency_name'] = $agency['agency_name'];
}
} else {
if ($manager) {
$agentRes['photo'] = $manager['photo'];
$agentRes['agency_name'] = $manager['agency_name'];
}
}
}
$agentArr = $agentRes;
}
}
// Находим комплекс
$complexes = "SELECT cl.*, rr.name as region_name, cd.title_desc as note_text, cd.text_desc as note, ca.address as complex_address, ca.latitude as latitude, ca.longitude as longitude,
COUNT(caf.id) AS count_favorite_apartments
FROM complex_list cl
LEFT JOIN complex_address ca ON ca.complex_id = cl.id
LEFT JOIN rf_regions rr ON rr.id = cl.rf_region_id
JOIN complex_houses ch ON ch.complex_id = cl.id AND (ch.deleted_at IS NULL OR ch.deleted_at = '0000-00-00 00:00:00')
JOIN complex_entrances ce ON ce.complex_house_id = ch.id
JOIN complex_floors cf ON cf.complex_entrance_id = ce.id
JOIN complex_rooms cr ON cr.floor_id = cf.id
LEFT JOIN catalogs_apartments_favorite caf ON caf.apartment_id = cr.id AND caf.catalog_id = '$id'
LEFT JOIN complex_dop cd ON cd.complex_id = cl.id
WHERE cr.id IN (SELECT id_object FROM sended_pdf_complexes WHERE sent_catalog_id = '$id')
GROUP BY cl.id";
$complexesQuery = $this->db->query($complexes);
$complexesArr = [];
while ($complexesRes = $this->db->fetch_assoc($complexesQuery)) {
$complex_id = $complexesRes['id'];
// Тут фото блока
$complex_img = "SELECT image from complex_images WHERE complex_id = '$complex_id'";
$complex_imgQuery = $this->db->query($complex_img);
$complex_imgArr = [];
while ($complex_imgRes = $this->db->fetch_assoc($complex_imgQuery)) {
$complex_imgArr[] = $complex_imgRes['image'];
}
// Находим метро
$metro = "SELECT metro.id, metro.metro, m.metro_id, m.subway_time, m.subway_type FROM complex_metro as m JOIN metro on metro.id = m.metro_id WHERE m.complex_id='$complex_id'";
$metroArr = [];
$metroQuery = $this->db->query($metro);
while ($metro = $this->db->fetch_assoc($metroQuery)) {
$metroArr[] = $metro;
}
// Находим квартиры(апартаменты)
$complex_rooms = "SELECT
IF(caf.id IS NOT NULL, 1, 0) AS is_favorite,
IF(complex_rooms.layout_feature = 'studio', 'Студия',
IF(complex_rooms.rooms_count >= 6, '6+ ккв',
CONCAT(complex_rooms.rooms_count, ' ккв'))) AS room_type_name,
dt.name AS decoration,
complex_rooms.*,
cf.position AS building_floors,
ch.name AS corpus_name,
chpi.url AS image,
cf.position AS floor,
spc.new_installment_price AS new_installment_price,
spc.new_presentation_note AS new_presentation_note,
spc.calculation_data AS calculation_data,
DATE_FORMAT(STR_TO_DATE(CONCAT(ch.deadline_year, '-',
CASE ch.deadline_quarter
WHEN '1' THEN '03'
WHEN '2' THEN '06'
WHEN '3' THEN '09'
WHEN '4' THEN '12'
END, '-01'), '%Y-%m-%d'), '%Y-%m-01 00:00:00')
AS building_deadline
FROM complex_rooms
JOIN complex_floors cf ON cf.id = complex_rooms.floor_id
JOIN complex_entrances ce ON ce.id = cf.complex_entrance_id
JOIN complex_houses ch ON ce.complex_house_id = ch.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
JOIN sended_pdf_complexes spc ON spc.sent_catalog_id = '$id' AND spc.id_object = complex_rooms.id
LEFT JOIN decoration_types dt ON dt.id = complex_rooms.decoration_id
LEFT JOIN catalogs_apartments_favorite caf ON caf.apartment_id = complex_rooms.id AND caf.catalog_id = '$id'
LEFT JOIN complex_rooms_plans crp ON crp.room_id = complex_rooms.id
LEFT JOIN complex_house_plans_images chpi ON crp.plan_id = chpi.plan_id AND chpi.position = 1
WHERE complex_rooms.id IN (SELECT id_object FROM sended_pdf_complexes WHERE sent_catalog_id = '$id')
AND cl.id = '$complex_id'
GROUP BY complex_rooms.id";
$complexRoomsQuery = $this->db->query($complex_rooms);
$complexRoomsArr = [];
while ($complexRoomsRes = $this->db->fetch_assoc($complexRoomsQuery)) {
$complexRoomsRes['is_favorite'] = (bool)$complexRoomsRes['is_favorite'];
if (!empty($complexRoomsRes['calculation_data'])) {
$complexRoomsRes['calculation_data'] = json_decode($complexRoomsRes['calculation_data'], true);
} else {
$complexRoomsRes['calculation_data'] = [];
}
// Получаем attributes отдельным запросом
$room_id = $complexRoomsRes['id'];
$attributesSql = "SELECT * FROM complex_rooms_attribute WHERE complex_room_id = '$room_id'";
$attributesQuery = $this->db->query($attributesSql);
// создаём массив с группировкой по типу
$attributesGrouped = [
'rooms' => [],
'bathrooms' => [],
'loggias' => []
];
while ($attr = $this->db->fetch_assoc($attributesQuery)) {
switch ($attr['attribute_type']) {
case 'room':
$attributesGrouped['rooms'][] = $attr;
break;
case 'bathroom':
$attributesGrouped['bathrooms'][] = $attr;
break;
case 'loggia':
$attributesGrouped['loggias'][] = $attr;
break;
case 'balcony':
$attributesGrouped['balcony'][] = $attr;
break;
}
}
$complexRoomsRes['attributes'] = $attributesGrouped;
$floor_id = $complexRoomsRes['floor_id'];
$sql = "
SELECT chfp.image AS image_floor
FROM complex_floors_plans cfp
LEFT JOIN complex_house_floor_plans chfp
ON cfp.floor_plan_id = chfp.id
WHERE cfp.floor_id = '$floor_id'
";
$imageRes = $this->db->fetch_assoc($this->db->query($sql));
$image_floor = $imageRes['image_floor'];
$complexRoomsRes['image_floor'] = $image_floor;
$complexRoomsArr[] = $complexRoomsRes;
}
$complexesRes['apartments'] = $complexRoomsArr;
$complexesRes['block_img'] = $complex_imgArr;
$complexesRes['metros'] = $metroArr;
$complexesRes['image'] = count($complex_imgArr) ? $complex_imgArr[0] : null;
$complexesArr[] = $complexesRes;
}
return [
'id' => $catalogRes['id'],
'agent_id' => $catalogRes['agent_id'],
'agent' => $agentArr,
'blocks' => $complexesArr,
];
}
// apartment presentation page
public function getApartment($id, $token) {
if (!is_array($id)) {
return false;
}
$user = [];
$id = $this->arrToString($id);
if ($token) {
$userSql = "SELECT id, fio, phone, photo, email, site, first_name, last_name, middle_name, id_manager, user_logo FROM users WHERE MD5(id)='$token'";
$rez_user = $this->db->query($userSql);
$user = $this->db->fetch_assoc($rez_user);
if ($user['id_manager']) {
$sql = "SELECT id_manager, photo, fio FROM users WHERE id='$user[id_manager]'";
$rez = $this->db->query($sql);
$manager = $this->db->fetch_assoc($rez);
if ($manager['id_manager']) {
$agency = $this->db->fetch_assoc($this->db->query("SELECT id_manager, email, site, first_name, last_name, middle_name, photo, fio FROM users WHERE id='$manager[id_manager]'"));
} else {
$agency = $manager;
}
$user['photo'] = $agency['photo'];
$user['agency_name'] = trim($agency['last_name'] . ' ' . $agency['first_name'] . ' ' . $agency['middle_name']);
} else {
$user['agency_name'] = $user['fio'];
}
}
$complex_sql = "SELECT cl.*, rr.name as region_name, cd.title_desc as note_text, cd.text_desc as note, ca.address as complex_address, ca.latitude as latitude, ca.longitude as longitude
FROM complex_list cl
LEFT JOIN complex_address ca ON ca.complex_id = cl.id
LEFT JOIN rf_regions rr ON rr.id = cl.rf_region_id
JOIN complex_houses ch ON ch.complex_id = cl.id AND (ch.deleted_at IS NULL OR ch.deleted_at = '0000-00-00 00:00:00')
JOIN complex_entrances ce ON ce.complex_house_id = ch.id
JOIN complex_floors cf ON cf.complex_entrance_id = ce.id
JOIN complex_rooms cr ON cr.floor_id = cf.id
LEFT JOIN complex_dop cd ON cd.complex_id = cl.id
WHERE cr.id = '$id'
";
$complex_q = $this->db->query($complex_sql);
$complex_res = $this->db->fetch_assoc($complex_q);
$complex_id = $complex_res['id'];
// // Тут фото блока
$complex_img = "SELECT image from complex_images WHERE complex_id = '$complex_id'";
$complex_imgQuery = $this->db->query($complex_img);
$complex_imgArr = [];
while ($complex_imgRes = $this->db->fetch_assoc($complex_imgQuery)) {
$complex_imgArr[] = $complex_imgRes['image'];
}
// Находим метро
$metro = "SELECT metro.id, metro.metro, m.metro_id, m.subway_time, m.subway_type FROM complex_metro as m JOIN metro on metro.id = m.metro_id WHERE m.complex_id='$complex_id'";
$metroArr = [];
$metroQuery = $this->db->query($metro);
while ($metro = $this->db->fetch_assoc($metroQuery)) {
$metroArr[] = $metro;
}
$complex_res['block_img'] = $complex_imgArr;
$complex_res['metros'] = $metroArr;
$complex_res['image'] = count($complex_imgArr) ? $complex_imgArr[0] : null;
// Находим квартиры(апартаменты)
$complex_room_sql = "SELECT
IF(complex_rooms.layout_feature = 'studio', 'Студия',
IF(complex_rooms.rooms_count >= 6, '6+ ккв',
CONCAT(complex_rooms.rooms_count, ' ккв'))) AS room_type_name,
dt.name AS decoration,
complex_rooms.*,
cf.position AS building_floors,
ch.name AS corpus_name,
chpi.url AS image,
cf.position AS floor,
DATE_FORMAT(STR_TO_DATE(CONCAT(ch.deadline_year, '-',
CASE ch.deadline_quarter
WHEN '1' THEN '03'
WHEN '2' THEN '06'
WHEN '3' THEN '09'
WHEN '4' THEN '12'
END, '-01'), '%Y-%m-%d'), '%Y-%m-01 00:00:00')
AS building_deadline
FROM complex_rooms
JOIN complex_floors cf ON cf.id = complex_rooms.floor_id
JOIN complex_entrances ce ON ce.id = cf.complex_entrance_id
JOIN complex_houses ch ON ce.complex_house_id = ch.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
LEFT JOIN decoration_types dt ON dt.id = complex_rooms.decoration_id
LEFT JOIN complex_rooms_plans crp ON crp.room_id = complex_rooms.id
LEFT JOIN complex_house_plans_images chpi ON crp.plan_id = chpi.plan_id AND chpi.position = 1
WHERE complex_rooms.id = '$id'";
$complex_q = $this->db->query($complex_room_sql);
$complex_room = $this->db->fetch_assoc($complex_q);
return [
"user" => $user,
"apartment" => $complex_room,
"block" => $complex_res
];
}
}