mirror of
https://gitlab.com/Chill-Projet/chill-bundles.git
synced 2025-08-09 01:09:51 +00:00
Merge branch '259-Génération-de-document-avoir-un-comportement-coherent' into 'master'
Fix activity filter inconsistency in document generation Closes #259 See merge request Chill-Projet/chill-bundles!667
This commit is contained in:
commit
18c0b6a47f
7
.changes/unreleased/Fixed-20240314-211532.yaml
Normal file
7
.changes/unreleased/Fixed-20240314-211532.yaml
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
kind: Fixed
|
||||||
|
body: Keep a consistent behaviour between the filtering of activities within the document
|
||||||
|
generation (model "accompanying period with activities"), and the same filter in
|
||||||
|
the list of activities for an accompanying period
|
||||||
|
time: 2024-03-14T21:15:32.690077164+01:00
|
||||||
|
custom:
|
||||||
|
Issue: "259"
|
@ -243,7 +243,8 @@ final readonly class ActivityACLAwareRepository implements ActivityACLAwareRepos
|
|||||||
thirdparties.thirdpartyids,
|
thirdparties.thirdpartyids,
|
||||||
persons.personids,
|
persons.personids,
|
||||||
actions.socialactionids,
|
actions.socialactionids,
|
||||||
issues.socialissueids
|
issues.socialissueids,
|
||||||
|
a.user_id
|
||||||
|
|
||||||
FROM activity a
|
FROM activity a
|
||||||
LEFT JOIN chill_main_location location ON a.location_id = location.id
|
LEFT JOIN chill_main_location location ON a.location_id = location.id
|
||||||
@ -283,6 +284,7 @@ final readonly class ActivityACLAwareRepository implements ActivityACLAwareRepos
|
|||||||
->addJoinedEntityResult(ActivityPresence::class, 'activityPresence', 'a', 'attendee')
|
->addJoinedEntityResult(ActivityPresence::class, 'activityPresence', 'a', 'attendee')
|
||||||
->addFieldResult('activityPresence', 'presence_id', 'id')
|
->addFieldResult('activityPresence', 'presence_id', 'id')
|
||||||
->addFieldResult('activityPresence', 'presence_name', 'name')
|
->addFieldResult('activityPresence', 'presence_name', 'name')
|
||||||
|
->addScalarResult('user_id', 'userId', Types::INTEGER)
|
||||||
|
|
||||||
// results which cannot be mapped into entity
|
// results which cannot be mapped into entity
|
||||||
->addScalarResult('comment_comment', 'comment', Types::TEXT)
|
->addScalarResult('comment_comment', 'comment', Types::TEXT)
|
||||||
|
@ -11,6 +11,7 @@ declare(strict_types=1);
|
|||||||
|
|
||||||
namespace Chill\ActivityBundle\Service\DocGenerator;
|
namespace Chill\ActivityBundle\Service\DocGenerator;
|
||||||
|
|
||||||
|
use Chill\ActivityBundle\Entity\Activity;
|
||||||
use Chill\ActivityBundle\Entity\ActivityPresence;
|
use Chill\ActivityBundle\Entity\ActivityPresence;
|
||||||
use Chill\ActivityBundle\Entity\ActivityType;
|
use Chill\ActivityBundle\Entity\ActivityType;
|
||||||
use Chill\ActivityBundle\Repository\ActivityACLAwareRepositoryInterface;
|
use Chill\ActivityBundle\Repository\ActivityACLAwareRepositoryInterface;
|
||||||
@ -112,7 +113,7 @@ class ListActivitiesByAccompanyingPeriodContext implements
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return list
|
* @return list<Activity>
|
||||||
*/
|
*/
|
||||||
private function filterActivitiesByUser(array $activities, User $user): array
|
private function filterActivitiesByUser(array $activities, User $user): array
|
||||||
{
|
{
|
||||||
@ -120,6 +121,12 @@ class ListActivitiesByAccompanyingPeriodContext implements
|
|||||||
array_filter(
|
array_filter(
|
||||||
$activities,
|
$activities,
|
||||||
function ($activity) use ($user) {
|
function ($activity) use ($user) {
|
||||||
|
$u = $activity['user'];
|
||||||
|
|
||||||
|
if (null !== $u && $u['username'] === $user->getUsername()) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
$activityUsernames = array_map(static fn ($user) => $user['username'], $activity['users'] ?? []);
|
$activityUsernames = array_map(static fn ($user) => $user['username'], $activity['users'] ?? []);
|
||||||
|
|
||||||
return \in_array($user->getUsername(), $activityUsernames, true);
|
return \in_array($user->getUsername(), $activityUsernames, true);
|
||||||
@ -129,7 +136,7 @@ class ListActivitiesByAccompanyingPeriodContext implements
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return list
|
* @return list<AccompanyingPeriod\AccompanyingPeriodWork>
|
||||||
*/
|
*/
|
||||||
private function filterWorksByUser(array $works, User $user): array
|
private function filterWorksByUser(array $works, User $user): array
|
||||||
{
|
{
|
||||||
@ -216,6 +223,15 @@ class ListActivitiesByAccompanyingPeriodContext implements
|
|||||||
foreach ($activities as $row) {
|
foreach ($activities as $row) {
|
||||||
$activity = $row[0];
|
$activity = $row[0];
|
||||||
|
|
||||||
|
$user = match (null === $row['userId']) {
|
||||||
|
false => $this->userRepository->find($row['userId']),
|
||||||
|
true => null,
|
||||||
|
};
|
||||||
|
|
||||||
|
$activity['user'] = $this->normalizer->normalize($user, 'docgen', [
|
||||||
|
AbstractNormalizer::GROUPS => ['docgen:read'], 'docgen:expects' => User::class,
|
||||||
|
]);
|
||||||
|
|
||||||
$activity['date'] = $this->normalizer->normalize($activity['date'], 'docgen', [
|
$activity['date'] = $this->normalizer->normalize($activity['date'], 'docgen', [
|
||||||
AbstractNormalizer::GROUPS => ['docgen:read'], 'docgen:expects' => \DateTime::class,
|
AbstractNormalizer::GROUPS => ['docgen:read'], 'docgen:expects' => \DateTime::class,
|
||||||
]);
|
]);
|
||||||
|
@ -91,6 +91,29 @@ class ActivityACLAwareRepositoryTest extends KernelTestCase
|
|||||||
self::assertIsArray($actual);
|
self::assertIsArray($actual);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider provideDataFindByAccompanyingPeriod
|
||||||
|
*/
|
||||||
|
public function testfindByAccompanyingPeriodSimplified(AccompanyingPeriod $period, User $user, string $role, ?int $start = 0, ?int $limit = 1000, array $orderBy = ['date' => 'DESC'], array $filters = []): void
|
||||||
|
{
|
||||||
|
$security = $this->prophesize(Security::class);
|
||||||
|
$security->isGranted($role, $period)->willReturn(true);
|
||||||
|
$security->getUser()->willReturn($user);
|
||||||
|
|
||||||
|
$repository = new ActivityACLAwareRepository(
|
||||||
|
$this->authorizationHelperForCurrentUser,
|
||||||
|
$this->centerResolverManager,
|
||||||
|
$this->activityRepository,
|
||||||
|
$this->entityManager,
|
||||||
|
$security->reveal(),
|
||||||
|
$this->requestStack
|
||||||
|
);
|
||||||
|
|
||||||
|
$actual = $repository->findByAccompanyingPeriodSimplified($period);
|
||||||
|
|
||||||
|
self::assertIsArray($actual);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @dataProvider provideDataFindByAccompanyingPeriod
|
* @dataProvider provideDataFindByAccompanyingPeriod
|
||||||
*/
|
*/
|
||||||
@ -301,7 +324,10 @@ class ActivityACLAwareRepositoryTest extends KernelTestCase
|
|||||||
->getQuery()
|
->getQuery()
|
||||||
->getResult()
|
->getResult()
|
||||||
) {
|
) {
|
||||||
throw new \RuntimeException('no jobs found');
|
$job = new UserJob();
|
||||||
|
$job->setLabel(['fr' => 'test']);
|
||||||
|
$this->entityManager->persist($job);
|
||||||
|
$this->entityManager->flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (null === $user = $this->entityManager
|
if (null === $user = $this->entityManager
|
||||||
|
@ -0,0 +1,139 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Chill\ActivityBundle\Tests\Service\DocGenerator;
|
||||||
|
|
||||||
|
use Chill\ActivityBundle\Entity\Activity;
|
||||||
|
use Chill\ActivityBundle\Service\DocGenerator\ListActivitiesByAccompanyingPeriodContext;
|
||||||
|
use Chill\DocGeneratorBundle\Entity\DocGeneratorTemplate;
|
||||||
|
use Chill\MainBundle\Entity\User;
|
||||||
|
use Chill\MainBundle\Repository\UserRepositoryInterface;
|
||||||
|
use Chill\PersonBundle\Entity\AccompanyingPeriod;
|
||||||
|
use Chill\PersonBundle\Repository\AccompanyingPeriodRepository;
|
||||||
|
use Doctrine\ORM\EntityManagerInterface;
|
||||||
|
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @internal
|
||||||
|
*
|
||||||
|
* @coversNothing
|
||||||
|
*/
|
||||||
|
class ListActivitiesByAccompanyingPeriodContextTest extends KernelTestCase
|
||||||
|
{
|
||||||
|
private ListActivitiesByAccompanyingPeriodContext $listActivitiesByAccompanyingPeriodContext;
|
||||||
|
private AccompanyingPeriodRepository $accompanyingPeriodRepository;
|
||||||
|
private UserRepositoryInterface $userRepository;
|
||||||
|
|
||||||
|
protected function setUp(): void
|
||||||
|
{
|
||||||
|
self::bootKernel();
|
||||||
|
$this->listActivitiesByAccompanyingPeriodContext = self::$container->get(ListActivitiesByAccompanyingPeriodContext::class);
|
||||||
|
$this->accompanyingPeriodRepository = self::$container->get(AccompanyingPeriodRepository::class);
|
||||||
|
$this->userRepository = self::$container->get(UserRepositoryInterface::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider provideAccompanyingPeriod
|
||||||
|
*/
|
||||||
|
public function testGetDataWithoutFilteringActivityNorWorks(int $accompanyingPeriodId, int $userId): void
|
||||||
|
{
|
||||||
|
$context = $this->getContext();
|
||||||
|
$template = new DocGeneratorTemplate();
|
||||||
|
$template->setOptions([
|
||||||
|
'mainPerson' => false,
|
||||||
|
'person1' => false,
|
||||||
|
'person2' => false,
|
||||||
|
'thirdParty' => false,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$data = $context->getData(
|
||||||
|
$template,
|
||||||
|
$this->accompanyingPeriodRepository->find($accompanyingPeriodId),
|
||||||
|
['myActivitiesOnly' => false, 'myWorksOnly' => false]
|
||||||
|
);
|
||||||
|
|
||||||
|
self::assertIsArray($data);
|
||||||
|
self::assertArrayHasKey('activities', $data);
|
||||||
|
self::assertIsArray($data['activities']);
|
||||||
|
self::assertGreaterThan(0, count($data['activities']));
|
||||||
|
self::assertIsArray($data['activities'][0]);
|
||||||
|
self::assertArrayHasKey('user', $data['activities'][0]);
|
||||||
|
self::assertIsArray($data['activities'][0]['user']);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider provideAccompanyingPeriod
|
||||||
|
*/
|
||||||
|
public function testGetDataWithoutFilteringActivityByUser(int $accompanyingPeriodId, int $userId): void
|
||||||
|
{
|
||||||
|
$context = $this->getContext();
|
||||||
|
$template = new DocGeneratorTemplate();
|
||||||
|
$template->setOptions([
|
||||||
|
'mainPerson' => false,
|
||||||
|
'person1' => false,
|
||||||
|
'person2' => false,
|
||||||
|
'thirdParty' => false,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$data = $context->getData(
|
||||||
|
$template,
|
||||||
|
$this->accompanyingPeriodRepository->find($accompanyingPeriodId),
|
||||||
|
['myActivitiesOnly' => true, 'myWorksOnly' => false, 'creator' => $this->userRepository->find($userId)]
|
||||||
|
);
|
||||||
|
|
||||||
|
self::assertIsArray($data);
|
||||||
|
self::assertArrayHasKey('activities', $data);
|
||||||
|
self::assertIsArray($data['activities']);
|
||||||
|
self::assertGreaterThan(0, count($data['activities']));
|
||||||
|
self::assertIsArray($data['activities'][0]);
|
||||||
|
self::assertArrayHasKey('user', $data['activities'][0]);
|
||||||
|
self::assertIsArray($data['activities'][0]['user']);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function provideAccompanyingPeriod(): array
|
||||||
|
{
|
||||||
|
self::bootKernel();
|
||||||
|
$em = self::$container->get(EntityManagerInterface::class);
|
||||||
|
|
||||||
|
if (null === $period = $em->createQuery('SELECT a FROM '.AccompanyingPeriod::class.' a')
|
||||||
|
->setMaxResults(1)
|
||||||
|
->getSingleResult()) {
|
||||||
|
throw new \RuntimeException('no period found');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (null === $user = $em->createQuery('SELECT u FROM '.User::class.' u')
|
||||||
|
->setMaxResults(1)
|
||||||
|
->getSingleResult()
|
||||||
|
) {
|
||||||
|
throw new \RuntimeException('no user found');
|
||||||
|
}
|
||||||
|
|
||||||
|
$activity = new Activity();
|
||||||
|
$activity
|
||||||
|
->setAccompanyingPeriod($period)
|
||||||
|
->setUser($user)
|
||||||
|
->setDate(new \DateTime());
|
||||||
|
|
||||||
|
$em->persist($activity);
|
||||||
|
$em->flush();
|
||||||
|
|
||||||
|
self::ensureKernelShutdown();
|
||||||
|
|
||||||
|
return [
|
||||||
|
[$period->getId(), $user->getId()],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
private function getContext(): ListActivitiesByAccompanyingPeriodContext
|
||||||
|
{
|
||||||
|
return $this->listActivitiesByAccompanyingPeriodContext;
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user