HEX
Server: nginx/1.18.0
System: Linux test-ipsremont 5.4.0-214-generic #234-Ubuntu SMP Fri Mar 14 23:50:27 UTC 2025 x86_64
User: ips (1000)
PHP: 8.0.30
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: /var/www/limestate-admin/app/Services/ImportFlatService.php
<?php

namespace App\Services;

use Exception;
use Rap2hpoutre\FastExcel\FastExcel;

class ImportFlatService
{

    private array $newFlats = [];
    private array $flatsToUpdate = [];

    private array $fieldsToIgnore = ['allimg'];

    private array $errors = [];

    public function __construct(private FastExcel $fastExcel)
    {
    }

    public function getNewFlats(): array
    {
        return $this->newFlats;
    }

    public function getFlatsToUpdate(): array
    {
        return $this->flatsToUpdate;
    }

    public function parseFlats(string $filePath): array
    {
        $collection = $this->fastExcel->withoutHeaders()->import($filePath);

        $flats = [];
        foreach ($collection as $row) {
            $allEmpty = true;
            foreach ($row as &$value) {
                $value = trim($value);
                if (!empty($value)) {
                    $allEmpty = false;
                    break;
                }
            }

            if ($allEmpty) {
                continue;
            }

            $errors = [];

            $number = $row[2] ?? null;
            if (empty($number)) {
                $errors[$number][] = 'Неверный номер';
                $this->errors[$number][] = 'Неверный номер';
            }

            $rooms = $row[3];
            $roomsFirstChar = mb_strtolower(mb_substr($rooms, 0, 1));
            $isStudioApartment = in_array($roomsFirstChar, ['c', 'с']);
            if ($isStudioApartment) {
                $rooms = 0;
            } else {
                $rooms = preg_replace('/[^\d]*/', '', $rooms);
            }
            if (0 !== $rooms && empty($rooms)) {
                $errors[$number][] = 'Не указано количество комнат';
                $this->errors[$number][] = 'Не указано количество комнат';
                continue;
            }


            $floor = $row[4];
            if (empty($floor)) {
                $errors[$number][] = 'Неверный этаж';
                $this->errors[$number][] = 'Неверный этаж';
                continue;
            }

            $totalArea = $row[5];
            $price = $row[11];

            if (empty($totalArea)) {
                $errors[$number][] = 'Неверная площадь';
                $this->errors[$number][] = 'Неверная площадь';
                continue;
            }

            if (is_object($totalArea)) {
                $errors[$number][] = 'Неверная площадь';
                $this->errors[$number][] = 'Неверная площадь';
            } else {
                $totalArea = (float) $totalArea;
            }

            if (is_object($price)) {
                $errors[$number][] = 'Неверная цена';
                $this->errors[$number][] = 'Неверная цена';
            } else {
                $price = (float) $price;
            }

            if (!empty($errors)) {
                continue;
            }

            $flats[] = [
                'number' => $number,
                'rooms' => $rooms,
                'floor' => $floor,
                'total_area' => $totalArea,
                'nominal' => $row[8], // Не понятно что это
                'base_price' => $row[9],
                'mortgage_price' => $row[10],
                'price' => $price,
                'published' => true,
            ];
        }

        return $flats;
    }

    public function compareFlats(array $flats, array $oldFlats): void
    {
        $hasNumbers = false;
        $flatsByNumber = [];
        foreach ($flats as $flat) {
            if (!isset($flat['number'])) {
                continue;
            }

            $flatsByNumber[mb_strtolower($flat['number'])] = $flat;
            $hasNumbers = true;
        }

        if (!$hasNumbers) {
            throw new Exception('В файле отсутствуют номера квартир!');
        }

        if (empty(count($oldFlats))) {
            $this->newFlats = $flats;
            $this->flatsToUpdate = [];

            return;
        }

        $oldFlatsByNumber = [];
        foreach ($oldFlats as $oldFlat) {
            $oldFlatsByNumber[mb_strtolower($oldFlat['number'])] = $oldFlat;
        }

        $this->flatsToUpdate = [];
        foreach ($oldFlatsByNumber as $number => $oldFlat) {
            $needUpdate = false;
            if (isset($flatsByNumber[$number])) {
                foreach ($flatsByNumber[$number] as $flatField => $flatValue) {
                    if (!in_array($flatField, $this->fieldsToIgnore) && $flatValue) {
                        $oldFlat[$flatField] = $flatValue;
                    }
                }
                $oldFlat['published'] = true;
                $needUpdate = true;
            } elseif ($oldFlat['published']) {
                $oldFlat['published'] = false;
                $needUpdate = true;
            }

            if ($needUpdate) {
                $this->flatsToUpdate[] = $oldFlat;
            }
        }

        $this->newFlats = [];
        foreach ($flatsByNumber as $number => $flat) {
            if (!isset($oldFlatsByNumber[$number])) {
                $this->newFlats[] = $flat;
            }
        }
    }

    public function getErrors(): array
    {
        return $this->errors;
    }

}