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 @@
+
+