src/Controller/Front/QuotationController.php line 66

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Front;
  3. use App\Classes\FormRequestSparePart;
  4. use App\Controller\Core\BaseFrontController;
  5. use App\Entity\Bus;
  6. use App\Entity\BusFilterPBV;
  7. use App\Entity\FormQuotationBuses;
  8. use App\Entity\FormQuotationServices;
  9. use App\Entity\FormQuotationTrucks;
  10. use App\Entity\Truck;
  11. use App\Entity\TruckBrand;
  12. use App\Entity\TruckFilterTonnage;
  13. use App\Entity\TruckModel;
  14. use App\Entity\TruckTonnage;
  15. use App\Entity\UserClient;
  16. use App\Form\Front\FormQuotationBusesType;
  17. use App\Form\Front\FormQuotationServicesType;
  18. use App\Form\Front\FormQuotationTrucksType;
  19. use App\Form\Front\QuotationRegisterType;
  20. use App\Manager\AdviserUserManager;
  21. use App\Manager\BusFilterPBVManager;
  22. use App\Manager\BusManager;
  23. use App\Manager\EstablishmentManager;
  24. use App\Manager\FormQuotationBusesManager;
  25. use App\Manager\FormQuotationRequestManager;
  26. use App\Manager\FormQuotationServicesManager;
  27. use App\Manager\FormQuotationTrucksManager;
  28. use App\Manager\QuotationBusesManager;
  29. use App\Manager\QuotationRequestManager;
  30. use App\Manager\QuotationServicesManager;
  31. use App\Manager\QuotationTrucksManager;
  32. use App\Manager\RequestServiceManager;
  33. use App\Manager\RequestSparePartManager;
  34. use App\Manager\ServiceManager;
  35. use App\Manager\TruckBrandManager;
  36. use App\Manager\TruckFilterTonnageManager;
  37. use App\Manager\TruckManager;
  38. use App\Manager\TruckModelManager;
  39. use App\Manager\TruckTonnageManager;
  40. use App\Manager\UserClientManager;
  41. use App\Security\ClientQuotationAuthenticator;
  42. use App\Service\CRM\ApiCRM;
  43. use App\Service\CRM\Lead;
  44. use App\Service\Mail\QuotationBusesMail;
  45. use App\Service\Mail\QuotationRequestMail;
  46. use App\Service\Mail\QuotationServicesMail;
  47. use App\Service\Mail\QuotationTrucksMail;
  48. use App\Service\Mail\RequestServiceAdviserMail;
  49. use App\Service\Mail\RequestServiceClientMail;
  50. use App\Service\Mail\RequestSparePartsAdviserMail;
  51. use App\Service\Mail\RequestSparePartsClientMail;
  52. use App\Traits\FormFileTrait;
  53. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  54. use Symfony\Component\HttpFoundation\File\UploadedFile;
  55. use Symfony\Component\HttpFoundation\JsonResponse;
  56. use Symfony\Component\HttpFoundation\RedirectResponse;
  57. use Symfony\Component\HttpFoundation\Request;
  58. use Symfony\Component\HttpFoundation\Response;
  59. use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface;
  60. use Symfony\Component\Routing\Annotation\Route;
  61. use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
  62. use Symfony\Component\Security\Http\Authentication\UserAuthenticatorInterface;
  63. class QuotationController extends BaseFrontController
  64. {
  65.     use FormFileTrait;
  66.     const FORM_QUOTATION_TRUCKS 'sd_form_quotation_trucks_entity';
  67.     const FORM_QUOTATION_BUSES 'sd_form_quotation_buses_entity';
  68.     const FORM_QUOTATION_SERVICES 'sd_form_quotation_services_entity';
  69.     const FORM_QUOTATION_REGISTER 'sd_form_quotation_register';
  70.     const FORM_QUOTATION_REGISTER_ERROR 'sd_form_quotation_register_error';
  71.     /**
  72.      * @Route("/cotizar-camiones", name="quotation_trucks", methods={"GET"})
  73.      * @Template("front/quotation/trucks.html.twig")
  74.      */
  75.     public function quotationTrucks(QuotationTrucksManager $quotationTrucksManager): array
  76.     {
  77.         $entity $this->getFormSession(self::FORM_QUOTATION_TRUCKS, new FormQuotationTrucks());
  78.         $form $this->getFormView(FormQuotationTrucksType::class, $entity'quotation_trucks_action');
  79.         $this->locals['sd'] = $quotationTrucksManager->find(1);
  80.         $this->locals['form'] = $form;
  81.         return $this->locals;
  82.     }
  83.     /**
  84.      * @Route("/cotizar-camiones", name="quotation_trucks_action", methods={"POST"})
  85.      */
  86.     public function quotationTrucksAction(Request $requestFormQuotationTrucksManager $managerQuotationTrucksMail $mailApiCRM $apiCRM): RedirectResponse
  87.     {
  88.         $entity = new FormQuotationTrucks();
  89.         $form $this->getForm(FormQuotationTrucksType::class, $entity'quotation_trucks_action');
  90.         $form->handleRequest($request);
  91.         if ($form->isValid() && $this->captchaValidate()) {
  92.             $manager->save($entity);
  93.             $mail->load($entity)->send();
  94.             $result $apiCRM->send(Lead::fromEntity($entity));
  95.             $entity->setResultCrm($result);
  96.             $manager->save($entity);
  97.             return $this->redirectToRoute('thanks_slug', ['slug' => 'cotizar-camiones']);
  98.         }
  99.         $this->saveFormSession(self::FORM_QUOTATION_TRUCKS$entity);
  100.         return $this->redirectToRoute('quotation_trucks');
  101.     }
  102.     /**
  103.      * @Route("/cotizar-buses", name="quotation_buses", methods={"GET"})
  104.      * @Template("front/quotation/buses.html.twig")
  105.      */
  106.     public function quotationBuses(QuotationBusesManager $quotationBusesManager): array
  107.     {
  108.         $entity $this->getFormSession(self::FORM_QUOTATION_BUSES, new FormQuotationBuses());
  109.         $form $this->getFormView(FormQuotationBusesType::class, $entity'quotation_buses_action');
  110.         $this->locals['sd'] = $quotationBusesManager->find(1);
  111.         $this->locals['form'] = $form;
  112.         return $this->locals;
  113.     }
  114.     /**
  115.      * @Route("/cotizar-buses", name="quotation_buses_action", methods={"POST"})
  116.      */
  117.     public function quotationBusesAction(Request $requestFormQuotationBusesManager $managerQuotationBusesMail $mailApiCRM $apiCRM): RedirectResponse
  118.     {
  119.         $entity = new FormQuotationBuses();
  120.         $form $this->getForm(FormQuotationBusesType::class, $entity'quotation_buses_action');
  121.         $form->handleRequest($request);
  122.         if ($form->isValid() && $this->captchaValidate()) {
  123.             $manager->save($entity);
  124.             $mail->load($entity)->send();
  125.             $result $apiCRM->send(Lead::fromEntity($entity));
  126.             $entity->setResultCrm($result);
  127.             $manager->save($entity);
  128.             return $this->redirectToRoute('thanks_slug', ['slug' => 'cotizar-buses']);
  129.         }
  130.         $this->saveFormSession(self::FORM_QUOTATION_BUSES$entity);
  131.         return $this->redirectToRoute('quotation_buses');
  132.     }
  133.     /**
  134.      * @Route("/cotizar-servicios", name="quotation_services", methods={"GET"})
  135.      * @Template("front/quotation/services.html.twig")
  136.      */
  137.     public function quotationServices(QuotationServicesManager $quotationServicesManagerServiceManager $serviceManagerAdviserUserManager $adviserUserManagerEstablishmentManager $establishmentManager): array
  138.     {
  139.         $entity $this->getFormSession(self::FORM_QUOTATION_SERVICES, new FormQuotationServices());
  140.         $form $this->getFormView(FormQuotationServicesType::class, $entity'quotation_services_action');
  141.         $this->locals['sd'] = $quotationServicesManager->find(1);
  142.         $this->locals['services'] = $serviceManager->valid();
  143.         $this->locals['advisers'] = $adviserUserManager->serviceAdviser();
  144.         $this->locals['establishments'] = $establishmentManager->inFormQuotationServices();
  145.         $this->locals['form'] = $form;
  146.         return $this->locals;
  147.     }
  148.     /**
  149.      * @Route("/cotizar-servicios", name="quotation_services_action", methods={"POST"})
  150.      */
  151.     public function quotationServicesAction(Request $requestUserClientManager $userClientManagerRequestServiceManager $requestServiceManagerAdviserUserManager $adviserUserManagerFormQuotationServicesManager $managerQuotationServicesMail $mailRequestServiceAdviserMail $requestServiceAdviserMailRequestServiceClientMail $requestServiceClientMail): RedirectResponse
  152.     {
  153.         $entity = new FormQuotationServices();
  154.         $form $this->getForm(FormQuotationServicesType::class, $entity'quotation_services_action');
  155.         $form->handleRequest($request);
  156.         $adviserId $request->request->getInt('adviser_id');
  157.         $adviser $adviserUserManager->byId($adviserId);
  158.         if (is_null($adviser)) {
  159.             $adviser $adviserUserManager->serviceRandom();
  160.         }
  161.         $entity->setAdviser($adviser);
  162.         if ($form->isValid() && $this->captchaValidate()) {
  163.             $entity $manager->save($entity);
  164.             $user $userClientManager->byDocument($entity->getDocumentNumber());
  165.             if (is_null($user)) {
  166.                 $user $userClientManager->generate($entity->getEmail(), $entity->getName(), $entity->getDocumentNumber(), $entity->getPhone());
  167.             }
  168.             $requestService $requestServiceManager->fromQuotation($user$adviser$entity);
  169.             $mail->load($entity)->send();
  170.             $requestServiceAdviserMail->load($requestService)->send();
  171.             $requestServiceClientMail->load($requestService)->send();
  172.             return $this->redirectToRoute('thanks_slug', ['slug' => 'cotizar-servicios']);
  173.         }
  174.         $this->saveFormSession(self::FORM_QUOTATION_SERVICES$entity);
  175.         return $this->redirectToRoute('quotation_services');
  176.     }
  177.     /**
  178.      * @Route("/cotizar", name="quotation_request", methods={"GET"})
  179.      * @Template("front/quotation/quotation_request.html.twig")
  180.      */
  181.     public function quotationRequest(QuotationRequestManager $quotationRequestManagerAdviserUserManager $adviserUserManagerTruckBrandManager $truckBrandManager): array
  182.     {
  183.         $this->locals['advisers'] = $adviserUserManager->sparePartsAdviser();
  184.         $this->locals['brands'] = $truckBrandManager->valid();
  185.         $this->locals['sd'] = $quotationRequestManager->find(1);
  186.         return $this->locals;
  187.     }
  188.     /**
  189.      * @Route("/cotizar", name="quotation_request_action", methods={"POST"})
  190.      */
  191.     public function quotationRequestAction(Request $requestRequestSparePartManager $requestSparePartManagerAdviserUserManager $adviserUserManagerFormQuotationRequestManager $managerQuotationRequestMail $mailRequestSparePartsAdviserMail $requestSparePartsAdviserMailRequestSparePartsClientMail $requestSparePartsClientMail): RedirectResponse
  192.     {
  193.         $brands $request->request->get('form_brand', []);
  194.         $models $request->request->get('form_model', []);
  195.         $vimPlates $request->request->get('form_vim_plate', []);
  196.         $numberCodes $request->request->get('form_number_code', []);
  197.         $quantities $request->request->get('form_quantity', []);
  198.         $discounts $request->request->get('form_discount', []);
  199.         $descriptions $request->request->get('form_description', []);
  200.         $images $request->files->get('form_images', []);
  201.         $spareParts = [];
  202.         foreach ($brands as $index => $brand) {
  203.             $model $this->getDataFromRequestArray($models$index);
  204.             $vimPlate $this->getDataFromRequestArray($vimPlates$index);
  205.             $numberCode $this->getDataFromRequestArray($numberCodes$index);
  206.             $quantity $this->getDataFromRequestArray($quantities$index);
  207.             $discount $this->getDataFromRequestArray($discounts$index);
  208.             $description $this->getDataFromRequestArray($descriptions$index);
  209.             $image null;
  210.             $imageObject array_key_exists($indexis_array($images) ? $images : []) ? $images[$index] : null;
  211.             if (!is_null($imageObject) and get_class($imageObject) === UploadedFile::class) {
  212.                 $image $this->saveFile($imageObject10000000'cotizaciones-repuestos');
  213.             }
  214.             $sparePart = (new FormRequestSparePart())->create($brand$model$vimPlate$numberCode$quantity$image$discount$description);
  215.             if (!is_null($sparePart)) {
  216.                 $spareParts[] = $sparePart->toArray();
  217.             }
  218.         }
  219.         /** @var UserClient $user */
  220.         $user $this->getUser();
  221.         $adviserId $request->request->getInt('quotation_adviser');
  222.         $adviser $adviserUserManager->byId($adviserId);
  223.         if (is_null($adviser)) {
  224.             $adviser $adviserUserManager->sparePartsRandom();
  225.         }
  226.         $entity $manager->createFromUser($user);
  227.         $entity->setSpareParts($spareParts);
  228.         $entity->setAdviser($adviser);
  229.         $manager->save($entity);
  230.         $requestSpareSpart $requestSparePartManager->fromQuotation($user$adviser$entity);
  231.         $mail->load($entity)->send();
  232.         $requestSparePartsAdviserMail->load($requestSpareSpart)->send();
  233.         $requestSparePartsClientMail->load($requestSpareSpart)->send();
  234.         return $this->redirectToRoute('quotation_thanks');
  235.     }
  236.     /**
  237.      * @Route("/cotizar/ingreso", name="quotation_login")
  238.      * @Template("front/quotation/quotation_login.html.twig")
  239.      */
  240.     public function quotationLogin(AuthenticationUtils $authenticationUtils): Response
  241.     {
  242.         if ($this->getUser()) {
  243.             return $this->redirectToRoute('quotation_request');
  244.         }
  245.         $error $authenticationUtils->getLastAuthenticationError();
  246.         $lastUsername $authenticationUtils->getLastUsername();
  247.         $this->locals['error'] = $error;
  248.         $this->locals['last_username'] = $lastUsername;
  249.         $response = new Response();
  250.         $content $this->renderView('front/quotation/quotation_login.html.twig'$this->locals);
  251.         $response->setContent($content);
  252.         return $response;
  253.     }
  254.     /**
  255.      * @Route("/cotizar/registro", name="quotation_register", methods={"GET"})
  256.      * @Template("front/quotation/quotation_register.html.twig")
  257.      */
  258.     public function quotationRegister(QuotationRequestManager $quotationRequestManager): array
  259.     {
  260.         $session $this->requestStack->getSession();
  261.         $entity $session->get(self::FORM_QUOTATION_REGISTER, new UserClient());
  262.         $session->remove(self::FORM_QUOTATION_REGISTER);
  263.         $errors $session->get(self::FORM_QUOTATION_REGISTER_ERROR, []);
  264.         $session->remove(self::FORM_QUOTATION_REGISTER_ERROR);
  265.         $session->remove('sd_form_quotation_register_errors');
  266.         $form $this->createForm(QuotationRegisterType::class, $entity, [
  267.             'action' => $this->generateUrl('quotation_register_action'),
  268.             'method' => 'POST',
  269.         ])->createView();
  270.         $this->locals['sd'] = $quotationRequestManager->find(1);
  271.         $this->locals['form'] = $form;
  272.         $this->locals['error'] = $errors;
  273.         return $this->locals;
  274.     }
  275.     /**
  276.      * @Route("/cotizar/registro", name="quotation_register_action", methods={"POST"})
  277.      */
  278.     public function quotationRegisterAction(Request $requestUserPasswordHasherInterface $hasherUserClientManager $managerUserAuthenticatorInterface $userAuthenticatorClientQuotationAuthenticator $clientQuotationAuthenticator): RedirectResponse
  279.     {
  280.         if ($this->getUser()) {
  281.             return $this->redirectToRoute('quotation_request');
  282.         }
  283.         $entity = new UserClient();
  284.         $form $this->createForm(QuotationRegisterType::class, $entity, [
  285.             'action' => $this->generateUrl('quotation_register_action'),
  286.             'method' => 'POST',
  287.         ]);
  288.         $form->handleRequest($request);
  289.         $entity->setRoles(['ROLE_USER']);
  290.         $entity->setType(UserClient::USER_TYPE_CLIENT);
  291.         $entity->setPassword($hasher->hashPassword($entity$entity->getEmail()));
  292.         if ($form->isValid() && $this->captchaValidate()) {
  293.             $manager->save($entity);
  294.             $userAuthenticator->authenticateUser($entity$clientQuotationAuthenticator$request);
  295.             return $this->redirectToRoute('quotation_request');
  296.         }
  297.         $error null;
  298.         if ($manager->byDocument($entity->getDocument())) {
  299.             $error 'document';
  300.         } elseif ($manager->byEmail($entity->getEmail())) {
  301.             $error 'email';
  302.         }
  303.         $session $this->requestStack->getSession();
  304.         $session->set(self::FORM_QUOTATION_REGISTER$entity);
  305.         $session->set(self::FORM_QUOTATION_REGISTER_ERROR$error);
  306.         return $this->redirectToRoute('quotation_register');
  307.     }
  308.     /**
  309.      * @Route("/cotizar/gracias", name="quotation_thanks")
  310.      * @Template("front/quotation/quotation_thanks.html.twig")
  311.      */
  312.     public function quotationThanks(QuotationRequestManager $quotationRequestManager): array
  313.     {
  314.         $this->locals['sd'] = $quotationRequestManager->find(1);
  315.         return $this->locals;
  316.     }
  317.     /**
  318.      * @Route("/cotizar-marcas", name="quotation_brands")
  319.      */
  320.     public function quotationBrands(Request $requestTruckBrandManager $truckBrandManager): JsonResponse
  321.     {
  322.         $brands $truckBrandManager->valid();
  323.         $brandsArray array_map(function (TruckBrand $brand) { return $brand->toArray(); }, $brands);
  324.         $response = new JsonResponse($brandsArray);
  325.         $response->headers->set('X-Robots-Tag''noindex, nofollow');
  326.         return $response;
  327.     }
  328.     /**
  329.      * @Route("/cotizar-modelos", name="quotation_models")
  330.      */
  331.     public function quotationModels(Request $requestTruckModelManager $truckModelManager): JsonResponse
  332.     {
  333.         $models $truckModelManager->valid();
  334.         $modelsArray array_map(function (TruckModel $model) { return $model->toArray(); }, $models);
  335.         $response = new JsonResponse($modelsArray);
  336.         $response->headers->set('X-Robots-Tag''noindex, nofollow');
  337.         return $response;
  338.     }
  339.     /**
  340.      * @Route("/cotizar-tonelajes", name="quotation_tonnages")
  341.      */
  342.     public function quotationTonnages(Request $requestTruckFilterTonnageManager $truckFilterTonnageManager): JsonResponse
  343.     {
  344.         $tonnages $truckFilterTonnageManager->valid();
  345.         $tonnagesArray array_map(function (TruckFilterTonnage $tonnage) { return $tonnage->toArray(); }, $tonnages);
  346.         $response = new JsonResponse($tonnagesArray);
  347.         $response->headers->set('X-Robots-Tag''noindex, nofollow');
  348.         return $response;
  349.     }
  350.     /**
  351.      * @Route("/cotizar-pbv", name="quotation_pbv")
  352.      */
  353.     public function quotationPBV(Request $requestBusFilterPBVManager $busFilterPBVManager): JsonResponse
  354.     {
  355.         $pbvs $busFilterPBVManager->valid();
  356.         $pbvArray array_map(function (BusFilterPBV $pbv) { return $pbv->toArray(); }, $pbvs);
  357.         $response = new JsonResponse($pbvArray);
  358.         $response->headers->set('X-Robots-Tag''noindex, nofollow');
  359.         return $response;
  360.     }
  361.     /**
  362.      * @Route("/cotizar-modelos-marca", name="quotation_models_by_brand")
  363.      */
  364.     public function quotationModelsByBrand(Request $requestTruckBrandManager $truckBrandManagerTruckModelManager $truckModelManager): JsonResponse
  365.     {
  366.         $brand $request->request->get('brand''');
  367.         if (!$brand) {
  368.             return new JsonResponse([]);
  369.         }
  370.         $brand $truckBrandManager->bySlug($brand);
  371.         if (is_null($brand)) {
  372.             return new JsonResponse([]);
  373.         }
  374.         $models $truckModelManager->byBrand($brand);
  375.         $modelsArray array_map(function (TruckModel $model) { return $model->toArray(); }, $models);
  376.         $response = new JsonResponse($modelsArray);
  377.         $response->headers->set('X-Robots-Tag''noindex, nofollow');
  378.         return $response;
  379.     }
  380.     /**
  381.      * @Route("/cotizar-modelos-tonelajes", name="quotation_models_by_tonnage")
  382.      */
  383.     public function quotationModelsByTonnage(Request $requestTruckManager $truckManagerTruckFilterTonnageManager $truckFilterTonnageManager): JsonResponse
  384.     {
  385.         $tonnage $request->request->get('tonnage''');
  386.         if (!$tonnage) {
  387.             return new JsonResponse([]);
  388.         }
  389.         $tonnage $truckFilterTonnageManager->bySlug($tonnage);
  390.         if (is_null($tonnage)) {
  391.             return new JsonResponse([]);
  392.         }
  393.         $models $truckManager->byTonnage($tonnage);
  394.         $modelsArray array_map(function (Truck $truck) { return $truck->toArray(); }, $models);
  395.         $response = new JsonResponse($modelsArray);
  396.         $response->headers->set('X-Robots-Tag''noindex, nofollow');
  397.         return $response;
  398.     }
  399.     /**
  400.      * @Route("/cotizar-modelos-pbv", name="quotation_models_by_pbv")
  401.      */
  402.     public function quotationBusesByPBV(Request $requestBusManager $busManagerBusFilterPBVManager $busFilterPBVManager): JsonResponse
  403.     {
  404.         $tonnage $request->request->get('pbv''');
  405.         if (!$tonnage) {
  406.             return new JsonResponse([]);
  407.         }
  408.         $tonnage $busFilterPBVManager->bySlug($tonnage);
  409.         if (is_null($tonnage)) {
  410.             return new JsonResponse([]);
  411.         }
  412.         $buses $busManager->byPBV($tonnage);
  413.         $busesArray array_map(function (Bus $bus) { return $bus->toArray(); }, $buses);
  414.         $response = new JsonResponse($busesArray);
  415.         $response->headers->set('X-Robots-Tag''noindex, nofollow');
  416.         return $response;
  417.     }
  418.     /**
  419.      * @Route("/cotizar-tonelajes-modelo", name="quotation_tonnages_by_model")
  420.      */
  421.     public function quotationTonnagesByModel(Request $requestTruckModelManager $truckModelManagerTruckTonnageManager $truckTonnageManager): JsonResponse
  422.     {
  423.         $model $request->request->get('model''');
  424.         if (!$model) {
  425.             return new JsonResponse([]);
  426.         }
  427.         $model $truckModelManager->bySlug($model);
  428.         if (is_null($model)) {
  429.             return new JsonResponse([]);
  430.         }
  431.         $tonnages $truckTonnageManager->byModel($model);
  432.         $tonnagesArray array_map(function (TruckTonnage $tonnage) { return $tonnage->toArray(); }, $tonnages);
  433.         $response = new JsonResponse($tonnagesArray);
  434.         $response->headers->set('X-Robots-Tag''noindex, nofollow');
  435.         return $response;
  436.     }
  437.     protected function getDataFromRequestArray($arrayint $index): ?string
  438.     {
  439.         return array_key_exists($indexis_array($array) ? $array : []) ? $array[$index] : null;
  440.     }
  441. }