diff --git a/src/Bundle/ChillActivityBundle/Service/DocGenerator/ActivityContext.php b/src/Bundle/ChillActivityBundle/Service/DocGenerator/ActivityContext.php index 01b7e2945..ad570a8a4 100644 --- a/src/Bundle/ChillActivityBundle/Service/DocGenerator/ActivityContext.php +++ b/src/Bundle/ChillActivityBundle/Service/DocGenerator/ActivityContext.php @@ -147,6 +147,32 @@ class ActivityContext implements } } + public function contextGenerationDataDenormalize(DocGeneratorTemplate $template, $entity, array $data): array + { + $denormalized = []; + + foreach (['mainPerson', 'person1', 'person2'] as $k) { + if (null !== ($id = ($data[$k] ?? null))) { + $denormalized[$k] = $this->personRepository->find($id); + } else { + $denormalized[$k] = null; + } + } + + return $denormalized; + } + + public function contextGenerationDataNormalize(DocGeneratorTemplate $template, $entity, array $data): array + { + $normalized = []; + + foreach (['mainPerson', 'person1', 'person2'] as $k) { + $normalized[$k] = null === $data[$k] ? null : $data[$k]->getId(); + } + + return $normalized; + } + public function getData(DocGeneratorTemplate $template, $entity, array $contextGenerationData = []): array { if (!$entity instanceof Activity) { @@ -214,32 +240,6 @@ class ActivityContext implements return $options['mainPerson'] || $options['person1'] || $options['person2']; } - public function contextGenerationDataNormalize(DocGeneratorTemplate $template, $entity, array $data): array - { - $normalized = []; - - foreach (['mainPerson', 'person1', 'person2'] as $k) { - $normalized[$k] = null === $data[$k] ? null : $data[$k]->getId(); - } - - return $normalized; - } - - public function contextGenerationDataDenormalize(DocGeneratorTemplate $template, $entity, array $data): array - { - $denormalized = []; - - foreach (['mainPerson', 'person1', 'person2'] as $k) { - if (null !== ($id = ($data[$k] ?? null))) { - $denormalized[$k] = $this->personRepository->find($id); - } else { - $denormalized[$k] = null; - } - } - - return $denormalized; - } - public function storeGenerated(DocGeneratorTemplate $template, StoredObject $storedObject, object $entity, array $contextGenerationData): void { $storedObject->setTitle($this->translatableStringHelper->localize($template->getName())); diff --git a/src/Bundle/ChillActivityBundle/Service/DocGenerator/ListActivitiesByAccompanyingPeriodContext.php b/src/Bundle/ChillActivityBundle/Service/DocGenerator/ListActivitiesByAccompanyingPeriodContext.php index 7e1873710..266fadfee 100644 --- a/src/Bundle/ChillActivityBundle/Service/DocGenerator/ListActivitiesByAccompanyingPeriodContext.php +++ b/src/Bundle/ChillActivityBundle/Service/DocGenerator/ListActivitiesByAccompanyingPeriodContext.php @@ -34,10 +34,16 @@ use Chill\ThirdPartyBundle\Entity\ThirdParty; use Chill\ThirdPartyBundle\Repository\ThirdPartyRepository; use DateTime; use libphonenumber\PhoneNumber; +use Symfony\Component\Form\Extension\Core\Type\CheckboxType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Serializer\Normalizer\AbstractNormalizer; use Symfony\Component\Serializer\Normalizer\NormalizerInterface; +use function in_array; +/** + * @implements DocGeneratorContextWithPublicFormInterface + * @implements DocGeneratorContextWithAdminFormInterface + */ class ListActivitiesByAccompanyingPeriodContext implements DocGeneratorContextWithAdminFormInterface, DocGeneratorContextWithPublicFormInterface @@ -69,7 +75,7 @@ class ListActivitiesByAccompanyingPeriodContext implements SocialIssueRepository $socialIssueRepository, ThirdPartyRepository $thirdPartyRepository, TranslatableStringHelperInterface $translatableStringHelper, - UserRepository $userRepository + UserRepository $userRepository, ) { $this->accompanyingPeriodContext = $accompanyingPeriodContext; $this->activityACLAwareRepository = $activityACLAwareRepository; @@ -100,14 +106,86 @@ class ListActivitiesByAccompanyingPeriodContext implements public function buildPublicForm(FormBuilderInterface $builder, DocGeneratorTemplate $template, $entity): void { $this->accompanyingPeriodContext->buildPublicForm($builder, $template, $entity); + + $builder + ->add('myActivitiesOnly', CheckboxType::class, [ + 'required' => false, + 'label' => 'docgen.myActivitiesOnly', + ]) + ->add('myWorksOnly', CheckboxType::class, [ + 'required' => false, + 'label' => 'docgen.myWorksOnly', + ]); } - public function getData(DocGeneratorTemplate $template, $entity, array $contextGenerationData = []): array + public function contextGenerationDataDenormalize(DocGeneratorTemplate $template, $entity, array $data): array + { + + $denormalized = $this->accompanyingPeriodContext->contextGenerationDataDenormalize($template, $entity, $data); + + foreach (['myActivitiesOnly', 'myWorksOnly'] as $k) { + $denormalized[$k] = $data[$k]; + } + + return $denormalized; + } + + public function contextGenerationDataNormalize(DocGeneratorTemplate $template, $entity, array $data): array + { + $normalized = $this->accompanyingPeriodContext->contextGenerationDataNormalize($template, $entity, $data); + + foreach (['myActivitiesOnly', 'myWorksOnly'] as $k) { + $normalized[$k] = $data[$k] ?? false; + } + + return $normalized; + } + + private function filterActivitiesByUser(array $activities, User $user): array + { + return array_filter( + $activities, + function ($activity) use ($user) { + $activityUsernames = array_map(static function ($user) { + return $user['username']; + }, $activity['users'] ?? []); + return in_array($user->getUsername(), $activityUsernames, true); + } + ); + } + + private function filterWorksByUser(array $works, User $user): array + { + return array_filter( + $works, + function ($work) use ($user) { + $workUsernames = array_map(static function ($user) { + return $user['username']; + }, $work['referrers'] ?? []); + + return in_array($user->getUsername(), $workUsernames, true); + } + ); + } + + public function getData(DocGeneratorTemplate $template, object $entity, array $contextGenerationData = []): array { $data = $this->accompanyingPeriodContext->getData($template, $entity, $contextGenerationData); - $data['activities'] = $this->getActivitiesSimplified($entity); + $activities = $this->getActivitiesSimplified($entity); + $myActivitiesOnly = $contextGenerationData['myActivitiesOnly']; + if ($myActivitiesOnly && isset($contextGenerationData['creator'])) { + $activities = $this->filterActivitiesByUser($activities, $contextGenerationData['creator']); + } + + $data['activities'] = $activities; + + $myWorksOnly = $contextGenerationData['myWorksOnly']; + + if ($myWorksOnly && isset($contextGenerationData['creator'])) { + $data['course']['works'] = $this->filterWorksByUser($data['course']['works'], $contextGenerationData['creator']); + } return $data; } @@ -143,17 +221,7 @@ class ListActivitiesByAccompanyingPeriodContext implements public function hasPublicForm(DocGeneratorTemplate $template, $entity): bool { - return $this->accompanyingPeriodContext->hasPublicForm($template, $entity); - } - - public function contextGenerationDataNormalize(DocGeneratorTemplate $template, $entity, array $data): array - { - return $this->accompanyingPeriodContext->contextGenerationDataNormalize($template, $entity, $data); - } - - public function contextGenerationDataDenormalize(DocGeneratorTemplate $template, $entity, array $data): array - { - return $this->accompanyingPeriodContext->contextGenerationDataDenormalize($template, $entity, $data); + return true; } public function storeGenerated(DocGeneratorTemplate $template, StoredObject $storedObject, object $entity, array $contextGenerationData): void diff --git a/src/Bundle/ChillActivityBundle/translations/messages.fr.yml b/src/Bundle/ChillActivityBundle/translations/messages.fr.yml index 18ab56dfe..b64635f69 100644 --- a/src/Bundle/ChillActivityBundle/translations/messages.fr.yml +++ b/src/Bundle/ChillActivityBundle/translations/messages.fr.yml @@ -326,9 +326,11 @@ This is the minimal activity data: Activité n° docgen: Activity basic: Echange - A basic context for activity: Contexte pour les activités - Accompanying period with a list of activities: Parcours d'accompagnement avec liste des activités - Accompanying period with a list of activities description: Ce contexte reprend les informations du parcours, et tous les activités pour un parcours. Les activités ne sont pas filtrés. + A basic context for activity: Contexte pour les échanges + Accompanying period with a list of activities: Parcours d'accompagnement avec liste des échanges + Accompanying period with a list of activities description: Ce contexte reprend les informations du parcours, et tous les échanges pour un parcours. Les échanges ne sont pas filtrés. + myActivitiesOnly: Prendre en compte uniquement les échanges dans lesquels je suis intervenu + myWorksOnly: Prendre en compte uniquement les actions d'accompagnement dont je suis référent export: list: diff --git a/src/Bundle/ChillCalendarBundle/Service/DocGenerator/CalendarContext.php b/src/Bundle/ChillCalendarBundle/Service/DocGenerator/CalendarContext.php index f5b244027..cabb7dcce 100644 --- a/src/Bundle/ChillCalendarBundle/Service/DocGenerator/CalendarContext.php +++ b/src/Bundle/ChillCalendarBundle/Service/DocGenerator/CalendarContext.php @@ -31,8 +31,6 @@ use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Serializer\Normalizer\NormalizerInterface; use function count; -/** - */ final class CalendarContext implements CalendarContextInterface { private BaseContextData $baseContextData; @@ -150,10 +148,8 @@ final class CalendarContext implements CalendarContextInterface } /** - * param array{mainPerson?: Person, thirdParty?: ThirdParty, title: string} $contextGenerationData - * @param mixed $entity */ - public function getData(DocGeneratorTemplate $template, $entity, array $contextGenerationData = []): array + public function getData(DocGeneratorTemplate $template, mixed $entity, array $contextGenerationData = []): array { $options = $this->getOptions($template); @@ -274,9 +270,6 @@ final class CalendarContext implements CalendarContextInterface return $denormalized; } - /** - * param array{mainPerson?: Person, thirdParty?: ThirdParty, title: string} $contextGenerationData - */ public function storeGenerated(DocGeneratorTemplate $template, StoredObject $storedObject, object $entity, array $contextGenerationData): void { $options = $this->getOptions($template); @@ -287,9 +280,6 @@ final class CalendarContext implements CalendarContextInterface $this->entityManager->persist($doc); } - /** - * return array{askMainPerson: bool, mainPersonLabel: ?string, askThirdParty: bool, thirdPartyLabel: ?string, trackDateTime: bool} $options - */ private function getOptions(DocGeneratorTemplate $template): array { return $template->getOptions(); diff --git a/src/Bundle/ChillCalendarBundle/Service/DocGenerator/CalendarContextInterface.php b/src/Bundle/ChillCalendarBundle/Service/DocGenerator/CalendarContextInterface.php index 4ae85d33a..527203003 100644 --- a/src/Bundle/ChillCalendarBundle/Service/DocGenerator/CalendarContextInterface.php +++ b/src/Bundle/ChillCalendarBundle/Service/DocGenerator/CalendarContextInterface.php @@ -12,6 +12,7 @@ declare(strict_types=1); namespace Chill\CalendarBundle\Service\DocGenerator; use Chill\CalendarBundle\Entity\Calendar; +use Chill\DocGeneratorBundle\Context\DocGeneratorContextInterface; use Chill\DocGeneratorBundle\Context\DocGeneratorContextWithAdminFormInterface; use Chill\DocGeneratorBundle\Context\DocGeneratorContextWithPublicFormInterface; use Chill\DocGeneratorBundle\Entity\DocGeneratorTemplate; @@ -19,37 +20,9 @@ use Chill\DocStoreBundle\Entity\StoredObject; use Symfony\Component\Form\FormBuilderInterface; /** - * @template-extends DocGeneratorContextWithPublicFormInterface + * @extends DocGeneratorContextWithPublicFormInterface + * @extends DocGeneratorContextWithAdminFormInterface */ interface CalendarContextInterface extends DocGeneratorContextWithPublicFormInterface, DocGeneratorContextWithAdminFormInterface { - public function adminFormReverseTransform(array $data): array; - - public function adminFormTransform(array $data): array; - - public function buildAdminForm(FormBuilderInterface $builder): void; - - public function buildPublicForm(FormBuilderInterface $builder, DocGeneratorTemplate $template, $entity): void; - - public function getData(DocGeneratorTemplate $template, $entity, array $contextGenerationData = []): array; - - public function getDescription(): string; - - public function getEntityClass(): string; - - public function getFormData(DocGeneratorTemplate $template, $entity): array; - - public static function getKey(): string; - - public function getName(): string; - - public function hasAdminForm(): bool; - - public function hasPublicForm(DocGeneratorTemplate $template, $entity): bool; - - public function contextGenerationDataNormalize(DocGeneratorTemplate $template, $entity, array $data): array; - - public function contextGenerationDataDenormalize(DocGeneratorTemplate $template, $entity, array $data): array; - - public function storeGenerated(DocGeneratorTemplate $template, StoredObject $storedObject, object $entity, array $contextGenerationData): void; } diff --git a/src/Bundle/ChillDocGeneratorBundle/Context/DocGeneratorContextWithAdminFormInterface.php b/src/Bundle/ChillDocGeneratorBundle/Context/DocGeneratorContextWithAdminFormInterface.php index 4707bf398..732d4b796 100644 --- a/src/Bundle/ChillDocGeneratorBundle/Context/DocGeneratorContextWithAdminFormInterface.php +++ b/src/Bundle/ChillDocGeneratorBundle/Context/DocGeneratorContextWithAdminFormInterface.php @@ -13,6 +13,10 @@ namespace Chill\DocGeneratorBundle\Context; use Symfony\Component\Form\FormBuilderInterface; +/** + * @template T of object + * @extends DocGeneratorContextInterface + */ interface DocGeneratorContextWithAdminFormInterface extends DocGeneratorContextInterface { public function adminFormReverseTransform(array $data): array; diff --git a/src/Bundle/ChillDocGeneratorBundle/Context/DocGeneratorContextWithPublicFormInterface.php b/src/Bundle/ChillDocGeneratorBundle/Context/DocGeneratorContextWithPublicFormInterface.php index a60a35123..496524206 100644 --- a/src/Bundle/ChillDocGeneratorBundle/Context/DocGeneratorContextWithPublicFormInterface.php +++ b/src/Bundle/ChillDocGeneratorBundle/Context/DocGeneratorContextWithPublicFormInterface.php @@ -15,7 +15,8 @@ use Chill\DocGeneratorBundle\Entity\DocGeneratorTemplate; use Symfony\Component\Form\FormBuilderInterface; /** - * @template T + * @template T of object + * @extends DocGeneratorContextInterface */ interface DocGeneratorContextWithPublicFormInterface extends DocGeneratorContextInterface {