<?php
namespace App\Controller;
use App\Entity\ComDestinoNotificacionBienvenida;
use App\Entity\ComGestionContactoComercial;
use App\Entity\ComInformacionContacto;
use App\Entity\ComOfertaComercial;
use App\Entity\ComResultadoNegociacion;
use App\Entity\TerEmpresaCliente;
use App\Entity\TerPersona;
use App\Form\ComDestinoNotificacionBienvenidaType;
use App\Repository\ComDestinoNotificacionBienvenidaRepository;
use App\Repository\ComGestionContactoComercialRepository;
use App\Services\DocumentHandler;
use App\Services\MailerCore;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\EntityRepository;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Routing\Annotation\Route;
#[Route('/com/destino/notificacion/bienvenida')]
class ComDestinoNotificacionBienvenidaController extends AbstractController
{
private $repository;
private $code = 0;
private $msj = "";
private $url = "";
private $html = "";
private $mailerCore;
/**
* @var MailerInterface
*/
private $mailer;
private $documentHandler;
public function __construct(EntityManagerInterface $entityManager, ComDestinoNotificacionBienvenidaRepository $comDestinoNotificacionBienvenidaRepository, MailerCore $mailerCore, MailerInterface $mailer,
DocumentHandler $documentHandler) {
$this->entityManager = $entityManager;
$this->repository = $comDestinoNotificacionBienvenidaRepository;
$this->mailerCore = $mailerCore;
$this->documentHandler = $documentHandler;
$this->mailer = $mailer;
}
#[Route('/', name: 'app_com_destino_notificacion_bienvenida_index', methods: ['GET'])]
public function index(Request $request): Response
{
$idProspecto = $request->get('id'); // ID prospecto
$notificacionesBienvenida = $this->repository->getAll($idProspecto);
return $this->render('com_destino_notificacion_bienvenida/index.html.twig', [
'entity' => $notificacionesBienvenida,
'id' => $idProspecto
]);
}
#[Route('/new', name: 'app_com_destino_notificacion_bienvenida_new', methods: ['GET', 'POST'])]
public function new(Request $request, EntityManagerInterface $entityManager): Response
{
$idProspecto = $request->get('id'); // ID prospecto
$terEmpresaCliente = $entityManager->getRepository(TerEmpresaCliente::class)->find($idProspecto);
// Formulario
$comDestinoBienvenida = new ComDestinoNotificacionBienvenida();
$form = $this->createForm(ComDestinoNotificacionBienvenidaType::class, $comDestinoBienvenida,[
'method' => 'POST',
'action'=> $this->generateUrl('app_com_destino_notificacion_bienvenida_new',[
'id'=>$idProspecto,
]),
'idCliente'=>$idProspecto
]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// Persistir los datos
$comDestinoBienvenida->setTerEmpresaCliente($terEmpresaCliente);
$entityManager->persist($comDestinoBienvenida);
$entityManager->flush();
$this->code = 'success';
$this->msj = "Se ha registrado la notificacion de bienvenida";
return new JsonResponse(['code' => $this->code, 'msj' => $this->msj,'url' => $this->url,'html' => $this->html]);
}
return $this->renderForm('com_destino_notificacion_bienvenida/new.html.twig', [
'prospecto' => $terEmpresaCliente,
'consecutivos'=>$this->consecutivosAprobados($idProspecto,$entityManager),
'form' => $form,
]);
}
// Funcion para editar la notificacion
#[Route('/edit', name: 'app_com_destino_notificacion_bienvenida_edit', methods: ['GET', 'POST'])]
public function edit(Request $request, EntityManagerInterface $entityManager): Response{
$idNotificacion = $request->get('id'); // ID notificacion
$notificaciones = $entityManager->getRepository(ComDestinoNotificacionBienvenida::class)->find($idNotificacion);
$form = $this->createForm(ComDestinoNotificacionBienvenidaType::class, $notificaciones,[
'method' => 'POST',
'action' => $this->generateUrl('app_com_destino_notificacion_bienvenida_edit',[
'id'=>$idNotificacion,
]),
'idCliente'=>$notificaciones->getTerEmpresaCliente()->getId()
]);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// Guardar datos de actualizacion
$entityManager->persist($notificaciones);
$entityManager->flush();
$this->code = 'success';
$this->msj = "Se ha actualizado el registro exitosamente";
return new JsonResponse(['code' => $this->code, 'msj' => $this->msj,
'url' => $this->url,'html' => $this->html]);
}
return $this->renderForm('com_destino_notificacion_bienvenida/edit.html.twig', [
'prospecto' => $notificaciones->getTerEmpresaCliente(),
'consecutivos'=>$this->consecutivosAprobados($notificaciones->getTerEmpresaCliente()->getId(),$entityManager),
'form' => $form,
]);
}
// Funcion de ver
#[Route('/show', name: 'app_com_destino_notificacion_bienvenida_show', methods: ['GET'])]
public function show(Request $request, EntityManagerInterface $entityManager): Response
{
$idNotificacion = $request->get('id');
$notificaciones = $entityManager->getRepository(ComDestinoNotificacionBienvenida::class)->find($idNotificacion);
$ofertasAprobadas = $this->consecutivosAprobados($notificaciones->getTerEmpresaCliente()->getId(), $entityManager);
return $this->renderForm('com_destino_notificacion_bienvenida/show.html.twig', [
'notificaciones' => $notificaciones,
'consecutivos' => $ofertasAprobadas,
]);
}
// Funcion para consecutivos APROBADOS
public function consecutivosAprobados($idProspecto = null, EntityManagerInterface $entityManager){
$query = $entityManager->getRepository(ComResultadoNegociacion::class)->createQueryBuilder('cc')
->leftJoin('cc.comOfertaComercial','ofc')
->leftJoin('ofc.comProspectoCliente','cpc')
->leftJoin('cc.resultadoNegociacion','rne')
->where('cpc.id = :idProspecto')
->andWhere('rne.id = :estado')
// ID prospecto
->setParameter('idProspecto', $idProspecto)
->setParameter('estado', 5) // Estado APROBADO
->orderBy('cc.id', 'DESC');
return $query->getQuery()->getResult();
}
// Consultar los datos por CONSECUTIVO
#[Route('/consultar_consecutivo', name: 'app_com_destino_notificacion_bienvenida_consultar_consecutivo', methods: ['GET', 'POST'])]
public function consultarConsecutivo(Request $request, EntityManagerInterface $entityManager): Response{
$idResultado = $request->get('id');
$comResultado = $entityManager->getRepository(ComResultadoNegociacion::class)->find($idResultado);
$comComercialConsecutivo = $comResultado->getComOfertaComercial();
if(!$comComercialConsecutivo){
return new JsonResponse([
'code'=>'error',
]);
}
return new JsonResponse([
'code'=>'success',
'data'=>[
'resultadoNegocio'=>$comResultado->getResultadoNegociacion()?->getNombre() ?? 'N/A',
'fechaResultado'=>$comResultado->getFechaResultado()->format('Y-m-d'),
'vigenciaOferta'=>$comComercialConsecutivo->getVigenciaOferta()->format('Y-m-d'),
'ofPdf'=>$comComercialConsecutivo->getCargarOfertaPdf(),
'ofExcel'=>$comComercialConsecutivo->getOfertaExcel(),
'empresa'=>$comComercialConsecutivo->getTerEmpresa()->getNombre(),
'tipoEmpresa'=>$comComercialConsecutivo->getTerEmpresa()->getAbreviatura()
]
]);
}
// Funcion para enviar notificación a los seleccionados por contactos
#[Route('/envio_notificacion', name: 'app_com_destino_notificacion_bienvenida_envio_notificacion', methods: ['GET', 'POST'])]
public function envioContactos(Request $request, EntityManagerInterface $entityManager): Response{
$idProspecto = $request->get('idProspecto');
$contactosIds = $request->get('contactos'); // Recibir los contactos
$correosContactos = [];
$repository = $entityManager->getRepository(ComInformacionContacto::class)->findBy([
'id'=>$contactosIds
]);
// Validar que no encontro resultados
if(!$repository){
return new JsonResponse([
'code'=>'error',
]);
}
// Llenar la lista de correos seleccionados
foreach ($repository as $correo){
$correosContactos[] = $correo->getCorreo();
}
// Agregar correo de ejecutiva comercial
$prospecto = $entityManager->getRepository(TerEmpresaCliente::class)->find($idProspecto);
$correoEjecutiva = $entityManager->getRepository(TerPersona::class)->findBy([
'nombres'=>$prospecto->getEjecutivaComercialComisora()
]);
// Preguntar por las ofertas comerciales que estan APROBADAS
$ofertasAprobadas = $this->consecutivosAprobados($prospecto->getId(),$entityManager);
$correoComisiona = [
'correoEjecutiva' => $correoEjecutiva[0]->getEmail() ?? 'N/A',
'telefono' => $prospecto->getTelefono() ?? 'N/A',
'nombre' => $prospecto->getEjecutivaComercialComisora() ?? 'N/A',
'ofertasAprobadas' => $ofertasAprobadas,
];
$correosContactos[] = $correoComisiona['correoEjecutiva'];
// Enviar correo I14 H1
$mensajes = $this->mailerCore->notificacionBievenidaCliente('bienvenidaCliente',[$prospecto],$correosContactos,$correoComisiona);
return new JsonResponse([
'code'=>'success',
'data'=>[
'contactos'=>$correosContactos,
'email'=>$correosContactos,
'mensajes'=>$mensajes,
]
]);
}
}