Joywork/cron/complexHouseImport.php

602 lines
20 KiB
PHP
Raw Normal View History

2026-05-22 20:21:54 +02:00
<?php
set_time_limit(0);
require_once(__DIR__."/../config.php");
require_once(__DIR__."/../engine/classes/phpexcel/Classes/PHPExcel.php");
error_reporting(E_ALL);
ini_set('display_errors', 1);
$arguments = $argv;
if (isset($arguments[1])) {
$import_id = $arguments[1];
// Logger("START with import_id: $import_id");
$query = mysql_query("UPDATE complex_house_import SET status = 'in_progress' WHERE id={$import_id}");
$selectSql = mysql_query("SELECT * FROM complex_house_import WHERE id = $import_id");
$import = mysql_fetch_assoc($selectSql);
if (isset($import['document'])) {
$document = file_get_contents($import['document']);
if (isset($import['mapping_fields'])) {
$mapping_fields = json_decode($import['mapping_fields'], true);
if (endsWith($import['document'], 'csv')) {
$data = parseCsv(mb_convert_encoding($document, 'utf-8'));
} else if (endsWith($import['document'], 'xlsx')) {
$temp_name = tempnam(sys_get_temp_dir(), 'tmp-xlsx');
file_put_contents($temp_name, $document);
$type = PHPExcel_IOFactory::identify($temp_name);
$objReader = PHPExcel_IOFactory::createReader($type);
$objPHPExcel = $objReader->load($temp_name);
foreach ($objPHPExcel->getWorksheetIterator() as $worksheet) {
$data = $worksheet->toArray('');
break;
}
}
$headers = $data[0];
// Logger(json_encode($headers, true));
unset($data[0]);
$bodyValues = $data;
foreach ($bodyValues as $key => $row) {
$is_row_empty = true;
foreach ($row as $value) {
if (!empty($value) && $value !== 0) {
$is_row_empty = false;
}
}
if ($is_row_empty) {
unset($bodyValues[$key]);
}
}
$index = 0;
foreach ($headers as $header) {
foreach ($mapping_fields as $key => $value) {
if ($header === $value) {
$mapping_fields[$key] = $index;
}
}
$index++;
}
if (!is_numeric($import['house_name_to_id'])) {
$import['house_name_to_id'] = json_decode($import['house_name_to_id'], true);
}
$import['dynamic_fields'] = json_decode($import['dynamic_fields'], true);
mapData(
$mapping_fields,
$bodyValues,
$import['house_name_to_id'],
$import['dynamic_fields'],
$import['user_id']
);
updateImportHouse([
'status' => 'done',
], $import_id);
}
}
// Logger("END with import_id: $import_id");
} else {
// Logger("Parameter import_id is missing. (complex_house_import - id)");
exit(1);
}
function save_room($room)
{
// Logger(json_encode($room, true));
$strArray = [];
$position = 0;
$floorLastRoomInfo = mysql_fetch_assoc(mysql_query("SELECT position FROM complex_rooms WHERE complex_rooms.floor_id = {$room['floor_id']} ORDER BY position DESC LIMIT 1"));
if ($floorLastRoomInfo) {
if (!isset($room['id']) || !$room['position']) {
$position = $floorLastRoomInfo['position'];
} else {
$position = $room['position'] - 1;
}
}
foreach ($room as $key => $value) {
if ($key == 'id' || empty($value)) {
continue;
}
if (is_string($value)) {
$strArray[] = "$key='$value'";
} else {
$strArray[] = "$key=$value";
}
}
$position = $position + 1;
$strArray[] = "position='$position'";
$str = implode(', ', $strArray);
if (isset($room['id']) && $room['id']) {
if (isset($room['complex_status_id'])) {
$sql = "UPDATE requisitions SET complex_status_id = {$room['complex_status_id']} WHERE complex_room_id={$room['id']}";
mysql_query($sql);
}
$sql = "UPDATE complex_rooms SET $str WHERE id={$room['id']}";
$q = mysql_query($sql);
return $room['id'];
}
$sql = "INSERT INTO complex_rooms SET {$str} ";
$q = mysql_query($sql);
return mysql_insert_id();
}
function getJWId($table, $column, $value, $where = '')
{
if (is_string($value)) {
$value = "'$value'";
}
$sql = "SELECT id FROM $table WHERE $column = $value $where";
$query = mysql_query($sql);
$result = mysql_fetch_assoc($query);
if ($table == 'decoration_types' && !$result) {
$sql = "INSERT INTO $table set $column = $value";
$query = mysql_query($sql);
$result = mysql_fetch_assoc($query);
}
return $result ? (int)$result['id'] : $result;
}
function mapData($mapping, $values, $house_name_to_id, $dynamic_fields, $user_id)
{
// Logger("parararamparam");
// Logger(json_encode($mapping, true));
// Logger(json_encode($values, true));
// Logger("START with values: json_encode($values)");
$room_keys = [
'number',
'rooms_count',
'area',
'total_amount',
"layout_code",
"payment_types",
"layout_feature",
"on_site_number",
"description",
"estimated_area",
"living_area",
"kitchen_area",
"loggias_count",
"balconies_count",
"combined_bathrooms_count",
"seperated_bathrooms_count",
"bti_room_number",
"bti_total_area",
"area_without_balcony",
"hallway_area",
"ceiling_height",
"mortgage",
"total_area_excl_living",
"total_bathroom_area",
"total_balcony_loggia_area",
"installment_price",
];
$room_id_keys = [
"decoration_id",
"windows_placement_id",
"floor_id",
"entrance_id"
];
$room_id_keys_to_table = [
"decoration_id" => [
'table' => 'decoration_types',
'column' => 'name',
],
"windows_placement_id" => [
'table' => 'complex_rooms_windows_placements',
'column' => 'name'
],
"floor_id" => [
'table' => 'complex_floors',
'column' => 'position'
],
"entrance_id" => [
'table' => 'complex_entrances',
'column' => 'position'
],
];
$room_dynamic_keys = [
'complex_status_id',
'type',
];
$use_one_house = is_numeric($house_name_to_id);
foreach ($values as $row) {
$room = [];
$entranceValue = null;
$floorValue = null;
$room_number = null;
$room_id = null;
$oldRoom = null;
// Logger(json_encode([$row, $values], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
$house_id = $house_name_to_id;
foreach ($mapping as $key => $index) {
$value = trim($row[$index]);
// Logger(json_encode([$mapping, $value], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
if($key == "rooms_areas" || $key == "bathrooms_areas" || $key == "loggias_balconys_areas" || $key == "rooms_note")
continue;
if (in_array($key, $room_keys)) {
if ($key == 'number') {
$room_number = $value;
}
if ($key == 'layout_feature') {
if($value == "Студия"){
$room[$key] = "studio";
}
if($value == "Европланировка"){
$room[$key] = "european_layout";
}
if($value == "Свободная планировка"){
$room[$key] = "available";
}
continue;
}
if ($key == 'total_amount') {
$room[$key] = preg_replace('/\D/', '', $value);
} else {
$room[$key] = $value;
}
} else if (in_array($key, $room_id_keys)) {
if (in_array($key, ['floor_id', 'entrance_id'])) {
if ($key == 'floor_id') {
$floorValue = trim($value);
}
if ($key == 'entrance_id') {
$entranceValue = trim($value);
}
} else {
$room[$key] = getJWId($room_id_keys_to_table[$key]['table'], $room_id_keys_to_table[$key]['column'], $value);
}
} else if (in_array($key, $room_dynamic_keys)) {
if ($key == 'complex_status_id') {
// убираем пробелы из ключей
$dynamic_fields[$key] = (object) array_combine(
array_map('trim', array_keys((array)$dynamic_fields[$key])),
array_values((array)$dynamic_fields[$key])
);
$trimmedValue = trim($value);
Logger(json_encode([$dynamic_fields[$key], $trimmedValue], JSON_UNESCAPED_UNICODE));
// безопасно обращаемся к объекту
$room[$key] = $dynamic_fields[$key]->$trimmedValue ;
}
else{
$room[$key] = $dynamic_fields[$key][$value];
}
} else if ($key == 'house_name') {
$house_id = $house_name_to_id[$value];
}
}
$payment_types = ["FULL"]; // всегда по умолчанию FULL
// проверяем Ипотеку
if (isset($mapping['mortgage'])) {
$mortgageValue = $row[$mapping['mortgage']];
if ($mortgageValue === 'да'|| $mortgageValue === 'ДА'|| $mortgageValue === 'Да'|| $mortgageValue === 'дА') {
$payment_types[] = "MORTGAGE";
}
}
unset($room['mortgage']);
// проверяем Рассрочку
if (isset($mapping['installment_price'])) {
$installmentValue = preg_replace('/\D/', '', $row[$mapping['installment_price']]);
if (is_numeric($installmentValue) && (int)$installmentValue > 0) {
$payment_types[] = "INSTALLMENT";
}
}
// Logger(json_encode($mapping, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
$room['payment_types'] = json_encode($payment_types, JSON_UNESCAPED_UNICODE);
$entrance_id = getJWId($room_id_keys_to_table['entrance_id']['table'], $room_id_keys_to_table['entrance_id']['column'], $entranceValue, " AND complex_house_id = $house_id ");
$floor_id = null;
if ($room_number) {
$oldRoom = findRoomByNumber($room_number, $house_id);
$room_id = $oldRoom['id'];
$room['position'] = $oldRoom['position'];
}
if ($room_id) {
$room['id'] = $room_id;
if ($entrance_id == $oldRoom['entrance_id']) {
$floor_id = getJWId($room_id_keys_to_table['floor_id']['table'], $room_id_keys_to_table['floor_id']['column'], $floorValue, " AND complex_entrance_id = $entrance_id ");
} else if (!$entrance_id) {
// Logger("INSERT INTO complex_entrances SET complex_house_id = $house_id, position = $entranceValue, name = 'Подъезд {$entranceValue}'");
mysql_query("INSERT INTO complex_entrances SET complex_house_id = $house_id, position = $entranceValue, name = 'Подъезд {$entranceValue}'");
$entrance_id = mysql_insert_id();
}
} else {
if (!$entrance_id) {
// Logger("INSERT INTO complex_entrances SET complex_house_id = $house_id, position = $entranceValue, name = 'Подъезд {$entranceValue}'");
mysql_query("INSERT INTO complex_entrances SET complex_house_id = $house_id, position = $entranceValue, name = 'Подъезд {$entranceValue}'");
$entrance_id = mysql_insert_id();
}
// Logger("entrance_id : $entrance_id");
$floor_id = getJWId($room_id_keys_to_table['floor_id']['table'], $room_id_keys_to_table['floor_id']['column'], $floorValue, " AND complex_entrance_id = $entrance_id ");
}
if (!$floor_id) {
mysql_query("INSERT INTO complex_floors SET complex_entrance_id = $entrance_id, position = $floorValue");
$floor_id = mysql_insert_id();
}
$room['floor_id'] = $floor_id;
$room_id = save_room($room);
if (isset($mapping['rooms_note'])) {
saveRoomNotes($room_id,$row[$mapping['rooms_note']]);
}
if (isset($mapping['rooms_areas'])) {
saveRoomAttributes($room_id, 'rooms_areas', $row[$mapping['rooms_areas']]);
}
if (isset($mapping['bathrooms_areas'])) {
saveRoomAttributes($room_id, 'bathrooms_areas', $row[$mapping['bathrooms_areas']]);
}
if (isset($mapping['loggias_balconys_areas'])) {
saveRoomAttributes($room_id, 'loggias_balconys_areas', $row[$mapping['loggias_balconys_areas']]);
}
// Logger("done with room_id: " . json_encode($room, true));
// Logger("done with house_id: $house_id");
if (isset($mapping['layout_code'])) {
$layout_code = trim($row[$mapping['layout_code']]);
// Logger(json_encode($layout_code, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
$plan_id = null;
if ($layout_code && $house_id) {
$layout_code_escaped = mysql_real_escape_string($layout_code);
$sql = "SELECT id FROM complex_house_plans WHERE code = '$layout_code_escaped' AND house_id = $house_id LIMIT 1";
$query = mysql_query($sql);
$result = mysql_fetch_assoc($query);
if ($result) {
$plan_id = (int)$result['id'];
}
}
// Если нашли plan_id и есть room_id, вставляем связь
if ($plan_id && $room_id) {
// Проверяем, есть ли уже запись
$checkSql = "SELECT 1 FROM complex_rooms_plans WHERE room_id = $room_id AND plan_id = $plan_id LIMIT 1";
$checkQuery = mysql_query($checkSql);
if (!mysql_fetch_assoc($checkQuery)) {
$insertSql = "INSERT INTO complex_rooms_plans SET room_id = $room_id, plan_id = $plan_id";
mysql_query($insertSql);
// Logger("Inserted room_id $room_id with plan_id $plan_id");
} else {
// Logger("Relation room_id $room_id and plan_id $plan_id already exists");
}
}
}
}
}
function saveRoomNotes($room_id, $note){
if (!$note) return;
$sql = sprintf(
"INSERT INTO complex_room_notes
SET room_id = %d, note = '%s'",
(int)$room_id,
mysql_real_escape_string($note)
);
// Logger(json_encode($sql, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
mysql_query($sql);
}
function saveRoomAttributes($room_id, $type, $value) {
if (!$value) return;
// Разбираем строку в зависимости от типа
$items = explode(';', $value);
foreach ($items as $item) {
$item = trim($item);
if (!$item) continue;
// Logger(json_encode([$items, $item], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
$name = null;
$area = null;
if ($type === 'loggias_balconys_areas') {
// формат: "лоджия:84.25" или "балкон:12.6"
if (strpos($item, ':') !== false) {
list($name, $area) = explode(':', $item);
$name = trim($name);
if($name == "Лоджия"){
$name = "loggia";
}
if($name == "Балкон"){
$name = "balcony";
}
$area = trim($area);
// Logger(json_encode([$name, $area], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
} else {
$area = $item; // если без имени
// Logger(json_encode([$name, $area], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
}
} else if($type === "rooms_areas") {
$name = "room";
$area = $item;
// Logger(json_encode([$item, $area], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
} else if($type === "bathrooms_areas") {
$name = "bathroom";
$area = $item;
// Logger(json_encode([$item, $area], JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
}
// если area нет или не число — пропускаем
if (!$area || !is_numeric($area)) {
continue;
}
// Вставляем в таблицу
$sql = sprintf(
"INSERT INTO complex_rooms_attribute
SET attribute_type = %s, complex_room_id = %d, area = %s",
$name ? ("'" . mysql_real_escape_string($name) . "'") : "NULL",
(int)$room_id,
is_numeric($area) ? $area : "NULL"
);
// Logger(json_encode($sql, JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
mysql_query($sql);
}
}
function findRoomByNumber($room_number, $house_id) {
if ($house_id) {
$find = mysql_query("SELECT complex_rooms.position as position, complex_rooms.id, complex_rooms.floor_id, complex_entrances.id as entrance_id 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 = mysql_fetch_assoc($find);
return $row;
}
}
function parseCsv($input)
{
$possibleSeparators = [',', ';', "\t", '|'];
$separatorCounts = [];
$for_first_line = fopen('php://memory', 'rw');
fwrite($for_first_line, $input);
fseek($for_first_line, 0);
$firstLine = fgets($for_first_line);
fclose($for_first_line);
$temp = fopen('php://memory', 'rw');
fwrite($temp, $input);
fseek($temp, 0);
$res = array();
foreach ($possibleSeparators as $separator) {
$columns = str_getcsv($firstLine, $separator);
$separatorCounts[$separator] = count($columns);
}
$mostLikelySeparator = array_search(max($separatorCounts), $separatorCounts);
while (($data = fgetcsv($temp, null, $mostLikelySeparator)) !== false) {
$res[] = $data;
}
fclose($temp);
return $res;
}
function detectCsvSeparator($temp)
{
// Possible separators to test
$possibleSeparators = [',', ';', "\t", '|'];
$separatorCounts = [];
// Open the file for reading
if (($handle = $temp) === false) {
return false; // Error opening file
}
// Read the first line of the file
$firstLine = fgets($handle);
fclose($handle);
// Test each separator
foreach ($possibleSeparators as $separator) {
$columns = str_getcsv($firstLine, $separator);
$separatorCounts[$separator] = count($columns);
}
// Find the separator with the most columns
$mostLikelySeparator = array_search(max($separatorCounts), $separatorCounts);
return $mostLikelySeparator;
}
function Logger($message)
{
$timestamp = date('Y-m-d H:i:s');
print("[$timestamp] $message \n");
}
function endsWith($haystack, $needle)
{
$length = strlen($needle);
return $length > 0 ? substr($haystack, -$length) === $needle : true;
}
function updateImportHouse($data, $import_id)
{
// complex_house_import
if ($data && $import_id) {
$sql = [];
foreach ($data as $key => $value) {
if (is_string($value)) {
$sql[] = "$key='$value'";
} else {
$sql[] = "$key=$value";
}
}
$sql = implode(' ,', $sql);
$sql = "UPDATE complex_house_import SET $sql WHERE id={$import_id}";
return mysql_query($sql);
}
return false;
}
exit(0);