exports: fix activitytype filter/aggregator appliedTo activity_person and too activity_acl

This commit is contained in:
Mathieu Jaumotte 2022-08-17 15:27:37 +02:00
parent c09c7a9615
commit c17036fcda
6 changed files with 45 additions and 45 deletions

View File

@ -45,16 +45,24 @@ class ActivityTypeAggregator implements AggregatorInterface
public function alterQuery(QueryBuilder $qb, $data) public function alterQuery(QueryBuilder $qb, $data)
{ {
// add select element if (!in_array('type', $qb->getAllAliases())) {
$qb->addSelect(sprintf('IDENTITY(activity.type) AS %s', self::KEY)); $qb->join('activity.activityType', 'type');
}
// add the "group by" part $qb->addSelect(sprintf('IDENTITY(activity.activityType) AS %s', self::KEY));
$qb->addGroupBy(self::KEY);
$groupby = $qb->getDQLPart('groupBy');
if (!empty($groupBy)) {
$qb->addGroupBy(self::KEY);
} else {
$qb->groupBy(self::KEY);
}
} }
public function applyOn(): string public function applyOn(): string
{ {
return Declarations::ACTIVITY_PERSON; return Declarations::ACTIVITY;
} }
public function buildForm(FormBuilderInterface $builder) public function buildForm(FormBuilderInterface $builder)

View File

