Skip to content

Commit

Permalink
address country list
Browse files Browse the repository at this point in the history
  • Loading branch information
yurikuzn committed May 15, 2024
1 parent 547b774 commit a1d5174
Show file tree
Hide file tree
Showing 28 changed files with 2,100 additions and 5 deletions.
48 changes: 48 additions & 0 deletions application/Espo/Classes/AppParams/AddressCountryData.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM – Open Source CRM application.
* Copyright (C) 2014-2024 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU Affero General Public License version 3.
*
* In accordance with Section 7(b) of the GNU Affero General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/

namespace Espo\Classes\AppParams;

use Espo\Core\Utils\Address\CountryDataProvider;
use Espo\Tools\App\AppParam;

class AddressCountryData implements AppParam
{
public function __construct(
private CountryDataProvider $provider
) {}

/**
* @return array{list: string[], preferredList: string[]}
*/
public function get(): array
{
return $this->provider->get();
}
}
56 changes: 56 additions & 0 deletions application/Espo/Classes/FieldSanitizers/StringUpperCase.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM – Open Source CRM application.
* Copyright (C) 2014-2024 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU Affero General Public License version 3.
*
* In accordance with Section 7(b) of the GNU Affero General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/

namespace Espo\Classes\FieldSanitizers;

use Espo\Core\FieldSanitize\Sanitizer;
use Espo\Core\FieldSanitize\Sanitizer\Data;

/**
* @noinspection PhpUnused
*/
class StringUpperCase implements Sanitizer
{
public function sanitize(Data $data, string $field): void
{
if (!$data->has($field)) {
return;
}

$value = $data->get($field);

if (!is_string($value)) {
return;
}

$value = mb_strtoupper($value);

$data->set($field, $value);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM – Open Source CRM application.
* Copyright (C) 2014-2024 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU Affero General Public License version 3.
*
* In accordance with Section 7(b) of the GNU Affero General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/

namespace Espo\Classes\Select\AddressCountry;

use Espo\Core\Select\Order\Item;
use Espo\Core\Select\Order\Orderer;
use Espo\ORM\Query\Part\Order;
use Espo\ORM\Query\SelectBuilder;

class PreferredNameOrderer implements Orderer
{
public function apply(SelectBuilder $queryBuilder, Item $item): void
{
$queryBuilder
->order('isPreferred', $item->getOrder() === Order::ASC ? Order::DESC : Order::ASC)
->order('name', $item->getOrder());
}
}
50 changes: 50 additions & 0 deletions application/Espo/Controllers/AddressCountry.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM – Open Source CRM application.
* Copyright (C) 2014-2024 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU Affero General Public License version 3.
*
* In accordance with Section 7(b) of the GNU Affero General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/

namespace Espo\Controllers;

use Espo\Core\Controllers\RecordBase;
use Espo\Tools\Address\CountryDefaultsPopulator;

class AddressCountry extends RecordBase
{
protected function checkAccess(): bool
{
return $this->user->isAdmin();
}

public function postActionPopulateDefaults(): bool
{
$populate = $this->injectableFactory->create(CountryDefaultsPopulator::class);

$populate->populate();

return true;
}
}
117 changes: 117 additions & 0 deletions application/Espo/Core/Utils/Address/CountryDataProvider.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM – Open Source CRM application.
* Copyright (C) 2014-2024 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU Affero General Public License version 3.
*
* In accordance with Section 7(b) of the GNU Affero General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/

namespace Espo\Core\Utils\Address;

use Espo\Core\Utils\Config;
use Espo\Core\Utils\DataCache;
use Espo\Entities\AddressCountry;
use Espo\ORM\EntityManager;
use Espo\ORM\Query\Part\Order;

class CountryDataProvider
{
/** @var ?array{list: string[], preferredList: string[]} */
private ?array $data = null;
private bool $useCache;

private const CACHE_KEY = 'addressCountryData';
private const LIMIT = 500;

public function __construct(
private DataCache $dataCache,
private Config $config,
private EntityManager $entityManager
) {
$this->useCache = (bool) $this->config->get('useCache');
}

/**
* @return array{list: string[], preferredList: string[]}
*/
public function get(): array
{
if ($this->data === null) {
$this->data = $this->load();
}

return $this->data;
}

/**
* @return array{list: string[], preferredList: string[]}
*/
private function load(): array
{
if ($this->useCache && $this->dataCache->has(self::CACHE_KEY)) {
$list = $this->dataCache->get(self::CACHE_KEY);

if (
is_array($list) ||
is_array($list['list'] ?? null) ||
is_array($list['preferredList'] ?? null)
) {
/** @var array{list: string[], preferredList: string[]} */
return $list;
}
}

$list = [];
$preferredList = [];

/** @var iterable<AddressCountry> $collection */
$collection = $this->entityManager
->getRDBRepositoryByClass(AddressCountry::class)
->sth()
->select(['name', 'isPreferred'])
->order('name', Order::ASC)
->limit(0, self::LIMIT)
->find();

foreach ($collection as $entity) {
$list[] = $entity->getName();

if ($entity->isPreferred()) {
$preferredList[] = $entity->getName();
}
}

if ($this->useCache) {
$this->dataCache->store(self::CACHE_KEY, [
'list' => $list,
'preferredList' => $preferredList,
]);
}

return [
'list' => $list,
'preferredList' => $preferredList,
];
}
}
52 changes: 52 additions & 0 deletions application/Espo/Entities/AddressCountry.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM – Open Source CRM application.
* Copyright (C) 2014-2024 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU Affero General Public License version 3.
*
* In accordance with Section 7(b) of the GNU Affero General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/

namespace Espo\Entities;

use Espo\Core\ORM\Entity;

class AddressCountry extends Entity
{
public const ENTITY_TYPE = 'AddressCountry';

public function getName(): string
{
return $this->get('name');
}

public function getCode(): string
{
return $this->get('code');
}

public function isPreferred(): bool
{
return (bool) $this->get('isPreferred');
}
}
Loading

0 comments on commit a1d5174

Please sign in to comment.