mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2025-06-13 05:44:24 +00:00
[wip] add different steps to exports
This commit is contained in:
parent
2711fcee6d
commit
d81b2e1037
@ -22,6 +22,9 @@ namespace Chill\PersonBundle\Export\Aggregator;
|
|||||||
use Chill\MainBundle\Export\AggregatorInterface;
|
use Chill\MainBundle\Export\AggregatorInterface;
|
||||||
use Symfony\Component\Form\FormBuilderInterface;
|
use Symfony\Component\Form\FormBuilderInterface;
|
||||||
use Doctrine\ORM\QueryBuilder;
|
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
|
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');
|
const EUROPE_COUNTRY_CODE = array('BE', 'FR');
|
||||||
|
|
||||||
@ -60,11 +89,14 @@ class NationalityAggregator implements AggregatorInterface
|
|||||||
$qb->addSelect('nationality.countryCode as nationality_aggregator');
|
$qb->addSelect('nationality.countryCode as nationality_aggregator');
|
||||||
} elseif ($data['group_by_level'] === 'continent') {
|
} elseif ($data['group_by_level'] === 'continent') {
|
||||||
$clause = 'CASE '
|
$clause = 'CASE '
|
||||||
. 'WHEN nationality.countryCode IN(:europe_country_codes) THEN \'europe\' '
|
. 'WHEN nationality.countryCode IN(:europe_country_codes) THEN \'EU\' '
|
||||||
. 'ELSE \'other\' '
|
. 'ELSE \'OC\' ' //this is dummy code !
|
||||||
. 'END as nationality_aggregator ';
|
. 'END as nationality_aggregator ';
|
||||||
$qb->addSelect($clause);
|
$qb->addSelect($clause);
|
||||||
$qb->setParameter('europe_country_codes', self::EUROPE_COUNTRY_CODE);
|
$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";
|
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()
|
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
|
// this list is extracted by https://en.wikipedia.org/wiki/List_of_sovereign_states_and_dependent_territories_by_continent_%28data_file%29
|
||||||
|
@ -22,6 +22,7 @@ namespace Chill\PersonBundle\Export\Export;
|
|||||||
use Chill\MainBundle\Export\ExportInterface;
|
use Chill\MainBundle\Export\ExportInterface;
|
||||||
use Doctrine\ORM\QueryBuilder;
|
use Doctrine\ORM\QueryBuilder;
|
||||||
use Symfony\Component\Form\FormBuilderInterface;
|
use Symfony\Component\Form\FormBuilderInterface;
|
||||||
|
use Doctrine\ORM\Query;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
@ -63,6 +64,33 @@ class CountPerson implements ExportInterface
|
|||||||
return $qb;
|
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) {
|
public function buildForm(FormBuilderInterface $builder) {
|
||||||
throw new \LogicException('This export does not require a form');
|
throw new \LogicException('This export does not require a form');
|
||||||
}
|
}
|
||||||
|
@ -81,6 +81,10 @@ services:
|
|||||||
|
|
||||||
chill.person.export.aggregator_nationality:
|
chill.person.export.aggregator_nationality:
|
||||||
class: Chill\PersonBundle\Export\Aggregator\NationalityAggregator
|
class: Chill\PersonBundle\Export\Aggregator\NationalityAggregator
|
||||||
|
arguments:
|
||||||
|
- "@chill.main.countries_repository"
|
||||||
|
- "@chill.main.helper.translatable_string"
|
||||||
|
- "@translator"
|
||||||
tags:
|
tags:
|
||||||
- { name: chill.export_aggregator, alias: person_nationality_aggregator }
|
- { name: chill.export_aggregator, alias: person_nationality_aggregator }
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user