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;
}
}