src/Controller/DeliveryManRegistrationController.php line 24

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\Document;
  4. use Location\Coordinate;
  5. use App\Entity\DeliveryMan;
  6. use App\Form\DeliveryManType;
  7. use App\Service\FileUploader;
  8. use App\Enum\TypeDocumentEnum;
  9. use Location\Distance\Vincenty;
  10. use Doctrine\Persistence\ManagerRegistry;
  11. use Symfony\Component\HttpFoundation\Request;
  12. use Symfony\Component\HttpFoundation\Response;
  13. use Symfony\Component\Routing\Annotation\Route;
  14. use App\Repository\Variables\UserTypeRepository;
  15. use Symfony\Component\HttpFoundation\File\UploadedFile;
  16. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  17. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  18. class DeliveryManRegistrationController extends AbstractController
  19. {
  20. #[Route('/register/man', name: 'delivery_man_register')]
  21. public function register(Request $request): Response
  22. {
  23. $deliveryMan = new DeliveryMan();
  24. $form = $this->createForm(DeliveryManType::class, $deliveryMan);
  25. $form->handleRequest($request);
  26. if ($form->isSubmitted() && $form->isValid()) {
  27. /** @var DeliveryMan $deliveryMan */
  28. $deliveryMan = $form->getData();
  29. $session = $request->getSession();
  30. $session->set('deliveryMan', $deliveryMan);
  31. return $this->redirectToRoute('delivery_man_civility');
  32. }
  33. return $this->render('delivery_man_registration/register.html.twig', [
  34. 'form' => $form->createView()
  35. ]);
  36. }
  37. #[Route('/register/man/civility', name: 'delivery_man_civility')]
  38. public function civility(Request $request): Response
  39. {
  40. $session = $request->getSession();
  41. $deliveryMan = $session->get('deliveryMan', 0);
  42. if (!$deliveryMan) {
  43. return $this->redirectToRoute('delivery_man_register', []);
  44. }
  45. $form = $this->createForm(DeliveryManType::class, $deliveryMan);
  46. $form->handleRequest($request);
  47. if ($form->isSubmitted() && $form->isValid()) {
  48. /** @var DeliveryMan $deliveryMan */
  49. $deliveryMan = $form->getData();
  50. $session->set('deliveryMan', $deliveryMan);
  51. return $this->redirectToRoute('delivery_man_address', []);
  52. }
  53. return $this->render('delivery_man_registration/civility.html.twig', [
  54. 'form' => $form->createView()
  55. ]);
  56. }
  57. #[Route('/register/man/address', name: 'delivery_man_address')]
  58. public function address(Request $request, UserTypeRepository $userTypeRepository, ManagerRegistry $doctrine, UserPasswordHasherInterface $passwordHasher): Response
  59. {
  60. $session = $request->getSession();
  61. $entityManager = $doctrine->getManager();
  62. /** @var ?DeliveryMan $deliveryMan */
  63. $deliveryMan = $session->get('deliveryMan', null);
  64. if (!$deliveryMan) {
  65. return $this->redirectToRoute('delivery_man_register', []);
  66. }
  67. $deliveryMan->removeAllAddress();
  68. $form = $this->createForm(DeliveryManType::class, $deliveryMan);
  69. $form->handleRequest($request);
  70. if ($form->isSubmitted() && $form->isValid()) {
  71. /** @var DeliveryMan $deliveryMan */
  72. $deliveryMan = $form->getData();
  73. $userType = $userTypeRepository->findOneByName("Livreur auto-entrepreneur");
  74. $deliveryMan->setUserType($userType);
  75. if (!$deliveryMan->getId() && $deliveryMan->getPlainPassword()) {
  76. $hashedPassword = $passwordHasher->hashPassword($deliveryMan, $deliveryMan->getPlainPassword());
  77. $deliveryMan->setPassword($hashedPassword);
  78. $entityManager->persist($deliveryMan);
  79. }
  80. $entityManager->flush();
  81. $session->set('deliveryMan', $deliveryMan);
  82. return $this->redirectToRoute('delivery_man_vehicle', ['id' => $deliveryMan->getId()]);
  83. }
  84. return $this->render('delivery_man_registration/address.html.twig', [
  85. 'form' => $form->createView()
  86. ]);
  87. }
  88. #[Route('/register/man/vehicle/{id}', name: 'delivery_man_vehicle')]
  89. public function vehicle(ManagerRegistry $doctrine, Request $request, DeliveryMan $deliveryMan): Response
  90. {
  91. $entityManager = $doctrine->getManager();
  92. $form = $this->createForm(DeliveryManType::class, $deliveryMan);
  93. $form->handleRequest($request);
  94. if ($form->isSubmitted() && $form->isValid()) {
  95. /** @var DeliveryMan $deliveryMan */
  96. $deliveryMan = $form->getData();
  97. $entityManager->flush();
  98. return $this->redirectToRoute('delivery_man_documents', ['id' => $deliveryMan->getId()]);
  99. }
  100. return $this->render('delivery_man_registration/vehicle.html.twig', [
  101. 'form' => $form->createView(),
  102. 'id' => $deliveryMan->getId()
  103. ]);
  104. }
  105. #[Route('/register/man/documents/{id}', name: 'delivery_man_documents')]
  106. public function documents(Request $request, ManagerRegistry $doctrine, FileUploader $uploader, DeliveryMan $deliveryMan): Response
  107. {
  108. $entityManager = $doctrine->getManager();
  109. $form = $this->createForm(DeliveryManType::class, $deliveryMan);
  110. $form->handleRequest($request);
  111. if ($form->isSubmitted() && $form->isValid()) {
  112. $documentsForm = $form->get('documents');
  113. /** @var DeliveryMan $deliveryMan */
  114. $deliveryMan = $form->getData();
  115. $directory = sprintf("%s/%d",$this->getParameter('confidential_document_directory'), $deliveryMan->getId());
  116. foreach ($documentsForm as $key => $documentForm) {
  117. /** @var ?UploadedFile $documentFile */
  118. $documentFile = $documentForm->get('realName')->getData();
  119. /** @var Document $document */
  120. $document = $documentForm->getData();
  121. if ($documentFile) {
  122. $documentType = TypeDocumentEnum::fromName($key);
  123. //TODO: uploadFile should maybe use File instead of Form.
  124. $uploader->uploadFile($documentType, $documentsForm, $deliveryMan, $directory);
  125. $document->setDisplayName($key);
  126. } else {
  127. $deliveryMan->removeDocument($document);
  128. }
  129. }
  130. $entityManager->flush();
  131. return $this->redirectToRoute('delivery_man_sectors', ['id' => $deliveryMan->getId()]);
  132. }
  133. return $this->render('delivery_man_registration/documents.html.twig', [
  134. 'form' => $form->createView(),
  135. 'id' => $deliveryMan->getId()
  136. ]);
  137. }
  138. #[Route('/register/man/sectors/{id}', name: 'delivery_man_sectors')]
  139. public function sectors(Request $request, ManagerRegistry $doctrine, DeliveryMan $deliveryMan): Response
  140. {
  141. $entityManager = $doctrine->getManager();
  142. $form = $this->createForm(DeliveryManType::class, $deliveryMan);
  143. $form->remove('documents')->remove('addresses');
  144. $form->handleRequest($request);
  145. if ($form->isSubmitted() && $form->isValid()) {
  146. $error = false;
  147. /** @var DeliveryMan $deliveryMan */
  148. $deliveryMan = $form->getData();
  149. $sectorsIterator = $deliveryMan->getSectors()->getIterator();
  150. $sectorsIterator->rewind();
  151. $sector1Coordinate = null;
  152. while ($sectorsIterator->valid()) {
  153. $sector = $sectorsIterator->current();
  154. $geolocation = explode(",", $sector->getGeolocation());
  155. $sectorCoordinate = new Coordinate($geolocation[0], $geolocation[1]);
  156. if ($sector1Coordinate === null) {
  157. $sector1Coordinate = $sectorCoordinate;
  158. } else {
  159. // Calculer la distance par rapport au premier secteur
  160. $vincenty = new Vincenty();
  161. $distance = $vincenty->getDistance($sector1Coordinate, $sectorCoordinate);
  162. // Vérifier si la distance dépasse 30 km
  163. if ($distance / 1000 > 30) {
  164. $error = true;
  165. break;
  166. }
  167. }
  168. $sectorsIterator->next();
  169. }
  170. if (!$error) {
  171. $entityManager->flush();
  172. return $this->redirectToRoute('delivery_man_know', ['id' => $deliveryMan->getId()]);
  173. } else {
  174. $this->addFlash('error', 'Un ou plusieurs secteurs ajoutés est trop loin de votre premier secteur (>30km)');
  175. }
  176. }
  177. return $this->render('delivery_man_registration/sectors.html.twig', [
  178. 'form' => $form->createView(),
  179. 'id' => $deliveryMan->getId()
  180. ]);
  181. }
  182. #[Route('/register/man/know/{id}', name: 'delivery_man_know')]
  183. public function know(Request $request, ManagerRegistry $doctrine, DeliveryMan $deliveryMan): Response
  184. {
  185. $entityManager = $doctrine->getManager();
  186. $form = $this->createForm(DeliveryManType::class, $deliveryMan);
  187. $form->remove('documents')->remove('sectors')->remove('addresses');
  188. $form->handleRequest($request);
  189. if ($form->isSubmitted() && $form->isValid()) {
  190. /** @var DeliveryMan $deliveryMan */
  191. $deliveryMan = $form->getData();
  192. /** @var string $know */
  193. $know = $form->get('know')->getData();
  194. if ($know == 'Autre') {
  195. /** @var string $other */
  196. $other = $form->get('other')->getData();
  197. $know = $other != '' ? $other : $know;
  198. $deliveryMan->setKnow($know);
  199. }
  200. $entityManager->flush();
  201. return $this->redirectToRoute('app_confirmation', ['id' => $deliveryMan->getId()]);
  202. }
  203. return $this->render('delivery_man_registration/know.html.twig', [
  204. 'form' => $form->createView(),
  205. 'id' => $deliveryMan->getId()
  206. ]);
  207. }
  208. }