From 6ded1852892d649e43a297496cda13f5db72fd6f Mon Sep 17 00:00:00 2001 From: Julie Lenaerts Date: Wed, 5 Mar 2025 19:13:17 +0100 Subject: [PATCH] Treat duplicate in backend and setup confirm page of merge --- ...ompanyingPeriodWorkDuplicateController.php | 106 ++++++++++++++---- .../Form/FindAccompanyingPeriodWorkType.php | 5 +- .../AccompanyingPeriodWorkList.vue | 4 +- .../AccompanyingPeriodWorkSelectorModal.vue | 24 +++- .../_details.html.twig | 12 ++ .../assign_acpw_duplicate.html.twig | 12 +- .../confirm.html.twig | 77 +++++++++++++ .../AccompanyingPeriodWorkMergeService.php | 34 +----- .../translations/messages.fr.yml | 2 +- 9 files changed, 207 insertions(+), 69 deletions(-) create mode 100644 src/Bundle/ChillPersonBundle/Resources/views/AccompanyingPeriodWorkDuplicate/_details.html.twig create mode 100644 src/Bundle/ChillPersonBundle/Resources/views/AccompanyingPeriodWorkDuplicate/confirm.html.twig diff --git a/src/Bundle/ChillPersonBundle/Controller/AccompanyingPeriodWorkDuplicateController.php b/src/Bundle/ChillPersonBundle/Controller/AccompanyingPeriodWorkDuplicateController.php index c20340577..efacd6268 100644 --- a/src/Bundle/ChillPersonBundle/Controller/AccompanyingPeriodWorkDuplicateController.php +++ b/src/Bundle/ChillPersonBundle/Controller/AccompanyingPeriodWorkDuplicateController.php @@ -11,30 +11,43 @@ declare(strict_types=1); namespace Chill\PersonBundle\Controller; +use Chill\MainBundle\Templating\TranslatableStringHelperInterface; +use Chill\PersonBundle\Entity\AccompanyingPeriod\AccompanyingPeriodWork; use Chill\PersonBundle\Form\FindAccompanyingPeriodWorkType; +use Chill\PersonBundle\Form\PersonConfimDuplicateType; use Chill\PersonBundle\Repository\AccompanyingPeriod\AccompanyingPeriodWorkRepository; +use Chill\PersonBundle\Service\AccompanyingPeriodWork\AccompanyingPeriodWorkMergeService; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Routing\Annotation\Route; use Symfony\Contracts\Translation\TranslatorInterface; - +use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter; class AccompanyingPeriodWorkDuplicateController extends AbstractController { - public function __construct(private readonly AccompanyingPeriodWorkRepository $accompanyingPeriodWorkRepository, private readonly TranslatorInterface $translator) {} + public function __construct(private readonly AccompanyingPeriodWorkRepository $accompanyingPeriodWorkRepository, private readonly TranslatorInterface $translator, private readonly TranslatableStringHelperInterface $stringHelper, private readonly AccompanyingPeriodWorkMergeService $accompanyingPeriodWorkMergeService) {} - #[Route(path: '{_locale}/person/accompanying-period/work/{id}/assign-duplicate', name: 'chill_person_accompanying_period_work_assign_duplicate', methods: ['GET'])] - public function assignDuplicate(int $id, Request $request) + /** + * @ParamConverter("accompanyingPeriodWork", options={"id": "acpw_id"}) + */ + #[Route(path: '{_locale}/person/accompanying-period/work/{id}/assign-duplicate', name: 'chill_person_accompanying_period_work_assign_duplicate')] + public function assignDuplicate(AccompanyingPeriodWork $acpw, Request $request) { - $acpw1= $this->accompanyingPeriodWorkRepository->find($id); - $accompanyingPeriod = $acpw1->getAccompanyingPeriod(); + $accompanyingPeriod = $acpw->getAccompanyingPeriod(); - if (null === $acpw1) { - throw $this->createNotFoundException("Accompanying period work with id {$id} not".' found on this server'); - } + $acpwList = $this->accompanyingPeriodWorkRepository->findByAccompanyingPeriod($accompanyingPeriod); + + $acpwArray = array_map(function ($acpw) { + return [ + 'id' => $acpw->getId(), + 'socialAction' => $this->stringHelper->localize($acpw->getSocialAction()->getTitle()), + 'startDate' => $acpw->getStartDate(), + 'endDate' => $acpw->getEndDate(), + ]; + }, $acpwList); $this->denyAccessUnlessGranted( 'CHILL_MAIN_ACCOMPANYING_PERIOD_WORK_UPDATE', - $acpw1, + $acpw, 'You are not allowed to merge this accompanying period work' ); @@ -43,36 +56,83 @@ class AccompanyingPeriodWorkDuplicateController extends AbstractController $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { - $acpw2 = $form->get('person')->getData(); - - // Validation: Ensure person1 is not the same as person2 - if ($acpw1->getId() === $acpw2->getId()) { - $this->addFlash('error', $this->translator->trans('The entities you are trying to merge cannot be the same')); - - return $this->redirectToRoute('chill_person_accompanying_period_work_show', ['id' => $acpw1->getId()]); - } + $acpw2 = $this->accompanyingPeriodWorkRepository->find($form->get('acpw')->getData()); + dump($acpw2); $direction = $form->get('direction')->getData(); if ('starting' === $direction) { $params = [ - 'acpw1_id' => $acpw1->getId(), + 'acpw1_id' => $acpw->getId(), 'acpw2_id' => $acpw2->getId(), ]; } else { $params = [ 'acpw1_id' => $acpw2->getId(), - 'acpw2_id' => $acpw1->getId(), + 'acpw2_id' => $acpw->getId(), ]; } -// return $this->redirectToRoute('chill_person_acpw_duplicate_confirm', $params); + return $this->redirectToRoute('chill_person_acpw_duplicate_confirm', $params); } return $this->render('@ChillPerson/AccompanyingPeriodWorkDuplicate/assign_acpw_duplicate.html.twig', [ - 'accompanyingCourse' => $acpw1->getAccompanyingPeriod(), - 'acpw' => $acpw1, + 'accompanyingCourse' => $acpw->getAccompanyingPeriod(), + 'acpwList' => $acpwArray, + 'acpw' => $acpw, 'form' => $form->createView(), ]); } + + /** + * @ParamConverter("acpw1", options={"id": "acpw1_id"}) + * @ParamConverter("acpw2", options={"id": "acpw2_id"}) + */ + #[Route(path: '/{_locale}/person/{acpw1_id}/duplicate/{acpw2_id}/confirm', name: 'chill_person_acpw_duplicate_confirm')] + public function confirmAction(AccompanyingPeriodWork $acpw1, AccompanyingPeriodWork $acpw2, Request $request) + { + $accompanyingPeriod = $acpw1->getAccompanyingPeriod(); + + try { + $this->validateMerge($acpw1, $acpw2); + $form = $this->createForm(PersonConfimDuplicateType::class); + + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + + $this->accompanyingPeriodWorkMergeService->merge($acpw1, $acpw2); + + return $this->redirectToRoute('chill_person_accompanying_period_work_show', ['id' => $acpw1->getId()]); + } + + return $this->render('@ChillPerson/AccompanyingPeriodWorkDuplicate/confirm.html.twig', [ + 'acpw' => $acpw1, + 'acpw2' => $acpw2, + 'accompanyingCourse' => $accompanyingPeriod, + 'form' => $form->createView(), + ]); + } catch (\InvalidArgumentException $e) { + $this->addFlash('error', $this->translator->trans($e->getMessage())); + + return $this->redirectToRoute('chill_person_accompanying_period_work_assign_duplicate', [ + 'id' => $acpw1->getId(), + ]); + } + } + + private function validateMerge(AccompanyingPeriodWork $acpw1, AccompanyingPeriodWork $acpw2): void + { + $constraints = [ + [$acpw1 === $acpw2, 'acpw_duplicate.You cannot merge a accompanying period work with itself. Please choose a different one'], + ]; + + foreach ($constraints as [$condition, $message]) { + if ($condition) { + throw new \InvalidArgumentException($message); + } + } + } + + } diff --git a/src/Bundle/ChillPersonBundle/Form/FindAccompanyingPeriodWorkType.php b/src/Bundle/ChillPersonBundle/Form/FindAccompanyingPeriodWorkType.php index c5ffa5406..8837aaeb6 100644 --- a/src/Bundle/ChillPersonBundle/Form/FindAccompanyingPeriodWorkType.php +++ b/src/Bundle/ChillPersonBundle/Form/FindAccompanyingPeriodWorkType.php @@ -31,10 +31,9 @@ class FindAccompanyingPeriodWorkType extends AbstractType $suggestedAcpw = $this->repository->findByAccompanyingPeriod($accompanyingPeriod); $builder - ->add('acpw', PickLinkedAccompanyingPeriodWorkType::class, [ + ->add('acpw', HiddenType::class, [ + 'data' => null, 'label' => 'Accompanying period work', - 'suggested' => $suggestedAcpw, - 'multiple' => false, ]) ->add('direction', HiddenType::class, [ 'data' => 'starting', diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/AccompanyingPeriodWorkSelector/AccompanyingPeriodWorkList.vue b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/AccompanyingPeriodWorkSelector/AccompanyingPeriodWorkList.vue index 3932034b1..ecbaeb6de 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/AccompanyingPeriodWorkSelector/AccompanyingPeriodWorkList.vue +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/AccompanyingPeriodWorkSelector/AccompanyingPeriodWorkList.vue @@ -4,10 +4,10 @@ diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/AccompanyingPeriodWorkSelector/AccompanyingPeriodWorkSelectorModal.vue b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/AccompanyingPeriodWorkSelector/AccompanyingPeriodWorkSelectorModal.vue index 1fe207aaf..8c9875e63 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/AccompanyingPeriodWorkSelector/AccompanyingPeriodWorkSelectorModal.vue +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/AccompanyingPeriodWorkSelector/AccompanyingPeriodWorkSelectorModal.vue @@ -1,5 +1,15 @@ diff --git a/src/Bundle/ChillPersonBundle/Resources/views/AccompanyingPeriodWorkDuplicate/_details.html.twig b/src/Bundle/ChillPersonBundle/Resources/views/AccompanyingPeriodWorkDuplicate/_details.html.twig new file mode 100644 index 000000000..a83b5b8c3 --- /dev/null +++ b/src/Bundle/ChillPersonBundle/Resources/views/AccompanyingPeriodWorkDuplicate/_details.html.twig @@ -0,0 +1,12 @@ +{%- macro details(acpw, options) -%} + +{% endmacro %} diff --git a/src/Bundle/ChillPersonBundle/Resources/views/AccompanyingPeriodWorkDuplicate/assign_acpw_duplicate.html.twig b/src/Bundle/ChillPersonBundle/Resources/views/AccompanyingPeriodWorkDuplicate/assign_acpw_duplicate.html.twig index 7a3467f34..fdf7087ef 100644 --- a/src/Bundle/ChillPersonBundle/Resources/views/AccompanyingPeriodWorkDuplicate/assign_acpw_duplicate.html.twig +++ b/src/Bundle/ChillPersonBundle/Resources/views/AccompanyingPeriodWorkDuplicate/assign_acpw_duplicate.html.twig @@ -4,13 +4,15 @@ {% block title %}{{ 'Assign an accompanying period work duplicate' }}{% endblock %} - {% block content %}
-

{{ 'Assign an accompanying period work duplicate'|trans }}

- +

{{ 'acpw_duplicate.Assign duplicate'|trans }}

{{ form_start(form) }} + {%- if form.acpw is defined -%} + {{ form_row(form.acpw) }} +
+ {% endif %} {{ form_rest(form) }}