mirror of
				https://gitlab.com/Chill-Projet/chill-bundles.git
				synced 2025-10-31 01:08:26 +00:00 
			
		
		
		
	Compare commits
	
		
			13 Commits
		
	
	
		
			454-evalua
			...
			375-notifi
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 10de431c48 | |||
| cb173c6341 | |||
| 20bbb6b485 | |||
| c731f1967b | |||
| 2434d91e4a | |||
| 13a4795333 | |||
| 2bb5776002 | |||
| 34dde37789 | |||
| 609b8f9af1 | |||
| 57d922c05e | |||
| ad579f3269 | |||
| 30e1416018 | |||
| b6b03cfcec | 
| @@ -80,6 +80,8 @@ export default { | ||||
|                     return appMessages.fr.the_evaluation_document; | ||||
|                 case "Chill\\MainBundle\\Entity\\Workflow\\EntityWorkflow": | ||||
|                     return appMessages.fr.the_workflow; | ||||
|                 case "Chill\\TaskBundle\\Entity\\SingleTask": | ||||
|                     return appMessages.fr.the_task; | ||||
|                 default: | ||||
|                     throw "notification type unknown"; | ||||
|             } | ||||
| @@ -96,6 +98,8 @@ export default { | ||||
|                     return `/fr/person/accompanying-period/work/evaluation/document/${n.relatedEntityId}/show`; | ||||
|                 case "Chill\\MainBundle\\Entity\\Workflow\\EntityWorkflow": | ||||
|                     return `/fr/main/workflow/${n.relatedEntityId}/show`; | ||||
|                 case "Chill\\TaskBundle\\Entity\\SingleTask": | ||||
|                     return `/fr/task/single-task/${n.relatedEntityId}/show`; | ||||
|                 default: | ||||
|                     throw "notification type unknown"; | ||||
|             } | ||||
|   | ||||
| @@ -37,7 +37,7 @@ class NotificationNormalizer implements NormalizerAwareInterface, NormalizerInte | ||||
|             ->find($object->getRelatedEntityId()); | ||||
|  | ||||
|         return [ | ||||
|             'type' => 'notification', | ||||
|             'type' => $object->getType(), | ||||
|             'id' => $object->getId(), | ||||
|             'addressees' => $this->normalizer->normalize($object->getAddressees(), $format, $context), | ||||
|             'date' => $this->normalizer->normalize($object->getDate(), $format, $context), | ||||
|   | ||||
| @@ -13,7 +13,6 @@ namespace Chill\TaskBundle\Controller; | ||||
|  | ||||
| use Chill\MainBundle\Entity\User; | ||||
| use Chill\MainBundle\Pagination\PaginatorFactory; | ||||
| use Chill\MainBundle\Security\Resolver\CenterResolverDispatcherInterface; | ||||
| use Chill\MainBundle\Serializer\Model\Collection; | ||||
| use Chill\MainBundle\Serializer\Model\Counter; | ||||
| use Chill\MainBundle\Templating\Listing\FilterOrderHelper; | ||||
| @@ -23,6 +22,7 @@ use Chill\PersonBundle\Entity\AccompanyingPeriod; | ||||
| use Chill\PersonBundle\Entity\Person; | ||||
| use Chill\PersonBundle\Privacy\PrivacyEvent; | ||||
| use Chill\TaskBundle\Entity\SingleTask; | ||||
| use Chill\TaskBundle\Event\AssignTaskEvent; | ||||
| use Chill\TaskBundle\Event\TaskEvent; | ||||
| use Chill\TaskBundle\Event\UI\UIEvent; | ||||
| use Chill\TaskBundle\Form\SingleTaskType; | ||||
| @@ -48,7 +48,6 @@ use Symfony\Contracts\Translation\TranslatorInterface; | ||||
| final class SingleTaskController extends AbstractController | ||||
| { | ||||
|     public function __construct( | ||||
|         private readonly CenterResolverDispatcherInterface $centerResolverDispatcher, | ||||
|         private readonly PaginatorFactory $paginatorFactory, | ||||
|         private readonly SingleTaskAclAwareRepositoryInterface $singleTaskAclAwareRepository, | ||||
|         private readonly TranslatorInterface $translator, | ||||
| @@ -169,6 +168,9 @@ final class SingleTaskController extends AbstractController | ||||
|             ->setForm($this->setCreateForm($task, TaskVoter::UPDATE)); | ||||
|         $this->eventDispatcher->dispatch($event, UIEvent::EDIT_FORM); | ||||
|  | ||||
|         //        To keep track of specific assignee change | ||||
|         $initialAssignee = $task->getAssignee(); | ||||
|  | ||||
|         $form = $event->getForm(); | ||||
|  | ||||
|         $form->handleRequest($request); | ||||
| @@ -178,6 +180,13 @@ final class SingleTaskController extends AbstractController | ||||
|                 $em = $this->managerRegistry->getManager(); | ||||
|                 $em->persist($task); | ||||
|  | ||||
|                 if ($initialAssignee !== $task->getAssignee()) { | ||||
|                     $this->eventDispatcher->dispatch( | ||||
|                         new AssignTaskEvent($task, $initialAssignee), | ||||
|                         AssignTaskEvent::PERSIST | ||||
|                     ); | ||||
|                 } | ||||
|  | ||||
|                 $em->flush(); | ||||
|  | ||||
|                 $this->addFlash('success', $this->translator | ||||
| @@ -525,6 +534,13 @@ final class SingleTaskController extends AbstractController | ||||
|  | ||||
|                 $this->eventDispatcher->dispatch(new TaskEvent($task), TaskEvent::PERSIST); | ||||
|  | ||||
|                 if (null !== $task->getAssignee()) { | ||||
|                     $this->eventDispatcher->dispatch( | ||||
|                         new AssignTaskEvent($task, null), | ||||
|                         AssignTaskEvent::PERSIST | ||||
|                     ); | ||||
|                 } | ||||
|  | ||||
|                 $em->flush(); | ||||
|  | ||||
|                 $this->addFlash('success', $this->translator->trans('The task is created')); | ||||
|   | ||||
| @@ -42,6 +42,7 @@ class ChillTaskExtension extends Extension implements PrependExtensionInterface | ||||
|         $loader->load('services/timeline.yaml'); | ||||
|         $loader->load('services/fixtures.yaml'); | ||||
|         $loader->load('services/form.yaml'); | ||||
|         $loader->load('services/notification.yaml'); | ||||
|     } | ||||
|  | ||||
|     public function prepend(ContainerBuilder $container) | ||||
|   | ||||
							
								
								
									
										41
									
								
								src/Bundle/ChillTaskBundle/Event/AssignTaskEvent.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								src/Bundle/ChillTaskBundle/Event/AssignTaskEvent.php
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,41 @@ | ||||
| <?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\TaskBundle\Event; | ||||
|  | ||||
| use Chill\MainBundle\Entity\User; | ||||
| use Chill\TaskBundle\Entity\SingleTask; | ||||
| use Symfony\Contracts\EventDispatcher\Event; | ||||
|  | ||||
| class AssignTaskEvent extends Event | ||||
| { | ||||
|     final public const PERSIST = 'chill_task.assign_task'; | ||||
|  | ||||
|     public function __construct( | ||||
|         private readonly SingleTask $task, | ||||
|         private readonly ?User $initialAssignee, | ||||
|     ) {} | ||||
|  | ||||
|     public function getTask(): SingleTask | ||||
|     { | ||||
|         return $this->task; | ||||
|     } | ||||
|  | ||||
|     public function getInitialAssignee(): ?User | ||||
|     { | ||||
|         return $this->initialAssignee; | ||||
|     } | ||||
|  | ||||
|     public function hasAssigneeChanged(): bool | ||||
|     { | ||||
|         return $this->initialAssignee !== $this->task->getAssignee(); | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,66 @@ | ||||
| <?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\TaskBundle\Event; | ||||
|  | ||||
| use Chill\MainBundle\Entity\Notification; | ||||
| use Chill\TaskBundle\Entity\SingleTask; | ||||
| use Chill\TaskBundle\Notification\AssignTaskNotificationFlagProvider; | ||||
| use Doctrine\ORM\EntityManagerInterface; | ||||
| use Symfony\Component\EventDispatcher\EventSubscriberInterface; | ||||
|  | ||||
| readonly class TaskAssignEventSubscriber implements EventSubscriberInterface | ||||
| { | ||||
|     public function __construct( | ||||
|         private EntityManagerInterface $entityManager, | ||||
|         private \Twig\Environment $engine, | ||||
|     ) {} | ||||
|  | ||||
|     public static function getSubscribedEvents(): array | ||||
|     { | ||||
|         return [ | ||||
|             AssignTaskEvent::PERSIST => ['onTaskAssigned', 0], | ||||
|         ]; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Send a notification when a user is assigned to a task. | ||||
|      * Only triggers when the assignee actually changes. | ||||
|      */ | ||||
|     public function onTaskAssigned(AssignTaskEvent $event): void | ||||
|     { | ||||
|         if (!$event->hasAssigneeChanged()) { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         $task = $event->getTask(); | ||||
|         $assignedUser = $task->getAssignee(); | ||||
|  | ||||
|         $title = $task->getTitle(); | ||||
|  | ||||
|         $context = [ | ||||
|             'task' => $task, | ||||
|             'assignedUser' => $assignedUser, | ||||
|             'title' => $title, | ||||
|         ]; | ||||
|  | ||||
|         $notification = new Notification(); | ||||
|         $notification | ||||
|             ->setRelatedEntityId($task->getId()) | ||||
|             ->setRelatedEntityClass(SingleTask::class) | ||||
|             ->setTitle($this->engine->render('@ChillTask/Notification/task_assignment_notification_title.txt.twig', $context)) | ||||
|             ->setMessage($this->engine->render('@ChillTask/Notification/task_assignment_notification_content.txt.twig', $context)) | ||||
|             ->addAddressee($assignedUser) | ||||
|             ->setType(AssignTaskNotificationFlagProvider::FLAG); | ||||
|  | ||||
|         $this->entityManager->persist($notification); | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,31 @@ | ||||
| <?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\TaskBundle\Notification; | ||||
|  | ||||
| use Chill\MainBundle\Notification\FlagProviders\NotificationFlagProviderInterface; | ||||
| use Symfony\Component\Translation\TranslatableMessage; | ||||
| use Symfony\Contracts\Translation\TranslatableInterface; | ||||
|  | ||||
| class AssignTaskNotificationFlagProvider implements NotificationFlagProviderInterface | ||||
| { | ||||
|     public const FLAG = 'task-assign-notif'; | ||||
|  | ||||
|     public function getFlag(): string | ||||
|     { | ||||
|         return self::FLAG; | ||||
|     } | ||||
|  | ||||
|     public function getLabel(): TranslatableInterface | ||||
|     { | ||||
|         return new TranslatableMessage('notification.flags.task_assign'); | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,69 @@ | ||||
| <?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\TaskBundle\Notification; | ||||
|  | ||||
| use Chill\MainBundle\Entity\Notification; | ||||
| use Chill\MainBundle\Notification\NotificationHandlerInterface; | ||||
| use Chill\TaskBundle\Entity\SingleTask; | ||||
| use Chill\TaskBundle\Repository\SingleTaskRepository; | ||||
| use Symfony\Component\Translation\TranslatableMessage; | ||||
| use Symfony\Contracts\Translation\TranslatableInterface; | ||||
|  | ||||
| final readonly class TaskNotificationHandler implements NotificationHandlerInterface | ||||
| { | ||||
|     public function __construct(private SingleTaskRepository $taskRepository) {} | ||||
|  | ||||
|     public function getTemplate(Notification $notification, array $options = []): string | ||||
|     { | ||||
|         return '@ChillTask/SingleTask/showInNotification.html.twig'; | ||||
|     } | ||||
|  | ||||
|     public function getTemplateData(Notification $notification, array $options = []): array | ||||
|     { | ||||
|         return [ | ||||
|             'notification' => $notification, | ||||
|             'task' => $this->taskRepository->find($notification->getRelatedEntityId()), | ||||
|         ]; | ||||
|     } | ||||
|  | ||||
|     public function supports(Notification $notification, array $options = []): bool | ||||
|     { | ||||
|         return SingleTask::class === $notification->getRelatedEntityClass(); | ||||
|     } | ||||
|  | ||||
|     public function getTitle(Notification $notification, array $options = []): TranslatableInterface | ||||
|     { | ||||
|         if (null === $task = $this->getRelatedEntity($notification)) { | ||||
|             return new TranslatableMessage('task.deleted'); | ||||
|         } | ||||
|  | ||||
|         return new TranslatableMessage('notification.task.title %title%', ['title' => $task->getTitle()]); | ||||
|     } | ||||
|  | ||||
|     public function getAssociatedPersons(Notification $notification, array $options = []): array | ||||
|     { | ||||
|         if (null === $task = $this->getRelatedEntity($notification)) { | ||||
|             return []; | ||||
|         } | ||||
|  | ||||
|         if (null !== $task->getCourse()) { | ||||
|             return $task->getCourse()->getParticipations()->getValues(); | ||||
|         } | ||||
|  | ||||
|         return [$task->getPerson()]; | ||||
|     } | ||||
|  | ||||
|     public function getRelatedEntity(Notification $notification): ?object | ||||
|     { | ||||
|         return $this->taskRepository->find($notification->getRelatedEntityId()); | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,15 @@ | ||||
| {{ assignedUser.label }}, | ||||
|  | ||||
| {{ 'notification.email.task_assigned'|trans({}, null, assignedUser.getLocale) }} | ||||
|  | ||||
| {{ 'notification.email.title_label'|trans({}, null, assignedUser.getLocale) }} "{{ task.title }}". | ||||
| {% if task.endDate %} | ||||
|  | ||||
| {{ 'notification.email.deadline'|trans({'%date%': task.endDate|format_date('long')}, null, assignedUser.getLocale) }} | ||||
| {% endif %} | ||||
|  | ||||
| {{ 'notification.email.view_task'|trans({}, null, assignedUser.getLocale) }} | ||||
|  | ||||
| {{ absolute_url(path('chill_task_single_task_show', {'id': task.id, '_locale': assignedUser.getLocale})) }} | ||||
|  | ||||
| {{ 'notification.email.regards'|trans({}, null, assignedUser.getLocale) }}, | ||||
| @@ -0,0 +1,3 @@ | ||||
| {{ 'notification.email.title'|trans({}, null, assignedUser.getLocale) }} | ||||
|  | ||||
|  | ||||
| @@ -18,14 +18,14 @@ | ||||
|                 <div> | ||||
|                     {% if task.person is not null %} | ||||
|                         <span class="chill-task-list__row__person"> | ||||
|                                                 {% include '@ChillMain/OnTheFly/_insert_vue_onthefly.html.twig' with { | ||||
|                                                     targetEntity: { name: 'person', id: task.person.id }, | ||||
|                                                     action: 'show', | ||||
|                                                     displayBadge: true, | ||||
|                                                     buttonText: task.person|chill_entity_render_string, | ||||
|                                                     isDead: task.person.deathdate is not null | ||||
|                                                 } %} | ||||
|                                             </span> | ||||
|                             {% include '@ChillMain/OnTheFly/_insert_vue_onthefly.html.twig' with { | ||||
|                                 targetEntity: { name: 'person', id: task.person.id }, | ||||
|                                 action: 'show', | ||||
|                                 displayBadge: true, | ||||
|                                 buttonText: task.person|chill_entity_render_string, | ||||
|                                 isDead: task.person.deathdate is not null | ||||
|                             } %} | ||||
|                         </span> | ||||
|                     {% elseif task.course is not null %} | ||||
|                         <div style="margin-bottom: 1rem;"> | ||||
|                         {% for part in task.course.currentParticipations %} | ||||
|   | ||||
| @@ -110,4 +110,5 @@ | ||||
| 		</li> | ||||
| 	{% endif %} | ||||
|  | ||||
| </ul></div> | ||||
| </ul> | ||||
| </div> | ||||
|   | ||||
| @@ -0,0 +1,14 @@ | ||||
| {% macro recordAction(task) %} | ||||
|     <li> | ||||
|         <a href="{{ path('chill_person_accompanying_course_index', { 'task_id': task }) }}" | ||||
|            class="btn btn-show" title="{{ 'See task'|trans }}"></a> | ||||
|     </li> | ||||
| {% endmacro %} | ||||
|  | ||||
| {% if task is not null %} | ||||
| {#    <div>Todo : display task? </div>#} | ||||
| {% else %} | ||||
|     <div class="alert alert-warning border-warning border-1"> | ||||
|         {{ 'You are getting a notification for a task which does not exist any more'|trans }} | ||||
|     </div> | ||||
| {% endif %} | ||||
| @@ -0,0 +1,138 @@ | ||||
| <?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\TaskBundle\Tests\EventSubscriber; | ||||
|  | ||||
| use Chill\MainBundle\Entity\Notification; | ||||
| use Chill\MainBundle\Entity\User; | ||||
| use Chill\TaskBundle\Entity\SingleTask; | ||||
| use Chill\TaskBundle\Event\AssignTaskEvent; | ||||
| use Chill\TaskBundle\Event\TaskAssignEventSubscriber; | ||||
| use Chill\TaskBundle\Notification\AssignTaskNotificationFlagProvider; | ||||
| use Doctrine\ORM\EntityManagerInterface; | ||||
| use PHPUnit\Framework\TestCase; | ||||
| use Prophecy\Argument; | ||||
| use Prophecy\PhpUnit\ProphecyTrait; | ||||
| use Prophecy\Prophecy\ObjectProphecy; | ||||
| use Twig\Environment; | ||||
|  | ||||
| /** | ||||
|  * @internal | ||||
|  * | ||||
|  * @coversNothing | ||||
|  */ | ||||
| class TaskAssignEventSubscriberTest extends TestCase | ||||
| { | ||||
|     use ProphecyTrait; | ||||
|  | ||||
|     private ObjectProphecy $entityManager; | ||||
|     private ObjectProphecy $twig; | ||||
|     private TaskAssignEventSubscriber $subscriber; | ||||
|  | ||||
|     protected function setUp(): void | ||||
|     { | ||||
|         $this->entityManager = $this->prophesize(EntityManagerInterface::class); | ||||
|         $this->twig = $this->prophesize(Environment::class); | ||||
|         $this->subscriber = new TaskAssignEventSubscriber( | ||||
|             $this->entityManager->reveal(), | ||||
|             $this->twig->reveal() | ||||
|         ); | ||||
|     } | ||||
|  | ||||
|     private function setEntityId(object $entity, int $id): void | ||||
|     { | ||||
|         $reflection = new \ReflectionClass($entity); | ||||
|         $property = $reflection->getProperty('id'); | ||||
|         $property->setAccessible(true); | ||||
|         $property->setValue($entity, $id); | ||||
|     } | ||||
|  | ||||
|     public function testOnTaskAssignedCreatesNotificationWhenAssigneeChanges(): void | ||||
|     { | ||||
|         // Arrange | ||||
|         $initialAssignee = new User(); | ||||
|         $newAssignee = new User(); | ||||
|  | ||||
|         $task = new SingleTask(); | ||||
|         $task->setTitle('Test Task'); | ||||
|         $task->setAssignee($newAssignee); | ||||
|         $this->setEntityId($task, 123); | ||||
|  | ||||
|         $event = new AssignTaskEvent($task, $initialAssignee); | ||||
|  | ||||
|         $this->twig->render('@ChillTask/Notification/task_assignment_notification_title.txt.twig', Argument::type('array')) | ||||
|             ->shouldBeCalledOnce() | ||||
|             ->willReturn('Notification Title'); | ||||
|  | ||||
|         $this->twig->render('@ChillTask/Notification/task_assignment_notification_content.txt.twig', Argument::type('array')) | ||||
|             ->shouldBeCalledOnce() | ||||
|             ->willReturn('Notification Content'); | ||||
|  | ||||
|         $this->entityManager->persist(Argument::type(Notification::class)) | ||||
|             ->shouldBeCalledOnce(); | ||||
|  | ||||
|         // Act | ||||
|         $this->subscriber->onTaskAssigned($event); | ||||
|     } | ||||
|  | ||||
|     public function testOnTaskAssignedDoesNothingWhenAssigneeDoesNotChange(): void | ||||
|     { | ||||
|         // Arrange | ||||
|         $assignee = new User(); | ||||
|  | ||||
|         $task = new SingleTask(); | ||||
|         $task->setTitle('Test Task'); | ||||
|         $task->setAssignee($assignee); | ||||
|  | ||||
|         $event = new AssignTaskEvent($task, $assignee); | ||||
|  | ||||
|         $this->twig->render(Argument::any(), Argument::any())->shouldNotBeCalled(); | ||||
|         $this->entityManager->persist(Argument::any())->shouldNotBeCalled(); | ||||
|  | ||||
|         // Act | ||||
|         $this->subscriber->onTaskAssigned($event); | ||||
|     } | ||||
|  | ||||
|     public function testNotificationHasCorrectProperties(): void | ||||
|     { | ||||
|         // Arrange | ||||
|         $initialAssignee = new User(); | ||||
|         $newAssignee = new User(); | ||||
|  | ||||
|         $task = new SingleTask(); | ||||
|         $task->setTitle('Important Task'); | ||||
|         $task->setAssignee($newAssignee); | ||||
|         $this->setEntityId($task, 456); | ||||
|  | ||||
|         $event = new AssignTaskEvent($task, $initialAssignee); | ||||
|  | ||||
|         $this->twig->render(Argument::any(), Argument::any())->willReturn('Test Content'); | ||||
|  | ||||
|         // Capture the persisted notification | ||||
|         $persistedNotification = null; | ||||
|         $this->entityManager->persist(Argument::type(Notification::class)) | ||||
|             ->shouldBeCalledOnce() | ||||
|             ->will(function ($args) use (&$persistedNotification) { | ||||
|                 $persistedNotification = $args[0]; | ||||
|             }); | ||||
|  | ||||
|         // Act | ||||
|         $this->subscriber->onTaskAssigned($event); | ||||
|  | ||||
|         // Assert | ||||
|         $this->assertInstanceOf(Notification::class, $persistedNotification); | ||||
|         $this->assertEquals($task->getId(), $persistedNotification->getRelatedEntityId()); | ||||
|         $this->assertEquals(SingleTask::class, $persistedNotification->getRelatedEntityClass()); | ||||
|         $this->assertEquals(AssignTaskNotificationFlagProvider::FLAG, $persistedNotification->getType()); | ||||
|         $this->assertEquals('Test Content', $persistedNotification->getTitle()); | ||||
|         $this->assertEquals('Test Content', $persistedNotification->getMessage()); | ||||
|     } | ||||
| } | ||||
| @@ -1,7 +1,13 @@ | ||||
| services: | ||||
|     _defaults: | ||||
|         autowire: true | ||||
|         autoconfigure: true | ||||
|  | ||||
|     Chill\TaskBundle\Event\Lifecycle\TaskLifecycleEvent: | ||||
|         arguments: | ||||
|             $em: '@Doctrine\ORM\EntityManagerInterface' | ||||
|             $tokenStorage: '@Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface' | ||||
|         tags: | ||||
|             - { name: kernel.event_subscriber } | ||||
|  | ||||
|     Chill\TaskBundle\Event\TaskAssignEventSubscriber: ~ | ||||
|   | ||||
| @@ -0,0 +1,7 @@ | ||||
| services: | ||||
|     _defaults: | ||||
|         autowire: true | ||||
|         autoconfigure: true | ||||
|  | ||||
|     Chill\TaskBundle\Notification\TaskNotificationHandler: ~ | ||||
|     Chill\TaskBundle\Notification\AssignTaskNotificationFlagProvider: ~ | ||||
| @@ -116,3 +116,16 @@ CHILL_TASK_TASK_UPDATE: Modifier une tâche | ||||
| CHILL_TASK_TASK_CREATE_FOR_COURSE: Créer une tâche pour un parcours | ||||
| CHILL_TASK_TASK_CREATE_FOR_PERSON: Créer une tâche pour un usager | ||||
|  | ||||
| notification: | ||||
|     task: | ||||
|         title %title%: "Tâche: title" | ||||
|     flags: | ||||
|         task_assign: Lorsqu'un autre utilisateur m'assigne à une tâche. | ||||
|     email: | ||||
|         title: "Une tâche demande votre attention" | ||||
|         task_assigned: "Une tâche vous a été assignée." | ||||
|         title_label: "Titre de la tâche:" | ||||
|         deadline: "Vous êtes invités à accomplir cette tâche avant le %date%" | ||||
|         view_task: "Vous pouvez visualiser la tâche sur cette page:" | ||||
|         regards: "Cordialement" | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user