@ -11,13 +11,15 @@ declare(strict_types=1);
namespace Chill\ActivityBundle\Export\Export\LinkedToACP; namespace Chill\ActivityBundle\Export\Export\LinkedToACP;
use Chill\ActivityBundle\Entity\Activity;
use Chill\ActivityBundle\Export\Declarations; use Chill\ActivityBundle\Export\Declarations;
use Chill\ActivityBundle\Repository\ActivityRepository;
use Chill\ActivityBundle\Security\Authorization\ActivityStatsVoter; use Chill\ActivityBundle\Security\Authorization\ActivityStatsVoter;
use Chill\MainBundle\Export\ExportInterface; use Chill\MainBundle\Export\ExportInterface;
use Chill\MainBundle\Export\FormatterInterface; use Chill\MainBundle\Export\FormatterInterface;
use Chill\MainBundle\Export\GroupedExportInterface; use Chill\MainBundle\Export\GroupedExportInterface;
use Chill\PersonBundle\Export\Declarations as PersonDeclarations; use Chill\PersonBundle\Export\Declarations as PersonDeclarations;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\Query; use Doctrine\ORM\Query;
use LogicException; use LogicException;
use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormBuilderInterface;
@ -25,12 +27,12 @@ use Symfony\Component\Security\Core\Role\Role;
class CountActivity implements ExportInterface, GroupedExportInterface class CountActivity implements ExportInterface, GroupedExportInterface
{ {
protected ActivityRepository $activityRepository; protected EntityRepository $repository;
public function __construct( public function __construct(
ActivityRepository $activityRepository EntityManagerInterface $em
) { ) {
$this->activityRepository = $activityRepository; $this->repository = $em->getRepository(Activity::class);
} }
public function buildForm(FormBuilderInterface $builder) public function buildForm(FormBuilderInterface $builder)
@ -78,17 +80,12 @@ class CountActivity implements ExportInterface, GroupedExportInterface
public function initiateQuery(array $requiredModifiers, array $acl, array $data = []) public function initiateQuery(array $requiredModifiers, array $acl, array $data = [])
{ {
$centers = array_map(static fn ($el) => $el['center'], $acl); $qb = $this->repository->createQueryBuilder('activity')
->join('activity.accompanyingPeriod', 'acp')
$qb = $this ;
->activityRepository
->createQueryBuilder('activity')
->select('COUNT(activity.id) as export_count_activity');
$qb->andWhere(
$qb->expr()->isNotNull('activity.accompanyingPeriod')
);
$qb->select('COUNT(activity.id) as export_count_activity');
return $qb; return $qb;
} }

View File

@ -80,15 +80,16 @@ class CountActivity implements ExportInterface, GroupedExportInterface
{ {
$centers = array_map(static fn ($el) => $el['center'], $acl); $centers = array_map(static fn ($el) => $el['center'], $acl);
$qb = $this $qb = $this->activityRepository->createQueryBuilder('activity')
->activityRepository ->join('activity.person', 'person')
->createQueryBuilder('activity') ;
->select('COUNT(activity.id) as export_count_activity')
->join('activity.person', 'person'); $qb->select('COUNT(activity.id) as export_count_activity');
$qb $qb
->where($qb->expr()->in('person.center', ':centers')) ->where($qb->expr()->in('person.center', ':centers'))
->setParameter('centers', $centers); ->setParameter('centers', $centers)
;
return $qb; return $qb;
} }

View File

@ -64,37 +64,31 @@ class ActivityTypeFilter implements ExportElementValidatedInterface, FilterInter
public function applyOn(): string public function applyOn(): string
{ {
return Declarations::ACTIVITY_PERSON; return Declarations::ACTIVITY;
} }
public function buildForm(FormBuilderInterface $builder) public function buildForm(FormBuilderInterface $builder)
{ {
$builder->add( $builder->add('types', EntityType::class, [
'types', 'class' => ActivityType::class,
EntityType::class, 'choice_label' => fn (ActivityType $type) => $this->translatableStringHelper->localize($type->getName()),
[ 'group_by' => fn (ActivityType $type) => $this->translatableStringHelper->localize($type->getCategory()->getName()),
'class' => ActivityType::class, 'multiple' => true,
'choice_label' => fn (ActivityType $type) => $this->translatableStringHelper->localize($type->getName()), 'expanded' => false,
'multiple' => true, ]);
'expanded' => false,
]
);
} }
public function describeAction($data, $format = 'string') public function describeAction($data, $format = 'string')
{ {
// collect all the reasons'name used in this filter in one array // collect all the reasons'name used in this filter in one array
$reasonsNames = array_map( $reasonsNames = array_map(
fn (ActivityType $t): string => '"' . $this->translatableStringHelper->localize($t->getName()) . '"', fn (ActivityType $t): string => $this->translatableStringHelper->localize($t->getName()),
$this->activityTypeRepository->findBy(['id' => $data['types']->toArray()]) $this->activityTypeRepository->findBy(['id' => $data['types']->toArray()])
); );
return [ return ['Filtered by activity type: only %list%', [
'Filtered by activity type: only %list%', '%list%' => implode(', ou ', $reasonsNames),
[ ]];
'%list%' => implode(', ', $reasonsNames),
],
];
} }
public function getTitle() public function getTitle()

View File

@ -230,7 +230,7 @@ Average activities linked to an accompanying period visit duration by various pa
#filters #filters
Filter by reason: Filtrer par sujet d'activité Filter by reason: Filtrer par sujet d'activité
'Filtered by reasons: only %list%': 'Filtré par sujet: seulement %list%' 'Filtered by reasons: only %list%': 'Filtré par sujet: seulement %list%'
'Filtered by activity type: only %list%': "Filtré par type d'activité: seulement %list%" 'Filtered by activity type: only %list%': "Filtré par type d'activité: uniquement %list%"
Filtered by date activity: Filtrer par date d'activité Filtered by date activity: Filtrer par date d'activité
Activities after this date: Activités après cette date Activities after this date: Activités après cette date
Activities before this date: Activités avant cette date Activities before this date: Activités avant cette date

View File

@ -195,7 +195,7 @@ Number of activities: Nombre d'activités
#filters #filters
Filter by reason: Filtrer par sujet d'activité Filter by reason: Filtrer par sujet d'activité
'Filtered by reasons: only %list%': 'Filtré par sujet: seulement %list%' 'Filtered by reasons: only %list%': 'Filtré par sujet: seulement %list%'
'Filtered by activity type: only %list%': "Filtré par type d'activity: seulement %list%" 'Filtered by activity type: only %list%': "Filtré par type d'activity: uniquement %list%"
Filtered by date activity: Filtrer par date d'activité Filtered by date activity: Filtrer par date d'activité
Activities after this date: Activités après cette date Activities after this date: Activités après cette date
Activities before this date: Activités avant cette date Activities before this date: Activités avant cette date