src/Controller/Front/FormController.php line 43

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Front;
  3. use DateTime;
  4. use DateInterval;
  5. use App\Manager\InfoManager;
  6. use App\Service\CRM\ApiClient;
  7. use App\Traits\RecaptchaTrait;
  8. use App\Service\Mail\{QuoteMailClaimMail};
  9. use Symfony\Component\HttpFoundation\Request;
  10. use Symfony\Component\Routing\Annotation\Route;
  11. use App\Manager\{InfoQuoteManagerFormsManager};
  12. use App\Form\Front\{FormQuoteTypeFormClaimType};
  13. use Symfony\Component\HttpFoundation\RequestStack;
  14. use Symfony\Component\HttpFoundation\RedirectResponse;
  15. use Symfony\Component\HttpFoundation\Response;
  16. use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
  17. use Psr\Log\LoggerInterface;
  18. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  19. use App\Manager\{FormQuoteManagerFormClaimManagerMachineManager};
  20. use App\Repository\FormClaimRepository;
  21. class FormController extends AbstractController
  22. {
  23.     use RecaptchaTrait;
  24.     protected array $locals = [];
  25.     private LoggerInterface $logger;
  26.     public function __construct(RequestStack $requestStackInfoManager $infoManagerLoggerInterface $logger)
  27.     {
  28.         $this->requestStack $requestStack;
  29.         $this->infoManager $infoManager;
  30.         $this->logger $logger;
  31.         $this->locals['menu_active'] = '';
  32.     }
  33.     /**
  34.      * @Route("/cotiza/", name="quote", methods={"POST", "GET"})
  35.      * @Template("front/form/quote.html.twig")
  36.      */
  37.     public function quote(Request $requestInfoQuoteManager $iqmFormQuoteManager $fqmQuoteMail $mailMachineManager $mmApiClient $apiclient)
  38.     {
  39.         $entity $fqm->create();
  40.         $form $this->createForm(FormQuoteType::class, $entity, [
  41.             'action' => $this->generateUrl('quote'),
  42.             'method' => 'POST',
  43.         ]);
  44.         if ($request->isMethod('POST')) {
  45.             $form->handleRequest($request);
  46.             if ($form->isValid() && $this->validateGoogleCaptcha()) {
  47.                 $machine $mm->bySlug$entity->getTypeModel() );
  48.                 $entity->setTypeModel($machine->getCodeCrm());
  49.                 $fqm->save($entity);
  50.                 //$result = $mail->load($entity)->send();
  51.                 //send to CRM
  52.                 $result $apiclient->sendLead($entity);
  53.                 return $this->redirectToRoute('thanks_quote');
  54.             } else {
  55.                 //dump($form->getErrors(true, true)); exit;
  56.             }
  57.         }
  58.         $this->locals['form'] = $form->createView();
  59.         $this->locals['home'] = $iqm->find(1);
  60.         $this->locals['menu_active'] = 'quote';
  61.         return $this->locals;
  62.     }
  63.     /**
  64.      * @Route("/libro-de-reclamaciones/", name="claim")
  65.      * @Template("front/form/claim.html.twig")
  66.      */
  67.     public function claim(Request $requestFormsManager $fmFormClaimManager $fcmClaimMail $mail)
  68.     {
  69.         $entity $fcm->create();
  70.         $form $this->createForm(FormClaimType::class, $entity, [
  71.             'action' => $this->generateUrl('claim'),
  72.             'method' => 'POST',
  73.         ]);
  74.         $code $this->generateCode($fcm->lastCode());
  75.         $entity->setCode($code);
  76.         $this->locals['home'] = $fm->find(1);
  77.         $currencies $this->locals['home']->getClaimCurrencies();
  78.         if (empty($currencies)) {
  79.             $currencies = [
  80.                 ['title' => 'Soles'],
  81.                 ['title' => 'Dolares'],
  82.             ];
  83.         }
  84.         $this->locals['currencies'] = $currencies;
  85.         $entity->setGood('Producto');
  86.         $entity->setType('Reclamo');
  87.         $entity->setMonedaId(1);
  88.         $responseDays = (int)$this->locals['home']->getClaimResponseDays();
  89.         try {
  90.             $this->locals['answer_date'] = (new DateTime())->add(new DateInterval('P' $responseDays 'D'));
  91.         } catch (\Exception $exception) {
  92.             $this->locals['answer_date'] = new DateTime();
  93.         }
  94.         if ($request->isMethod('POST')) {
  95.             $form->handleRequest($request);
  96.             $this->logger->error('FAW RECLAMO: POST recibido', ['post_data' => $request->request->all()]);
  97.             $formOk $form->isValid();
  98.             $captchaOk $this->validateGoogleCaptcha();
  99.             $this->logger->error('FAW RECLAMO: Validacion', ['formOk' => $formOk'captchaOk' => $captchaOk]);
  100.             if (!$formOk) {
  101.                 $errors = [];
  102.                 foreach ($form->getErrors(truetrue) as $error) {
  103.                     $errors[] = $error->getMessage();
  104.                 }
  105.                 $this->logger->error('FAW RECLAMO: Errores de formulario', ['errors' => $errors]);
  106.             }
  107.             if (!$captchaOk) {
  108.                 $this->logger->error('FAW RECLAMO: Captcha fallo');
  109.             }
  110.             if ($formOk && $captchaOk) {
  111.                 $uniq $this->generateUniq();
  112.                 $entity->setUniq($uniq);
  113.                 $entity->setSaved(true);
  114.                 $entity->setAnswerDate($this->locals['answer_date']);
  115.                 $fcm->save($entity);
  116.                 try {
  117.                     $mail->load($entity)->send();
  118.                 } catch (\Exception $e) {
  119.                     $this->logger->error('FAW RECLAMO: Error mail admin: ' $e->getMessage());
  120.                 }
  121.                 try {
  122.                     $mail->loadClient($entity)->send();
  123.                 } catch (\Exception $e) {
  124.                     $this->logger->error('FAW RECLAMO: Error mail client: ' $e->getMessage());
  125.                 }
  126.                 $this->logger->error('FAW RECLAMO: Redirigiendo a thanks_claim con uniq: ' $uniq);
  127.                 return $this->redirectToRoute('thanks_claim', ['uniq' => $uniq]);
  128.             }
  129.         }
  130.         $this->locals['form'] = $form->createView();
  131.         $this->locals['entity'] = $entity;
  132.         $this->locals['menu_active'] = 'claim';
  133.         return $this->locals;
  134.     }
  135.     public function generateCode($lastCode): string
  136.     {
  137.         $id $this->lastCodeId($lastCode);
  138.         return 'D' date('Y') . date('m') . '-' str_pad((string)($id 1), 6'0'STR_PAD_LEFT);
  139.     }
  140.     public function lastCodeId($lastCode): int
  141.     {
  142.         $codigo $this->lastCode($lastCode);
  143.         $array explode('-'$codigo);
  144.         return count($array) == ? (int)$array[1] : 0;
  145.     }
  146.     public function lastCode($lastCode): string
  147.     {
  148.         $code $lastCode;
  149.         return is_null($code) ? 'D' date('Y') . date('m') . '-' '100000' $code;
  150.     }
  151.     private function generateUniq(): string
  152.     {
  153.         return sprintf(
  154.             '%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
  155.             mt_rand(00xffff),
  156.             mt_rand(00xffff),
  157.             mt_rand(00xffff),
  158.             mt_rand(00x0fff) | 0x4000,
  159.             mt_rand(00x3fff) | 0x8000,
  160.             mt_rand(00xffff),
  161.             mt_rand(00xffff),
  162.             mt_rand(00xffff)
  163.         );
  164.     }
  165.     /**
  166.      * @Route("/libro-reclamaciones/pdf/{uniq}", name="claim_pdf", methods={"GET"})
  167.      */
  168.     public function generatePdf(string $uniqFormClaimRepository $formClaimRepositoryFormsManager $formsManager): Response
  169.     {
  170.         if (str_starts_with($uniq'preview-')) {
  171.             return $this->redirectToRoute('preview_claim_pdf');
  172.         }
  173.         $entity $formClaimRepository->findOneBy(['uniq' => $uniq]);
  174.         if (!$entity) {
  175.             throw $this->createNotFoundException('Reclamo no encontrado');
  176.         }
  177.         $home $formsManager->find(1);
  178.         $html $this->renderView('front/pdf/claim_pdf.html.twig', [
  179.             'entity' => $entity,
  180.             'home' => $home,
  181.         ]);
  182.         $mpdf = new \Mpdf\Mpdf([
  183.             'mode' => 'utf-8',
  184.             'format' => 'A4',
  185.             'margin_top' => 0,
  186.             'margin_bottom' => 10,
  187.         ]);
  188.         $mpdf->WriteHTML($html);
  189.         $response = new Response();
  190.         $response->setContent($mpdf->Output('libro-reclamaciones-' $entity->getCode() . '.pdf''S'));
  191.         $response->headers->set('Content-Type''application/pdf');
  192.         $response->headers->set('Content-Disposition''inline; filename="libro-reclamaciones-' $entity->getCode() . '.pdf"');
  193.         return $response;
  194.     }
  195.     /**
  196.      * @Route("/preview-libro-gracias/", name="preview_claim_gracias", methods={"GET"})
  197.      */
  198.     public function previewClaimGracias(FormsManager $formsManager): Response
  199.     {
  200.         $home $formsManager->find(1);
  201.         $mockEntity = new \App\Entity\FormClaim();
  202.         $mockEntity->setCode('D' date('Y') . date('m') . '-XXXXXX');
  203.         $mockEntity->setName('Nombre de prueba');
  204.         $mockEntity->setApellidoPaterno('Apellido Paterno');
  205.         $mockEntity->setApellidoMaterno('Apellido Materno');
  206.         $mockEntity->setEmail('email@ejemplo.com');
  207.         $mockEntity->setPhone('999999999');
  208.         $mockEntity->setDocumentType('DNI');
  209.         $mockEntity->setDocumentNumber('12345678');
  210.         $mockEntity->setCiudad('Lima');
  211.         $mockEntity->setAddress('Av. Ejemplo 123');
  212.         $mockEntity->setGood('Producto');
  213.         $mockEntity->setMonto('100.00');
  214.         $mockEntity->setType('Reclamo');
  215.         $mockEntity->setDetail('Detalle del reclamo de prueba');
  216.         $mockEntity->setDemand('Pedido del consumidor de prueba');
  217.         $mockEntity->setUniq('preview-12345678');
  218.         $message = [
  219.             'title' => $home->getGraciasTitulo() ?: '¡Gracias por enviar tu reclamo!',
  220.             'text' => $home->getGraciasTexto() ?: '<p>Hemos recibido tu Libro de Reclamaciones correctamente.</p><p>En la casilla de correos asignada podrás encontrar la copia del reclamo enviado con el correlativo de seguimiento.</p>',
  221.         ];
  222.         $pdfUrl $this->generateUrl('preview_claim_pdf');
  223.         return $this->render('front/messages/thanks_claim.html.twig', [
  224.             'home' => $home,
  225.             'claim' => $mockEntity,
  226.             'message' => $message,
  227.             'uniq' => 'preview-12345678',
  228.             'pdf_url' => $pdfUrl,
  229.         ]);
  230.     }
  231.     /**
  232.      * @Route("/preview-libro-email/", name="preview_claim_email", methods={"GET"})
  233.      */
  234.     public function previewClaimEmail(FormsManager $formsManager): Response
  235.     {
  236.         $home $formsManager->find(1);
  237.         $mockEntity = new \App\Entity\FormClaim();
  238.         $mockEntity->setCode('D' date('Y') . date('m') . '-XXXXXX');
  239.         $mockEntity->setName('Nombre de prueba');
  240.         $mockEntity->setApellidoPaterno('Apellido Paterno');
  241.         $mockEntity->setApellidoMaterno('Apellido Materno');
  242.         $mockEntity->setEmail('email@ejemplo.com');
  243.         $mockEntity->setPhone('999999999');
  244.         $mockEntity->setDocumentType('DNI');
  245.         $mockEntity->setDocumentNumber('12345678');
  246.         $mockEntity->setCiudad('Lima');
  247.         $mockEntity->setAddress('Av. Ejemplo 123');
  248.         $mockEntity->setGood('Producto');
  249.         $mockEntity->setMonto('100.00');
  250.         $mockEntity->setType('Reclamo');
  251.         $mockEntity->setDetail('Detalle del reclamo de prueba');
  252.         $mockEntity->setDemand('Pedido del consumidor de prueba');
  253.         $mockEntity->setCreatedAt(new \DateTime());
  254.         $mockEntity->setAnswerDate((new \DateTime())->modify('+30 days'));
  255.         $mockEntity->setUniq('preview-12345678');
  256.         $fullName $mockEntity->getName() . ' ' $mockEntity->getApellidoPaterno() . ' ' $mockEntity->getApellidoMaterno();
  257.         $message = [
  258.             'title' => str_replace('%nombre%'$fullName$home->getEmailTitulo() ?: '¡Gracias por enviar tu libro de reclamaciones, %nombre%!'),
  259.             'text' => $home->getEmailTexto() ?: '<p>Te confirmamos que hemos recibido tu Libro de Reclamaciones correctamente.</p><p>En la casilla de correos asignada podrás encontrar la copia del reclamo enviado con el correlativo de seguimiento.</p>',
  260.         ];
  261.         $pdfUrl $this->generateUrl('preview_claim_pdf');
  262.         return $this->render('front/preview/preview-email.html.twig', [
  263.             'entity' => $mockEntity,
  264.             'home' => $home,
  265.             'message' => $message,
  266.             'pdf_url' => $pdfUrl,
  267.         ]);
  268.     }
  269.     /**
  270.      * @Route("/preview-libro-pdf/", name="preview_claim_pdf", methods={"GET"})
  271.      */
  272.     public function previewClaimPdf(FormsManager $formsManager): Response
  273.     {
  274.         $home $formsManager->find(1);
  275.         $mockEntity = new \App\Entity\FormClaim();
  276.         $mockEntity->setCode('D' date('Y') . date('m') . '-XXXXXX');
  277.         $mockEntity->setName('Nombre de prueba');
  278.         $mockEntity->setApellidoPaterno('Apellido Paterno');
  279.         $mockEntity->setApellidoMaterno('Apellido Materno');
  280.         $mockEntity->setCiudad('Lima');
  281.         $mockEntity->setAddress('Av. Ejemplo 123');
  282.         $mockEntity->setDocumentType('DNI');
  283.         $mockEntity->setDocumentNumber('12345678');
  284.         $mockEntity->setPhone('999999999');
  285.         $mockEntity->setEmail('email@ejemplo.com');
  286.         $mockEntity->setGood('Producto');
  287.         $mockEntity->setMonedaId(1);
  288.         $mockEntity->setMonto('100.00');
  289.         $mockEntity->setDescription('Descripción del bien');
  290.         $mockEntity->setType('Reclamo');
  291.         $mockEntity->setDetail('Detalle del reclamo de prueba');
  292.         $mockEntity->setDemand('Pedido del consumidor de prueba');
  293.         $mockEntity->setCreatedAt(new \DateTime());
  294.         $mockEntity->setUniq('preview-12345678');
  295.         $html $this->renderView('front/pdf/claim_pdf.html.twig', [
  296.             'entity' => $mockEntity,
  297.             'home' => $home,
  298.         ]);
  299.         $mpdf = new \Mpdf\Mpdf([
  300.             'mode' => 'utf-8',
  301.             'format' => 'A4',
  302.             'margin_top' => 0,
  303.             'margin_bottom' => 10,
  304.         ]);
  305.         $mpdf->WriteHTML($html);
  306.         $response = new Response();
  307.         $response->setContent($mpdf->Output('preview-libro-reclamaciones.pdf''S'));
  308.         $response->headers->set('Content-Type''application/pdf');
  309.         $response->headers->set('Content-Disposition''inline; filename="preview-libro-reclamaciones.pdf"');
  310.         return $response;
  311.     }
  312. }