← Back
Editing: AdresseCrudController.php
<?php namespace App\Controller\Admin; use App\Entity\Adresse; use App\Entity\UserAddress; use App\Filter\Admin\AgentFilter; use App\Form\Admin\AssignAgentType; use App\Form\Admin\AssignItemType; use App\Form\Admin\AssignManagerType; use App\Repository\AdresseRepository; use App\Repository\ItemRepository; use App\Service\SolutionService; use Doctrine\ORM\EntityManagerInterface; use EasyCorp\Bundle\EasyAdminBundle\Config\Action; use EasyCorp\Bundle\EasyAdminBundle\Config\Actions; use EasyCorp\Bundle\EasyAdminBundle\Config\Crud; use EasyCorp\Bundle\EasyAdminBundle\Config\Filters; use EasyCorp\Bundle\EasyAdminBundle\Controller\AbstractCrudController; use EasyCorp\Bundle\EasyAdminBundle\Field\AssociationField; use EasyCorp\Bundle\EasyAdminBundle\Field\BooleanField; use EasyCorp\Bundle\EasyAdminBundle\Field\CollectionField; use EasyCorp\Bundle\EasyAdminBundle\Field\DateTimeField; use EasyCorp\Bundle\EasyAdminBundle\Field\IdField; use EasyCorp\Bundle\EasyAdminBundle\Field\TextField; use Symfony\Component\Form\FormInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; class AdresseCrudController extends AbstractCrudController { public function __construct( private readonly SolutionService $solutionService, private readonly EntityManagerInterface $em, private readonly ItemRepository $itemRepository ) { } public static function getEntityFqcn(): string { return Adresse::class; } public function configureCrud(Crud $crud): Crud { return $crud ->setPaginatorPageSize(200); } public function configureActions(Actions $actions): Actions { return $actions ->addBatchAction( Action::new('assignItem', 'Assigner/Désassigner des items') ->linkToCrudAction('assignItem') ->addCssClass('btn btn-primary') ->setIcon('fa fa-list-check') ->setHtmlAttributes(['data-controller' => 'batch-no-confirm']) ) ->addBatchAction( Action::new('assignManager', 'Assigner à un manager') ->linkToCrudAction('assignManager') ->addCssClass('btn btn-primary') ->setIcon('fa fa-user-check') ->setHtmlAttributes(['data-controller' => 'batch-no-confirm']) ) ->addBatchAction( Action::new('assignAgent', 'Assigner/Désassigner des agents') ->linkToCrudAction('assignAgent') ->addCssClass('btn btn-primary') ->setIcon('fa fa-users') ->setHtmlAttributes(['data-controller' => 'batch-no-confirm']) ); } public function configureFilters(Filters $filters): Filters { return $filters ->add('manager') ->add(AgentFilter::new('agent')) ->add('solution') ->add('numero') ->add('voie') ->add('codePostal') ->add('ville') ->add('numeroAscenseur'); } public function configureFields(string $pageName): iterable { $items = $this->itemRepository->findBySolution($this->solutionService->getCurrent()); $itemChoices = []; foreach ($items as $item) { $groupLabel = sprintf( '%s > %s', $item->getZone()->getRoot()->getThematic()->getName(), $item->getZone()->getNom() ); $itemChoices[$groupLabel][] = $item; } return [ IdField::new('id')->hideOnForm(), AssociationField::new('agency'), TextField::new('voie'), TextField::new('numero'), TextField::new('repetition', 'Rep.'), TextField::new('codePostal'), TextField::new('ville'), TextField::new('batiment')->hideOnIndex(), TextField::new('residence')->hideOnIndex(), TextField::new('codeProgramme'), TextField::new('numeroAscenseur', 'Num. Asc.'), CollectionField::new('userAddresses') ->allowAdd() ->allowDelete() ->setEntryIsComplex() ->useEntryCrudForm() ->setLabel('Agents affectés') ->setFormTypeOptions([ 'by_reference' => false, ]), AssociationField::new('manager') ->setRequired(false), AssociationField::new('solution'), BooleanField::new('ascenseurIsActive')->hideOnIndex(), DateTimeField::new('startDateInactive')->hideOnIndex(), TextField::new('lat')->onlyOnForms(), TextField::new('lng')->onlyOnForms(), AssociationField::new('items') ->renderAsNativeWidget() ->setFormTypeOption('choices', $itemChoices) ->setFormTypeOption( 'attr', [ 'style' => 'min-height:300px; min-width: 500px', ] ) ->hideOnIndex(), ]; } public function assignManager( Request $request ): Response { $referrer = $request->get('referrer'); $postParams = $request->request->all(); $formParams = []; $formOptions = []; $postedItems = $request->request->all(); if (isset($postedItems['assign_manager']) && is_string($postedItems['assign_manager']['ids'])) { $ids = explode(',', $postedItems['assign_manager']['ids']); $formOptions['agencies'] = $this->getAgenciesFromAddresses($ids); } if (isset($postParams['batchActionEntityIds'])) { $formParams['ids'] = implode(',', $postParams['batchActionEntityIds']); $formOptions['agencies'] = $this->getAgenciesFromAddresses($postParams['batchActionEntityIds']); } $form = $this->createForm(AssignManagerType::class, $formParams, $formOptions); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { try { $this->assignManagerFromForm($form); $this->addFlash('success', 'Le manager a bien été assigné'); } catch (\Exception $e) { $this->addFlash('error', 'Une erreur est survenue lors de l\'attribution des items.'); } return $this->redirect($referrer); } return $this->render( 'admin/assign_manager.html.twig', [ 'form' => $form->createView(), ] ); } public function assignItem( Request $request, AdresseRepository $addressRepository, ItemRepository $itemRepository ): Response { $referrer = $request->get('referrer'); $postParams = $request->request->all(); $formParams = []; if (isset($postParams['batchActionEntityIds'])) { $formParams['ids'] = implode(',', $postParams['batchActionEntityIds']); } $form = $this->createForm(AssignItemType::class, $formParams); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { try { $this->assignItemsFromForm( $form, $addressRepository, $itemRepository, $form->get('unassign')->isClicked() ); $this->addFlash( 'success', sprintf( 'Les items ont bien été %s', $form->get('unassign')->isClicked() ? 'désassignés' : 'assignés' ) ); } catch (\Exception $e) { $this->addFlash('error', 'Une erreur est survenue lors de l\'attribution des items.'); } return $this->redirect($referrer); } return $this->render( 'admin/assign_items.html.twig', [ 'form' => $form->createView(), ] ); } public function assignAgent(Request $request): Response { $referrer = $request->get('referrer'); $postParams = $request->request->all(); $formParams = []; $formOptions = []; if (isset($postParams['assign_agent']) && is_string($postParams['assign_agent']['ids'])) { $ids = explode(',', $postParams['assign_agent']['ids']); $formOptions['agencies'] = $this->getAgenciesFromAddresses($ids); } if (isset($postParams['batchActionEntityIds'])) { $formParams['ids'] = implode(',', $postParams['batchActionEntityIds']); $formOptions['agencies'] = $this->getAgenciesFromAddresses($postParams['batchActionEntityIds']); } $form = $this->createForm(AssignAgentType::class, $formParams, $formOptions); $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { $unassign = $form->get('unassign')->isClicked(); try { $this->assignAgentFromForm($form, $unassign); $this->addFlash( 'success', sprintf( 'Les agents ont bien été %s', $unassign ? 'désassignés' : 'assignés' ) ); } catch (\Exception $e) { $this->addFlash('error', 'Une erreur est survenue lors de l\'attribution des agents.'); } return $this->redirect($referrer); } return $this->render( 'admin/assign_agent.html.twig', [ 'form' => $form->createView(), ] ); } private function assignManagerFromForm(FormInterface $form): void { $data = $form->getData(); $manager = $data['manager']; $addressRepository = $this->em->getRepository(Adresse::class); $addressIds = explode(',', $data['ids']); /** @var Adresse[] $addresses */ $addresses = array_filter(array_map(fn ($id) => $addressRepository->find($id), $addressIds)); foreach ($addresses as $address) { $address->setManager($manager); $this->em->persist($address); } $this->em->flush(); } private function assignItemsFromForm( FormInterface $form, AdresseRepository $addressRepository, ItemRepository $itemRepository, bool $unassign ): void { $data = $form->getData(); $addressIds = explode(',', $data['ids']); $itemIds = $data['item']; $addresses = array_filter(array_map(fn ($id) => $addressRepository->find($id), $addressIds)); $items = array_filter(array_map(fn ($id) => $itemRepository->find($id), $itemIds)); foreach ($addresses as $address) { foreach ($items as $item) { if (true === $unassign) { $address->removeItem($item); foreach ($address->getControles() as $control) { foreach ($control->getNotes() as $note) { if ($note->getItem()->getId() === $item->getId()) { $this->em->remove($note); } } } continue; } $address->addItem($item); } $addressRepository->save($address); } $this->em->flush(); } private function assignAgentFromForm(FormInterface $form, bool $unassign): void { $data = $form->getData(); $agents = $data['agents']; $addressRepository = $this->em->getRepository(Adresse::class); $addressIds = explode(',', $data['ids']); /** @var Adresse[] $addresses */ $addresses = array_filter(array_map(fn ($id) => $addressRepository->find($id), $addressIds)); foreach ($addresses as $address) { foreach ($agents as $agent) { if ($unassign) { foreach ($address->getUserAddresses() as $userAddress) { if ($userAddress->getUser()->getId() === $agent->getId()) { $address->removeUserAddress($userAddress); $this->em->remove($userAddress); } } continue; } if (!$address->containsAgent($agent)) { $userAddress = new UserAddress(); $userAddress->setUser($agent); $userAddress->setAddress($address); $this->em->persist($userAddress); } } } $this->em->flush(); } /** * @param int[] $batchActionEntityIds */ private function getAgenciesFromAddresses(array $batchActionEntityIds): array { $agencies = []; foreach ($batchActionEntityIds as $addressId) { $address = $this->em->getRepository(Adresse::class)->find($addressId); if (null === $address) { continue; } if (!in_array($address->getAgency(), $agencies, true)) { $agencies[] = $address->getAgency(); } } return $agencies; } }
Save File
Cancel