events/Classes/Domain/Model/Location.php
Daniel Siepmann 00946af6ad
Properly handle latitude and longitude during Destination One import (#32)
They sometimes use a different separator.
The code is adjusted to always use same separator and precision.

That will prevent the same location from showing up multiple times due
to different latitude and longitude values.
2023-07-06 12:39:47 +02:00

186 lines
3.7 KiB
PHP

<?php
namespace Wrm\Events\Domain\Model;
use TYPO3\CMS\Extbase\DomainObject\AbstractEntity;
class Location extends AbstractEntity
{
/**
* @var string
*/
protected $name = '';
/**
* @var string
*/
protected $street = '';
/**
* @var string
*/
protected $zip = '';
/**
* @var string
*/
protected $city = '';
/**
* @var string
*/
protected $district = '';
/**
* @var string
*/
protected $country = '';
/**
* @var string
*/
protected $phone = '';
/**
* @var string
*/
protected $latitude = '';
/**
* @var string
*/
protected $longitude = '';
/**
* @var string
*/
protected $globalId = '';
public function __construct(
string $name,
string $street,
string $zip,
string $city,
string $district,
string $country,
string $phone,
string $latitude,
string $longitude,
int $languageUid
) {
$this->name = $name;
$this->street = $street;
$this->zip = $zip;
$this->city = $city;
$this->district = $district;
$this->country = $country;
$this->phone = $phone;
$this->latitude = $this->normalizeGeocoordinate($latitude);
$this->longitude = $this->normalizeGeocoordinate($longitude);
$this->_languageUid = $languageUid;
$this->globalId = $this->generateGlobalId();
}
public function getName(): string
{
return $this->name;
}
public function getStreet(): string
{
return $this->street;
}
public function getZip(): string
{
return $this->zip;
}
public function getCity(): string
{
return $this->city;
}
public function getDistrict(): string
{
return $this->district;
}
public function getCountry(): string
{
return $this->country;
}
public function getPhone(): string
{
return $this->phone;
}
public function getLatitude(): string
{
return $this->latitude;
}
public function getLongitude(): string
{
return $this->longitude;
}
public function getGlobalId(): string
{
return $this->globalId;
}
public function updateFromLocation(self $location): void
{
// Only updates values not being part of global id.
$this->phone = $location->getPhone();
$this->longitude = $location->getLongitude();
$this->latitude = $location->getLatitude();
}
/**
* Validates the location.
*
* Holds the original logic that at least one property must be given.
*/
public function isValid(): bool
{
return $this->name !== ''
|| $this->street !== ''
|| $this->zip !== ''
|| $this->city !== ''
|| $this->district !== ''
|| $this->country !== ''
|| $this->phone !== ''
;
}
private function generateGlobalId(): string
{
return hash('sha256', implode(',', [
$this->name,
$this->street,
$this->zip,
$this->city,
$this->district,
$this->country,
]));
}
private function normalizeGeocoordinate(string $coordinate): string
{
$numberOfCommas = substr_count($coordinate, ',');
$numberOfPoints = substr_count($coordinate, '.');
if (
$numberOfCommas === 1
&& $numberOfPoints === 0
) {
$coordinate = str_replace(',', '.', $coordinate);
}
return number_format((float)$coordinate, 6, '.', '');
}
}