← Back
Editing: ServiceController.php
<?php namespace App\Controller; use App\Contract\PersistableUserInterface; use App\Entity\Message; use App\Entity\Service; use App\Form\MessageType; use App\Form\ServicePenaltyType; use App\Form\ServiceRebateType; use App\Repository\ServiceRepository; use App\Repository\SettlementTemplateRepository; use Doctrine\ORM\EntityManagerInterface; use Knp\Component\Pager\PaginatorInterface; use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Annotation\Route; use Symfony\Component\Security\Core\Exception\AccessDeniedException; use Twig\Environment; use Twig\Error\LoaderError; use Twig\Error\RuntimeError; use Twig\Error\SyntaxError; /** * Class ServiceController. */ #[Route(path: '/service', name: 'service_')] class ServiceController extends AbstractController { /** * @return RedirectResponse|Response */ #[Route(path: '/{id}.html', name: 'detail', requirements: ['id' => '\d+'])] public function detail(Service $service, Request $request, EntityManagerInterface $entityManager) { $user = $this->getUser(); if (false === $user instanceof PersistableUserInterface) { throw new \LogicException('User is not persistable'); } if ($service->getControle()->getAdresse()->getManager()->getId() !== $user->getId()) { throw new AccessDeniedException(); } $this->checkAllowance(); $message = new Message(); $message->setService($service); $message->setUser($user); $messageForm = $this->createForm(MessageType::class, $message); $messageForm->handleRequest($request); if ($messageForm->isSubmitted() && $messageForm->isValid()) { $entityManager->persist($messageForm->getData()); $entityManager->flush(); $this->addFlash('success', 'Votre message a bien été envoyé'); return $this->redirectToRoute('service_detail', ['id' => $service->getId()]); } $penaltyForm = $this->createForm(ServicePenaltyType::class, $service); $penaltyForm->handleRequest($request); if ($penaltyForm->isSubmitted() && $penaltyForm->isValid()) { $entityManager->persist($penaltyForm->getData()); $entityManager->flush(); } if ($penaltyForm->isSubmitted() && !$penaltyForm->isValid()) { $errors = []; foreach ($penaltyForm->getErrors() as $error) { $errors[] = $error->getMessage(); } $this->addFlash('danger', implode('<br>', $errors)); } $rebateForm = $this->createForm(ServiceRebateType::class, $service); $rebateForm->handleRequest($request); if ($rebateForm->isSubmitted() && $rebateForm->isValid()) { $data = $rebateForm->getData(); if (false === $rebateForm['rebate']['apply']->getData()) { $data->setRebate(null); } $entityManager->persist($data); $entityManager->flush(); } if ($rebateForm->isSubmitted() && !$rebateForm->isValid()) { $errors = []; foreach ($rebateForm->getErrors() as $error) { $errors[] = $error->getMessage(); } $this->addFlash('danger', implode('<br>', $errors)); } return $this->render( 'service/detail.html.twig', [ 'service' => $service, 'statusDone' => Service::STATUS_DONE, 'messageForm' => $messageForm->createView(), 'penaltyForm' => $penaltyForm->createView(), 'rebateForm' => $rebateForm->createView(), 'messages' => $entityManager->getRepository(Message::class)->findBy( ['service' => $service] ), ] ); } #[Route(path: '/close/{id}', name: 'close')] public function closeService(Service $service, EntityManagerInterface $entityManager): RedirectResponse { $this->checkAllowance(); $user = $this->getUser(); if (false === $user instanceof PersistableUserInterface) { throw new \LogicException('User is not persistable'); } if ($service->getControle()->getAdresse()->getManager()->getId() !== $user->getId()) { throw new AccessDeniedException(); } $service->setStatus(Service::STATUS_DONE); $entityManager->persist($service); $entityManager->flush(); return $this->redirectToRoute('service_detail', ['id' => $service->getId()]); } #[Route(path: '/{page}', name: 'index', requirements: ['page' => '\d+'], defaults: ['page' => 1])] #[IsGranted('ROLE_MANAGER')] public function index(ServiceRepository $serviceRepository, PaginatorInterface $paginator, int $page = 1): Response { $this->checkAllowance(); $servicesQuery = $serviceRepository->findByManager($this->getUser()); $pagination = $paginator->paginate( $servicesQuery, $page, 25 ); return $this->render( 'service/index.html.twig', [ 'pagination' => $pagination, ] ); } /** * @throws LoaderError * @throws RuntimeError * @throws SyntaxError */ #[Route(path: '/{id}/decompte.html', name: 'settlement', requirements: ['id' => '\d+'])] public function settlement( Service $service, Request $request, SettlementTemplateRepository $templateRepository, Environment $twig ): Response { if ($service->getElevatorBreakdown()) { $agency = $service->getElevatorBreakdown()->getAdresse()->getAgency(); } else { $agency = $service->getControle()->getAdresse()->getAgency(); } if (!$settlementTemplate = $agency->getSettlementTemplate()) { $settlementTemplate = $templateRepository->findOneBy(['agency' => null]); } $html = $settlementTemplate->getHtml(); $penaltyTable = $twig->render('service/_penalty_table.html.twig', ['penalties' => $service->getPenalties()]); $dt = new \DateTime(); $provider = $service->getProviderContact()->getPrestataire(); $replacements = [ 'PENALTY' => $penaltyTable, 'DATE' => $dt->format('d/m/Y'), 'PROVIDER' => '<strong>'.$provider->getNom().'</strong><br>'.$provider->getAddress( ).'<br>'.$provider->getZip().' '.$provider->getCity(), 'REFERENCE' => $request->query->get('ref'), ]; $this->doReplacements($html, $replacements); $html = str_replace('[[PENALTY]]', $penaltyTable, $html); $html = str_replace('[[PENALTY]]', $penaltyTable, $html); return $this->render( 'service/settlement.html.twig', [ 'service' => $service, 'settlementTemplate' => $settlementTemplate, 'html' => $html, ] ); } /** * @return void */ private function doReplacements(?string &$html, array $replacements) { foreach ($replacements as $idx => $replacement) { $html = str_replace('[['.$idx.']]', $replacement, $html); } } /** * @return void */ private function checkAllowance() { $user = $this->getUser(); if (false === $user instanceof PersistableUserInterface) { throw new \LogicException('User is not persistable'); } $agency = $user->getAgency(); if (!$agency->getHasServiceOption()) { throw new AccessDeniedException('Accès non autorisé.'); } } }
Save File
Cancel