diff --git a/config/services.yaml b/config/services.yaml index d282b8b79..3398a1bf8 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -58,6 +58,8 @@ services: tags: [ 'system.config.mapper' ] App\Legacy\Data\PresetListDataHandlerInterface: tags: [ 'app.data.preset.handler' ] + App\Legacy\Data\FilterMapper\FilterMapperInterface: + tags: [ 'app.data.filter.mapper' ] App\Service\StatisticsProviderInterface: tags: [ 'app.data.statistics.handler' ] @@ -149,3 +151,9 @@ services: # and use the value of the 'getKey' method to index the services arguments: - !tagged { tag: 'app.data.statistics.handler', default_index_method: 'getKey' } + + App\Legacy\Data\FilterMapper\FilterMappers: + # inject all services tagged with app.data.filter.mapper as first argument + # and use the value of the 'getType' method to index the services + arguments: + - !tagged { tag: 'app.data.filter.mapper', default_index_method: 'getType' } diff --git a/core/legacy/Data/BaseListDataHandler.php b/core/legacy/Data/BaseListDataHandler.php index a312d68ac..55f49b7f8 100644 --- a/core/legacy/Data/BaseListDataHandler.php +++ b/core/legacy/Data/BaseListDataHandler.php @@ -2,7 +2,7 @@ namespace App\Legacy\Data; -use App\Service\LegacyFilterMapper; +use App\Legacy\Data\FilterMapper\LegacyFilterMapper; use BeanFactory; use InvalidArgumentException; use ListViewDataPort; diff --git a/core/legacy/Data/FilterMapper/FilterMapperInterface.php b/core/legacy/Data/FilterMapper/FilterMapperInterface.php new file mode 100644 index 000000000..f71f5f2d7 --- /dev/null +++ b/core/legacy/Data/FilterMapper/FilterMapperInterface.php @@ -0,0 +1,20 @@ +getType(); + $this->registry[$type] = $handler; + } + + } + + /** + * Get the mapper for field type + * @param string $type + * @return FilterMapperInterface + * @throws ItemNotFoundException + */ + public function get(string $type): FilterMapperInterface + { + + if (empty($this->registry[$type])) { + throw new ItemNotFoundException(self::MSG_HANDLER_NOT_FOUND); + } + + return $this->registry[$type]; + } + + /** + * Has mapper for the given type + * @param string $type + * @return bool + */ + public function hasMapper(string $type): bool + { + return !(empty($this->registry[$type])); + } +} diff --git a/core/src/Service/LegacyFilterMapper.php b/core/legacy/Data/FilterMapper/LegacyFilterMapper.php similarity index 82% rename from core/src/Service/LegacyFilterMapper.php rename to core/legacy/Data/FilterMapper/LegacyFilterMapper.php index a81500d3b..ba1bccba3 100644 --- a/core/src/Service/LegacyFilterMapper.php +++ b/core/legacy/Data/FilterMapper/LegacyFilterMapper.php @@ -1,6 +1,6 @@ filterOperatorMap = $filterOperatorMap; + $this->mappers = $mappers; } /** @@ -74,15 +80,16 @@ class LegacyFilterMapper */ protected function mapFilterValue(string $mappedValue, array $item) { + $fieldType = $item['fieldType'] ?? ''; + + if ($mappedValue === 'values') { - if (count($item['values']) === 1) { - $legacyValue = $item['values'][0]; - } else { - $legacyValue = $item['values']; + if ($this->mappers->hasMapper($fieldType)) { + return $this->mappers->get($fieldType)->mapValue($mappedValue, $item); } - return $legacyValue; + return $this->mappers->get('default')->mapValue($mappedValue, $item); } $operator = $item['operator'] ?? ''; diff --git a/core/legacy/Data/FilterMapper/Mappers/DateFilterMapper.php b/core/legacy/Data/FilterMapper/Mappers/DateFilterMapper.php new file mode 100644 index 000000000..b7a7ea87e --- /dev/null +++ b/core/legacy/Data/FilterMapper/Mappers/DateFilterMapper.php @@ -0,0 +1,60 @@ +dateTimeHandler = $dateTimeHandler; + } + + /** + * @inheritDoc + */ + public function getType(): string + { + return 'date'; + } + + /** + * @inheritDoc + */ + public function mapValue(string $mappedValue, array $criteriaItem) + { + /** @var array */ + $values = $criteriaItem['values'] ?? []; + + if (empty($values)) { + return []; + } + + $mapped = []; + + foreach ($values as $value) { + if (empty($value)) { + continue; + } + $mapped[] = $this->dateTimeHandler->toUserDate($value); + } + + $legacyValue = $mapped; + if (count($mapped) === 1) { + $legacyValue = $mapped[0]; + } + + return $legacyValue; + } +} diff --git a/core/legacy/Data/FilterMapper/Mappers/DateTimeFilterMapper.php b/core/legacy/Data/FilterMapper/Mappers/DateTimeFilterMapper.php new file mode 100644 index 000000000..0da6c11fc --- /dev/null +++ b/core/legacy/Data/FilterMapper/Mappers/DateTimeFilterMapper.php @@ -0,0 +1,60 @@ +dateTimeHandler = $dateTimeHandler; + } + + /** + * @inheritDoc + */ + public function getType(): string + { + return 'datetime'; + } + + /** + * @inheritDoc + */ + public function mapValue(string $mappedValue, array $criteriaItem) + { + /** @var array */ + $values = $criteriaItem['values'] ?? []; + + if (empty($values)) { + return []; + } + + $mapped = []; + + foreach ($values as $value) { + if (empty($value)) { + continue; + } + $mapped[] = $this->dateTimeHandler->toUserDateTime($value); + } + + $legacyValue = $mapped; + if (count($mapped) === 1) { + $legacyValue = $mapped[0]; + } + + return $legacyValue; + } +} diff --git a/core/legacy/Data/FilterMapper/Mappers/DefaultFilterMapper.php b/core/legacy/Data/FilterMapper/Mappers/DefaultFilterMapper.php new file mode 100644 index 000000000..f660168e5 --- /dev/null +++ b/core/legacy/Data/FilterMapper/Mappers/DefaultFilterMapper.php @@ -0,0 +1,36 @@ +datetimeFormatMap); } + + /** + * To user date format + * @param string $dateString + * @return string + */ + public function toUserDate(string $dateString): string + { + return $this->getFormatter()->toUserDate($dateString); + } + + /** + * To user date format + * @param string $dateString + * @return string + */ + public function toUserDateTime(string $dateString): string + { + return $this->getFormatter()->toUserDateTime($dateString); + } + + /** + * @return DateFormatService + */ + protected function getFormatter(): DateFormatService + { + if ($this->formatter !== null) { + return $this->formatter; + } + + /* @noinspection PhpIncludeInspection */ + require_once 'include/portability/Services/DateTime/DateFormatService.php'; + $this->formatter = new DateFormatService(); + + return $this->formatter; + } } diff --git a/core/src/Service/BulkActions/CsvExportBulkAction.php b/core/src/Service/BulkActions/CsvExportBulkAction.php index 502a81d57..579537f12 100644 --- a/core/src/Service/BulkActions/CsvExportBulkAction.php +++ b/core/src/Service/BulkActions/CsvExportBulkAction.php @@ -4,7 +4,7 @@ namespace App\Service\BulkActions; use ApiPlatform\Core\Exception\InvalidArgumentException; use App\Entity\Process; -use App\Service\LegacyFilterMapper; +use App\Legacy\Data\FilterMapper\LegacyFilterMapper; use App\Service\ModuleNameMapperInterface; use App\Service\ProcessHandlerInterface; diff --git a/tests/unit/core/legacy/Statistics/Series/LeadByStatusCountTest.php b/tests/unit/core/legacy/Statistics/Series/LeadByStatusCountTest.php index f00cd299b..a1cede945 100644 --- a/tests/unit/core/legacy/Statistics/Series/LeadByStatusCountTest.php +++ b/tests/unit/core/legacy/Statistics/Series/LeadByStatusCountTest.php @@ -2,16 +2,20 @@ namespace App\Tests\unit\core\legacy\Statistics; +use App\Legacy\Data\FilterMapper\FilterMappers; +use App\Legacy\Data\FilterMapper\LegacyFilterMapper; use App\Legacy\Data\RecordMapper; use App\Legacy\ModuleNameMapperHandler; -use App\Service\LegacyFilterMapper; use App\Tests\_mock\Mock\core\legacy\Data\ListDataQueryHandlerMock; use App\Tests\_mock\Mock\core\legacy\Statistics\Series\LeadsByStatusCountMock; use App\Tests\UnitTester; use BeanFactory; use Codeception\Test\Unit; +use EmptyIterator; use Exception; +; + /** * Class LeadByStatusCountTest * @package App\Tests @@ -124,7 +128,9 @@ class LeadByStatusCountTest extends Unit $legacyScope ); - $legacyFilterMapper = new LegacyFilterMapper([]); + $filterMappers = new FilterMappers(new EmptyIterator()); + + $legacyFilterMapper = new LegacyFilterMapper([], $filterMappers); $recordMapper = new RecordMapper($moduleNameMapper); $queryHandler = new ListDataQueryHandlerMock($legacyFilterMapper, $recordMapper); diff --git a/tests/unit/core/legacy/Statistics/Series/OpportunitiesBySalesStagePipelineTest.php b/tests/unit/core/legacy/Statistics/Series/OpportunitiesBySalesStagePipelineTest.php index 6df80cd3f..58f668386 100644 --- a/tests/unit/core/legacy/Statistics/Series/OpportunitiesBySalesStagePipelineTest.php +++ b/tests/unit/core/legacy/Statistics/Series/OpportunitiesBySalesStagePipelineTest.php @@ -2,14 +2,16 @@ namespace App\Tests\unit\core\legacy\Statistics; +use App\Legacy\Data\FilterMapper\FilterMappers; +use App\Legacy\Data\FilterMapper\LegacyFilterMapper; use App\Legacy\Data\RecordMapper; use App\Legacy\ModuleNameMapperHandler; -use App\Service\LegacyFilterMapper; use App\Tests\_mock\Mock\core\legacy\Data\ListDataQueryHandlerMock; use App\Tests\_mock\Mock\core\legacy\Statistics\Series\OpportunitiesBySalesStagePipelineMock; use App\Tests\UnitTester; use BeanFactory; use Codeception\Test\Unit; +use EmptyIterator; use Exception; /** @@ -48,7 +50,8 @@ class OpportunitiesBySalesStagePipelineTest extends Unit $legacyScope ); - $legacyFilterMapper = new LegacyFilterMapper([]); + $filterMappers = new FilterMappers(new EmptyIterator()); + $legacyFilterMapper = new LegacyFilterMapper([], $filterMappers); $recordMapper = new RecordMapper($moduleNameMapper); $queryHandler = new ListDataQueryHandlerMock($legacyFilterMapper, $recordMapper);