<?php
namespace App\Controller\Front;
use DateTime;
use DateInterval;
use App\Manager\InfoManager;
use App\Service\CRM\ApiClient;
use App\Traits\RecaptchaTrait;
use App\Service\Mail\{QuoteMail, ClaimMail};
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use App\Manager\{InfoQuoteManager, FormsManager};
use App\Form\Front\{FormQuoteType, FormClaimType};
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Response;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Psr\Log\LoggerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use App\Manager\{FormQuoteManager, FormClaimManager, MachineManager};
use App\Repository\FormClaimRepository;
class FormController extends AbstractController
{
use RecaptchaTrait;
protected array $locals = [];
private LoggerInterface $logger;
public function __construct(RequestStack $requestStack, InfoManager $infoManager, LoggerInterface $logger)
{
$this->requestStack = $requestStack;
$this->infoManager = $infoManager;
$this->logger = $logger;
$this->locals['menu_active'] = '';
}
/**
* @Route("/cotiza/", name="quote", methods={"POST", "GET"})
* @Template("front/form/quote.html.twig")
*/
public function quote(Request $request, InfoQuoteManager $iqm, FormQuoteManager $fqm, QuoteMail $mail, MachineManager $mm, ApiClient $apiclient)
{
$entity = $fqm->create();
$form = $this->createForm(FormQuoteType::class, $entity, [
'action' => $this->generateUrl('quote'),
'method' => 'POST',
]);
if ($request->isMethod('POST')) {
$form->handleRequest($request);
if ($form->isValid() && $this->validateGoogleCaptcha()) {
$machine = $mm->bySlug( $entity->getTypeModel() );
$entity->setTypeModel($machine->getCodeCrm());
$fqm->save($entity);
//$result = $mail->load($entity)->send();
//send to CRM
$result = $apiclient->sendLead($entity);
return $this->redirectToRoute('thanks_quote');
} else {
//dump($form->getErrors(true, true)); exit;
}
}
$this->locals['form'] = $form->createView();
$this->locals['home'] = $iqm->find(1);
$this->locals['menu_active'] = 'quote';
return $this->locals;
}
/**
* @Route("/libro-de-reclamaciones/", name="claim")
* @Template("front/form/claim.html.twig")
*/
public function claim(Request $request, FormsManager $fm, FormClaimManager $fcm, ClaimMail $mail)
{
$entity = $fcm->create();
$form = $this->createForm(FormClaimType::class, $entity, [
'action' => $this->generateUrl('claim'),
'method' => 'POST',
]);
$code = $this->generateCode($fcm->lastCode());
$entity->setCode($code);
$this->locals['home'] = $fm->find(1);
$currencies = $this->locals['home']->getClaimCurrencies();
if (empty($currencies)) {
$currencies = [
['title' => 'Soles'],
['title' => 'Dolares'],
];
}
$this->locals['currencies'] = $currencies;
$entity->setGood('Producto');
$entity->setType('Reclamo');
$entity->setMonedaId(1);
$responseDays = (int)$this->locals['home']->getClaimResponseDays();
try {
$this->locals['answer_date'] = (new DateTime())->add(new DateInterval('P' . $responseDays . 'D'));
} catch (\Exception $exception) {
$this->locals['answer_date'] = new DateTime();
}
if ($request->isMethod('POST')) {
$form->handleRequest($request);
$this->logger->error('FAW RECLAMO: POST recibido', ['post_data' => $request->request->all()]);
$formOk = $form->isValid();
$captchaOk = $this->validateGoogleCaptcha();
$this->logger->error('FAW RECLAMO: Validacion', ['formOk' => $formOk, 'captchaOk' => $captchaOk]);
if (!$formOk) {
$errors = [];
foreach ($form->getErrors(true, true) as $error) {
$errors[] = $error->getMessage();
}
$this->logger->error('FAW RECLAMO: Errores de formulario', ['errors' => $errors]);
}
if (!$captchaOk) {
$this->logger->error('FAW RECLAMO: Captcha fallo');
}
if ($formOk && $captchaOk) {
$uniq = $this->generateUniq();
$entity->setUniq($uniq);
$entity->setSaved(true);
$entity->setAnswerDate($this->locals['answer_date']);
$fcm->save($entity);
try {
$mail->load($entity)->send();
} catch (\Exception $e) {
$this->logger->error('FAW RECLAMO: Error mail admin: ' . $e->getMessage());
}
try {
$mail->loadClient($entity)->send();
} catch (\Exception $e) {
$this->logger->error('FAW RECLAMO: Error mail client: ' . $e->getMessage());
}
$this->logger->error('FAW RECLAMO: Redirigiendo a thanks_claim con uniq: ' . $uniq);
return $this->redirectToRoute('thanks_claim', ['uniq' => $uniq]);
}
}
$this->locals['form'] = $form->createView();
$this->locals['entity'] = $entity;
$this->locals['menu_active'] = 'claim';
return $this->locals;
}
public function generateCode($lastCode): string
{
$id = $this->lastCodeId($lastCode);
return 'D' . date('Y') . date('m') . '-' . str_pad((string)($id + 1), 6, '0', STR_PAD_LEFT);
}
public function lastCodeId($lastCode): int
{
$codigo = $this->lastCode($lastCode);
$array = explode('-', $codigo);
return count($array) == 2 ? (int)$array[1] : 0;
}
public function lastCode($lastCode): string
{
$code = $lastCode;
return is_null($code) ? 'D' . date('Y') . date('m') . '-' . '100000' : $code;
}
private function generateUniq(): string
{
return sprintf(
'%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
mt_rand(0, 0xffff),
mt_rand(0, 0xffff),
mt_rand(0, 0xffff),
mt_rand(0, 0x0fff) | 0x4000,
mt_rand(0, 0x3fff) | 0x8000,
mt_rand(0, 0xffff),
mt_rand(0, 0xffff),
mt_rand(0, 0xffff)
);
}
/**
* @Route("/libro-reclamaciones/pdf/{uniq}", name="claim_pdf", methods={"GET"})
*/
public function generatePdf(string $uniq, FormClaimRepository $formClaimRepository, FormsManager $formsManager): Response
{
if (str_starts_with($uniq, 'preview-')) {
return $this->redirectToRoute('preview_claim_pdf');
}
$entity = $formClaimRepository->findOneBy(['uniq' => $uniq]);
if (!$entity) {
throw $this->createNotFoundException('Reclamo no encontrado');
}
$home = $formsManager->find(1);
$html = $this->renderView('front/pdf/claim_pdf.html.twig', [
'entity' => $entity,
'home' => $home,
]);
$mpdf = new \Mpdf\Mpdf([
'mode' => 'utf-8',
'format' => 'A4',
'margin_top' => 0,
'margin_bottom' => 10,
]);
$mpdf->WriteHTML($html);
$response = new Response();
$response->setContent($mpdf->Output('libro-reclamaciones-' . $entity->getCode() . '.pdf', 'S'));
$response->headers->set('Content-Type', 'application/pdf');
$response->headers->set('Content-Disposition', 'inline; filename="libro-reclamaciones-' . $entity->getCode() . '.pdf"');
return $response;
}
/**
* @Route("/preview-libro-gracias/", name="preview_claim_gracias", methods={"GET"})
*/
public function previewClaimGracias(FormsManager $formsManager): Response
{
$home = $formsManager->find(1);
$mockEntity = new \App\Entity\FormClaim();
$mockEntity->setCode('D' . date('Y') . date('m') . '-XXXXXX');
$mockEntity->setName('Nombre de prueba');
$mockEntity->setApellidoPaterno('Apellido Paterno');
$mockEntity->setApellidoMaterno('Apellido Materno');
$mockEntity->setEmail('email@ejemplo.com');
$mockEntity->setPhone('999999999');
$mockEntity->setDocumentType('DNI');
$mockEntity->setDocumentNumber('12345678');
$mockEntity->setCiudad('Lima');
$mockEntity->setAddress('Av. Ejemplo 123');
$mockEntity->setGood('Producto');
$mockEntity->setMonto('100.00');
$mockEntity->setType('Reclamo');
$mockEntity->setDetail('Detalle del reclamo de prueba');
$mockEntity->setDemand('Pedido del consumidor de prueba');
$mockEntity->setUniq('preview-12345678');
$message = [
'title' => $home->getGraciasTitulo() ?: '¡Gracias por enviar tu reclamo!',
'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>',
];
$pdfUrl = $this->generateUrl('preview_claim_pdf');
return $this->render('front/messages/thanks_claim.html.twig', [
'home' => $home,
'claim' => $mockEntity,
'message' => $message,
'uniq' => 'preview-12345678',
'pdf_url' => $pdfUrl,
]);
}
/**
* @Route("/preview-libro-email/", name="preview_claim_email", methods={"GET"})
*/
public function previewClaimEmail(FormsManager $formsManager): Response
{
$home = $formsManager->find(1);
$mockEntity = new \App\Entity\FormClaim();
$mockEntity->setCode('D' . date('Y') . date('m') . '-XXXXXX');
$mockEntity->setName('Nombre de prueba');
$mockEntity->setApellidoPaterno('Apellido Paterno');
$mockEntity->setApellidoMaterno('Apellido Materno');
$mockEntity->setEmail('email@ejemplo.com');
$mockEntity->setPhone('999999999');
$mockEntity->setDocumentType('DNI');
$mockEntity->setDocumentNumber('12345678');
$mockEntity->setCiudad('Lima');
$mockEntity->setAddress('Av. Ejemplo 123');
$mockEntity->setGood('Producto');
$mockEntity->setMonto('100.00');
$mockEntity->setType('Reclamo');
$mockEntity->setDetail('Detalle del reclamo de prueba');
$mockEntity->setDemand('Pedido del consumidor de prueba');
$mockEntity->setCreatedAt(new \DateTime());
$mockEntity->setAnswerDate((new \DateTime())->modify('+30 days'));
$mockEntity->setUniq('preview-12345678');
$fullName = $mockEntity->getName() . ' ' . $mockEntity->getApellidoPaterno() . ' ' . $mockEntity->getApellidoMaterno();
$message = [
'title' => str_replace('%nombre%', $fullName, $home->getEmailTitulo() ?: '¡Gracias por enviar tu libro de reclamaciones, %nombre%!'),
'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>',
];
$pdfUrl = $this->generateUrl('preview_claim_pdf');
return $this->render('front/preview/preview-email.html.twig', [
'entity' => $mockEntity,
'home' => $home,
'message' => $message,
'pdf_url' => $pdfUrl,
]);
}
/**
* @Route("/preview-libro-pdf/", name="preview_claim_pdf", methods={"GET"})
*/
public function previewClaimPdf(FormsManager $formsManager): Response
{
$home = $formsManager->find(1);
$mockEntity = new \App\Entity\FormClaim();
$mockEntity->setCode('D' . date('Y') . date('m') . '-XXXXXX');
$mockEntity->setName('Nombre de prueba');
$mockEntity->setApellidoPaterno('Apellido Paterno');
$mockEntity->setApellidoMaterno('Apellido Materno');
$mockEntity->setCiudad('Lima');
$mockEntity->setAddress('Av. Ejemplo 123');
$mockEntity->setDocumentType('DNI');
$mockEntity->setDocumentNumber('12345678');
$mockEntity->setPhone('999999999');
$mockEntity->setEmail('email@ejemplo.com');
$mockEntity->setGood('Producto');
$mockEntity->setMonedaId(1);
$mockEntity->setMonto('100.00');
$mockEntity->setDescription('Descripción del bien');
$mockEntity->setType('Reclamo');
$mockEntity->setDetail('Detalle del reclamo de prueba');
$mockEntity->setDemand('Pedido del consumidor de prueba');
$mockEntity->setCreatedAt(new \DateTime());
$mockEntity->setUniq('preview-12345678');
$html = $this->renderView('front/pdf/claim_pdf.html.twig', [
'entity' => $mockEntity,
'home' => $home,
]);
$mpdf = new \Mpdf\Mpdf([
'mode' => 'utf-8',
'format' => 'A4',
'margin_top' => 0,
'margin_bottom' => 10,
]);
$mpdf->WriteHTML($html);
$response = new Response();
$response->setContent($mpdf->Output('preview-libro-reclamaciones.pdf', 'S'));
$response->headers->set('Content-Type', 'application/pdf');
$response->headers->set('Content-Disposition', 'inline; filename="preview-libro-reclamaciones.pdf"');
return $response;
}
}