diff --git a/src/Bundle/ChillPersonBundle/Controller/AccompanyingPeriodWorkDuplicateController.php b/src/Bundle/ChillPersonBundle/Controller/AccompanyingPeriodWorkDuplicateController.php index c20340577..a1dd91121 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'); - } + $acpwArray = $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(), + ]; + }, $acpwArray); $this->denyAccessUnlessGranted( 'CHILL_MAIN_ACCOMPANYING_PERIOD_WORK_UPDATE', - $acpw1, + $acpw, 'You are not allowed to merge this accompanying period work' ); @@ -43,36 +56,82 @@ 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()); $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(), + 'acpwArray' => $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/Resources/public/mod/DuplicateSelector/AccompanyingPeriodWorkSelector.js b/src/Bundle/ChillPersonBundle/Resources/public/mod/DuplicateSelector/AccompanyingPeriodWorkSelector.js index 7fd39b5bc..2231aeab6 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/mod/DuplicateSelector/AccompanyingPeriodWorkSelector.js +++ b/src/Bundle/ChillPersonBundle/Resources/public/mod/DuplicateSelector/AccompanyingPeriodWorkSelector.js @@ -4,7 +4,7 @@ import AccompanyingPeriodWorkSelectorModal from "../../vuejs/_components/Accompa document.addEventListener("DOMContentLoaded", () => { const el = document.getElementById('linked-acpw-selector'); if (el) { - const acpwList = JSON.parse(el.dataset.acpwList); + const acpwList = JSON.parse(el.dataset.acpwArray); createApp(AccompanyingPeriodWorkSelectorModal, { acpwList }).mount(el); } }); diff --git a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/AccompanyingPeriodWorkSelector/AccompanyingPeriodWorkItem.vue b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/AccompanyingPeriodWorkSelector/AccompanyingPeriodWorkItem.vue index 0eb803ef9..e8d7752bf 100644 --- a/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/AccompanyingPeriodWorkSelector/AccompanyingPeriodWorkItem.vue +++ b/src/Bundle/ChillPersonBundle/Resources/public/vuejs/_components/AccompanyingPeriodWorkSelector/AccompanyingPeriodWorkItem.vue @@ -42,7 +42,9 @@ import {ISOToDate} from "ChillMainAssets/chill/js/date"; const props = defineProps<{ acpw: AccompanyingPeriodWork }>(); const formatDate = (dateObject) => { - const parsedDate = ISOToDate(dateObject.date); - return new Intl.DateTimeFormat('default', { dateStyle: 'short' }).format(parsedDate); + if(dateObject) { + const parsedDate = ISOToDate(dateObject.date); + return new Intl.DateTimeFormat('default', { dateStyle: 'short' }).format(parsedDate); + } }; 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..cf6c169a0 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) }}