diff --git a/Export/Aggregator/NationalityAggregator.php b/Export/Aggregator/NationalityAggregator.php index 1c08d0111..ce1a991b0 100644 --- a/Export/Aggregator/NationalityAggregator.php +++ b/Export/Aggregator/NationalityAggregator.php @@ -22,6 +22,9 @@ namespace Chill\PersonBundle\Export\Aggregator; use Chill\MainBundle\Export\AggregatorInterface; use Symfony\Component\Form\FormBuilderInterface; use Doctrine\ORM\QueryBuilder; +use Doctrine\ORM\EntityRepository; +use Chill\MainBundle\Templating\TranslatableStringHelper; +use Symfony\Component\Translation\TranslatorInterface; /** * @@ -30,6 +33,32 @@ use Doctrine\ORM\QueryBuilder; */ class NationalityAggregator implements AggregatorInterface { + /** + * + * @var EntityRepository + */ + protected $countriesRepository; + + /** + * + * @var TranslatableStringHelper + */ + protected $translatableStringHelper; + + /** + * + * @var TranslatorInterface + */ + protected $translator; + + public function __construct(EntityRepository $countriesRepository, + TranslatableStringHelper $translatableStringHelper, + TranslatorInterface $translator) + { + $this->countriesRepository = $countriesRepository; + $this->translatableStringHelper = $translatableStringHelper; + $this->translator = $translator; + } const EUROPE_COUNTRY_CODE = array('BE', 'FR'); @@ -60,11 +89,14 @@ class NationalityAggregator implements AggregatorInterface $qb->addSelect('nationality.countryCode as nationality_aggregator'); } elseif ($data['group_by_level'] === 'continent') { $clause = 'CASE ' - . 'WHEN nationality.countryCode IN(:europe_country_codes) THEN \'europe\' ' - . 'ELSE \'other\' ' + . 'WHEN nationality.countryCode IN(:europe_country_codes) THEN \'EU\' ' + . 'ELSE \'OC\' ' //this is dummy code ! . 'END as nationality_aggregator '; $qb->addSelect($clause); $qb->setParameter('europe_country_codes', self::EUROPE_COUNTRY_CODE); + } else { + throw new \LogicException("The group_by_level '".$data['group_by_level'] + ." is not known."); } @@ -86,6 +118,48 @@ class NationalityAggregator implements AggregatorInterface return "Group people by nationality"; } + public function getQueryKeys($data) + { + return array('nationality_aggregator'); + } + + public function getLabels($key, array $values, $data) + { + if ($data['group_by_level'] === 'country') { + $qb = $this->countriesRepository->createQueryBuilder('c'); + + $countries = $qb + ->andWhere($qb->expr()->in('c.countryCode', ':countries')) + ->setParameter('countries', $values) + ->getQuery() + ->getResult(\Doctrine\ORM\Query::HYDRATE_SCALAR); + + // initialize array and add blank key for null values + $labels[''] = $this->translator->trans('without data'); + $labels['_header'] = $this->translator->trans('Nationality'); + foreach($countries as $row) { + $labels[$row['c_countryCode']] = $this->translatableStringHelper->localize($row['c_name']); + } + + return $labels; + + } elseif ($data['group_by_level'] === 'continent') { + + return array( + 'EU' => $this->translator->trans('Europe'), + 'AS' => $this->translator->trans('Asia'), + 'AN' => $this->translator->trans('Antartica'), + 'AF' => $this->translator->trans('Africa'), + 'SA' => $this->translator->trans('South America'), + 'NA' => $this->translator->trans('North America'), + 'OC' => $this->translator->trans('Oceania'), + '' => $this->translator->trans('without data'), + '_header' => $this->translator->trans('Continent') + ); + } + + } + public static function getCountryData() { // this list is extracted by https://en.wikipedia.org/wiki/List_of_sovereign_states_and_dependent_territories_by_continent_%28data_file%29 diff --git a/Export/Export/CountPerson.php b/Export/Export/CountPerson.php index d5772b39f..e4185ba9f 100644 --- a/Export/Export/CountPerson.php +++ b/Export/Export/CountPerson.php @@ -22,6 +22,7 @@ namespace Chill\PersonBundle\Export\Export; use Chill\MainBundle\Export\ExportInterface; use Doctrine\ORM\QueryBuilder; use Symfony\Component\Form\FormBuilderInterface; +use Doctrine\ORM\Query; /** * @@ -63,6 +64,33 @@ class CountPerson implements ExportInterface return $qb; } + public function getResult($qb, $data) + { + return $qb->getQuery()->getResult(Query::HYDRATE_SCALAR); + } + + public function getQueryKeys($data) + { + return array('export_result'); + } + + public function getLabels($key, array $values, $data) + { + if ($key !== 'export_result') { + throw new \LogicException("the key $key is not used by this export"); + } + + $labels = array_combine($values, $values); + $labels['_header'] = 'Number of people'; + + return $labels; + } + + public function getAllowedFormattersTypes() + { + return array('tabular'); + } + public function buildForm(FormBuilderInterface $builder) { throw new \LogicException('This export does not require a form'); } diff --git a/Resources/config/services.yml b/Resources/config/services.yml index 575fe4b95..55e939020 100644 --- a/Resources/config/services.yml +++ b/Resources/config/services.yml @@ -81,6 +81,10 @@ services: chill.person.export.aggregator_nationality: class: Chill\PersonBundle\Export\Aggregator\NationalityAggregator + arguments: + - "@chill.main.countries_repository" + - "@chill.main.helper.translatable_string" + - "@translator" tags: - { name: chill.export_aggregator, alias: person_nationality_aggregator } \ No newline at end of file