actiontype, goal, and result aggregators created

This commit is contained in:
Julie Lenaerts 2022-07-28 15:44:17 +02:00
parent d6b3ba48c0
commit e6b66216ae
4 changed files with 268 additions and 0 deletions

View File

@ -0,0 +1,85 @@
<?php
/**
* Chill is a software for social workers
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
declare(strict_types=1);
namespace Chill\PersonBundle\Export\Aggregator;
use Chill\MainBundle\Export\AggregatorInterface;
use Chill\PersonBundle\Export\Declarations;
use Chill\PersonBundle\Repository\SocialWork\SocialActionRepository;
use Chill\PersonBundle\Templating\Entity\SocialActionRender;
use Doctrine\ORM\QueryBuilder;
use Symfony\Component\Form\FormBuilderInterface;
final class ActionTypeAggregator implements AggregatorInterface
{
private SocialActionRepository $socialActionRepository;
private SocialActionRender $socialActionRender;
public function __construct(SocialActionRepository $socialActionRepository)
{
$this->socialActionRepository = $socialActionRepository;
}
public function addRole()
{
return null;
}
public function alterQuery(QueryBuilder $qb, $data)
{
$qb->join('acpw.socialAction', 'sa');
$qb->addSelect('sa.id as action_type_aggregator');
$groupBy = $qb->getDQLPart('groupBy');
if (!empty($groupBy)) {
$qb->addGroupBy('action_type_aggregator');
} else {
$qb->groupBy('action_type_aggregator');
}
}
public function applyOn()
{
return Declarations::SOCIAL_WORK_ACTION_TYPE;
}
public function buildForm(FormBuilderInterface $builder)
{
// no form
}
public function getLabels($key, array $values, $data)
{
//TODO certain social actions have the same title as other, but are linked to different social issues, should we make a visual distinction?
return function ($value): string {
if ('_header' === $value) {
return 'Social Action Type';
}
$sa = $this->socialActionRepository->find($value);
return $sa->getTitle()['fr'];
};
}
public function getQueryKeys($data)
{
return ['action_type_aggregator'];
}
public function getTitle()
{
return 'Group social work actions by action type';
}
}

View File

@ -0,0 +1,81 @@
<?php
/**
* Chill is a software for social workers
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
declare(strict_types=1);
namespace Chill\PersonBundle\Export\Aggregator;
use Chill\MainBundle\Export\AggregatorInterface;
use Chill\PersonBundle\Export\Declarations;
use Chill\PersonBundle\Repository\SocialWork\GoalRepository;
use Doctrine\ORM\QueryBuilder;
use Symfony\Component\Form\FormBuilderInterface;
final class GoalAggregator implements AggregatorInterface
{
private GoalRepository $goalRepository;
public function __construct(GoalRepository $goalRepository)
{
$this->goalRepository = $goalRepository;
}
public function addRole()
{
return null;
}
public function alterQuery(QueryBuilder $qb, $data)
{
$qb->join('acpw.goals', 'g');
$qb->addSelect('g.id as goal_aggregator');
$groupBy = $qb->getDQLPart('groupBy');
if (!empty($groupBy)) {
$qb->addGroupBy('goal_aggregator');
} else {
$qb->groupBy('goal_aggregator');
}
}
public function applyOn()
{
return Declarations::SOCIAL_WORK_ACTION_TYPE;
}
public function buildForm(FormBuilderInterface $builder)
{
// no form
}
public function getLabels($key, array $values, $data)
{
return function ($value): string {
if ('_header' === $value) {
return 'Goal Type';
}
$g = $this->goalRepository->find($value);
return $g->getTitle()['fr'];
};
}
public function getQueryKeys($data)
{
return ['goal_aggregator'];
}
public function getTitle()
{
return 'Group social work actions by goal';
}
}

View File

@ -0,0 +1,81 @@
<?php
/**
* Chill is a software for social workers
*
* For the full copyright and license information, please view
* the LICENSE file that was distributed with this source code.
*/
declare(strict_types=1);
namespace Chill\PersonBundle\Export\Aggregator;
use Chill\MainBundle\Export\AggregatorInterface;
use Chill\PersonBundle\Export\Declarations;
use Chill\PersonBundle\Repository\SocialWork\ResultRepository;
use Doctrine\ORM\QueryBuilder;
use Symfony\Component\Form\FormBuilderInterface;
final class ResultAggregator implements AggregatorInterface
{
private ResultRepository $resultRepository;
public function __construct(ResultRepository $resultRepository)
{
$this->resultRepository = $resultRepository;
}
public function addRole()
{
return null;
}
public function alterQuery(QueryBuilder $qb, $data)
{
$qb->join('acpw.results', 'r');
$qb->addSelect('r.id as result_aggregator');
$groupBy = $qb->getDQLPart('groupBy');
if (!empty($groupBy)) {
$qb->addGroupBy('result_aggregator');
} else {
$qb->groupBy('result_aggregator');
}
}
public function applyOn()
{
return Declarations::SOCIAL_WORK_ACTION_TYPE;
}
public function buildForm(FormBuilderInterface $builder)
{
// no form
}
public function getLabels($key, array $values, $data)
{
return function ($value): string {
if ('_header' === $value) {
return 'Result Type';
}
$g = $this->resultRepository->find($value);
return $g->getTitle()['fr'];
};
}
public function getQueryKeys($data)
{
return ['result_aggregator'];
}
public function getTitle()
{
return 'Group social work actions by result';
}
}

View File

@ -57,3 +57,24 @@ services:
autoconfigure: true
tags:
- { name: chill.export_aggregator, alias: social_work_actions_referrer_scope_aggregator }
chill.person.export.aggregator_action_type:
class: Chill\PersonBundle\Export\Aggregator\ActionTypeAggregator
autowire: true
autoconfigure: true
tags:
- { name: chill.export_aggregator, alias: social_work_actions_action_type_aggregator }
chill.person.export.aggregator_goal:
class: Chill\PersonBundle\Export\Aggregator\GoalAggregator
autowire: true
autoconfigure: true
tags:
- { name: chill.export_aggregator, alias: social_work_actions_goal_aggregator }
chill.person.export.aggregator_result:
class: Chill\PersonBundle\Export\Aggregator\ResultAggregator
autowire: true
autoconfigure: true
tags:
- { name: chill.export_aggregator, alias: social_work_actions_result_aggregator }