<?php
namespace App\Controller;
use App\Entity\InfosSuivi;
use App\Entity\Proposition;
use App\Repository\PropositionRepository;
use DateTime;
use App\Entity\Lot;
use App\Entity\Prospect;
use App\Service\Geocoder;
use App\Service\ImagePdf;
use App\Entity\Historique;
use App\Entity\Impression;
use App\Entity\PieceJointe;
use App\Entity\Utilisateur;
use App\Service\Notification;
use Doctrine\ORM\EntityManager;
use App\Repository\LotRepository;
use App\Repository\VilleRepository;
use App\Repository\ProspectRepository;
use App\Repository\HistoriqueRepository;
use Doctrine\ORM\EntityManagerInterface;
use App\Repository\UtilisateurRepository;
use App\Repository\ProgrammeRepository;
use App\Repository\DepartementRepository;
use phpDocumentor\Reflection\Types\This;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Doctrine\ORM\Query\AST\NewObjectExpression;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
/**
* @Route("/ajax")
*/
class AjaxController extends AbstractController
{
protected $notificationService;
public function __construct(Notification $notificationService)
{
$this->notificationService = $notificationService;
}
/**
* @Route("/ville", name="ajax_ville")
*/
public function ville(Request $request, VilleRepository $villeRepository): Response
{
$searchTerm = $request->query->get('search', null);
$villes = $villeRepository->findByNomReel($searchTerm);
$data = [];
foreach($villes as $ville) {
$data[] = [
'value' => $ville->getNomReel(),
'text' => $ville->getNomReel() . ' (' . $ville->getCodePostal() . ')',
'code_postal' => $ville->getCodePostal()
];
}
return $this->json($data);
}
/**
* @Route("/departement", name="ajax_departement")
*/
public function departement(Request $request, DepartementRepository $departementRepository): Response
{
$departements = $departementRepository->findByNomOrCode($request->query->get('search', null));
$data = [];
foreach($departements as $departement) {
$data[] = [
'id' => $departement->getId(),
'text' => $departement->getNom() . ' (' . $departement->getCode() . ')'
];
}
return $this->json($data);
}
/**
* @Route("/code-postal", name="ajax_code_postal")
*/
public function codePostal(Request $request, VilleRepository $villeRepository): Response
{
$searchTerm = $request->query->get('search', null);
$villes = $villeRepository->findByCodePostal($searchTerm);
$data = [];
foreach ($villes as $ville) {
$data[] = [
'id' => $ville->getCodePostal(),
'text' => $ville->getNomReel() . ' (' . $ville->getCodePostal() . ')'
];
}
return $this->json($data);
}
/**
* @Route("/lot", name="ajax_lot")
*/
public function lot(Request $request, LotRepository $lotRepository): Response
{
$user = $this->getUser();
$entreprise = $user->getEntreprise();
$lots = $lotRepository->findByProgrammeRefTitreAndEntreprise($request->query->get('search', null), $entreprise, $user);
$data = [];
foreach($lots as $lot) {
$data[] = [
'id' => $lot->getId(),
'text' => (string)$lot,
'reference' => $lot->getReference(),
'programme' => $lot->getProgramme(),
'type' => $lot->getType(),
'ville' => $lot->getVille(),
'codePostal' => $lot->getCodePostal()
];
}
return $this->json([
'results' => $data
]);
}
/**
* @Route("/prospect", name="ajax_prospect")
*/
public function prospect(Request $request, ProspectRepository $prospectRepository): Response
{
$prospects = $prospectRepository->findByPrenomNom($request->query->get('search', null));
//dd($prospects);
$data = [];
foreach($prospects as $prospect) {
$data[] = [
'id' => $prospect->getId(),
'text' => $prospect->getEmprunteurPrenom()." ".$prospect->getEmprunteurNom(),
'nom' => $prospect->getEmprunteurNom(),
'prenom' => $prospect->getEmprunteurPrenom()
];
}
return $this->json([
'results' => $data
]);
}
/**
* @Route("/programme", name="ajax_programme")
*/
public function programme(Request $request, ProgrammeRepository $programmeRepository): Response
{
$user = $this->getUser();
$entreprise = $user->getEntreprise();
$programmes = $programmeRepository->findByNomOrPromoteurOrVilleAndEntreprise($request->query->get('search', null), $entreprise, $user);
foreach($programmes as $p) {
$data[] = [
'id' => $p->getId(),
'text' => (string)$p . (trim((string)$p->getPromoteur()) != '' ? ' (' . $p->getPromoteur() . ')' : ''),
'ville' =>(string)$p->getVille(),
'programme' => (string)$p,
'promoteur' => $p->getPromoteur(),
];
}
return $this->json([
'results' => $data
]);
}
/**
* @Route("/prospect/add/lot/{lotId}", name="ajax_prospect_add_lot", methods={"POST"})
*/
public function addLotToProspect(Lot $lotId ,Request $request, ProspectRepository $prospectRepository, PropositionRepository $propositionRepository, EntityManagerInterface $em): Response
{
$prospect = $prospectRepository->findBy(['id' => $request->request->get('prospectId')]);
if(!empty($propositionRepository->findByLotAndProspect($lotId, $prospect))){
return $this->json([
'warning' => 'Ce lot est déja proposé à ce client'
]);
}
$newProposition = new Proposition();
$newProposition->setLot($lotId);
$prospect[0]->addProposition($newProposition);
$em->persist($newProposition);
$em->flush();
return $this->json([
'success' => 'Proposition ajoutée'
]);
}
/**
* @Route("/geocode/adresse", name="ajax_geocode_adresse")
*/
public function geocodeAdresse(Request $request, Geocoder $geocoder): Response
{
$search = $request->query->get('query');
$coords = $geocoder->encode($search);
if($coords) {
return $this->json([
'latitude' => $coords['lat'],
'longitude' => $coords['lng']
]);
} else {
return $this->json(false);
}
}
/**
* @Route("/send/impression/{lot}", name="ajax_send_impression")
*/
public function sendImpression(Lot $lot, Request $request, UtilisateurRepository $utilisateurRepository, ProspectRepository $prospectRep, EntityManagerInterface $em, Notification $serviceNotification, HistoriqueRepository $historiqueRepository): Response
{
if ($request->isXmlHttpRequest()) {
$token = $request->getSession()->get('token');
$data = $request->request->get('form');
$commentaire = $data['commentaire'];
if(trim($commentaire) == '')
return $this->json([
'status' => 'fail',
'message' => 'Veuillez renseigner le champ de commentaire.'
]);
$prospect = $prospectRep->findOneBy(['token' => $token]);
$historique = $historiqueRepository->findOneBy(['prospect' => $prospect->getId()], ['dateheure' => 'DESC']);
if($historique == null)
{
$historique = new Historique();
$historique->setProspect($prospect);
$historique->setModeEnvoi('automatique');
$historique->setDateheure(new DateTime());
foreach ($prospect->getPropositions() as $p) {
$historique->addLot($p->getLot());
}
$em->persist($historique);
}
$impression = new Impression();
$impression->setHistorique($historique);
$impression->setProspect($prospect);
$impression->setCommentaire($commentaire);
$impression->setDateheure(new \DateTime());
$em->persist($impression);
$em->flush();
$res = $serviceNotification->alertInterne($prospect, $impression, $lot, $utilisateurRepository);
if(!$res)
return $this->json([
'status' => 'fail',
'message' => 'Une erreur s\'est produite lors de l\'envoi de votre message.'
]);
return $this->json([
'status' => 'success',
'message' => 'Votre commentaire a bien été envoyé.'
]);
}
return $this->json([
'status' => 'fail',
'message' => 'Une erreur s\'est produite lors de l\'envoi de votre message.'
]);
}
/**
* @Route("/new/historique/{prospect}", name="ajax_new_historique")
*/
public function newHistorique(Prospect $prospect = null, Request $request, EntityManagerInterface $em):Response
{
$modeEnvoi = $request->query->get('modeEnvoi');
$contenu = $request->query->get('msg');
$contenu = str_replace('%0a', PHP_EOL, $contenu);
$expediteur = $this->container->get('security.token_storage')->getToken()->getUser();
$historique = new Historique();
$historique->setProspect($prospect);
$historique->setModeEnvoi($modeEnvoi);
$historique->setDateheure(new DateTime());
$historique->setContenu($contenu);
$historique->setEntreprise($prospect->getEntreprise());
if($expediteur instanceof Utilisateur) {
$historique->setExpediteur($expediteur);
}
foreach ($prospect->getPropositions() as $p) {
$historique->addLot($p->getLot());
}
$em->persist($historique);
$em->flush();
return $this->json([
'message' => 'Nouvelle proposition dans l\'historique.'
]);
}
/**
* @Route("/pj/rotate", name="ajax_piece_jointe_rotate")
*/
public function pieceJointeRotate(Request $request): Response
{
$fileName = $request->query->get('query');
$degrees = 90;
$strArray = explode('.', $fileName);
$ext = trim(strtolower(end($strArray)));
if($ext == 'png')
{
ImagePdf::rotateImage90Deg($fileName);
return $this->json($fileName);
}
if ($ext == 'jpg' || $ext == 'jpeg')
{
$path = explode('/', $fileName);
$fileName = end($path);
ImagePdf::rotateImage90Deg(PieceJointe::SAVE_PATH . $fileName);
return $this->json(PieceJointe::SAVE_PATH . $fileName);
}
return $this->json(false);
}
/**
* @Route("/envoi-mail-fiche", name="ajax_envoi_mail_fiche")
*/
public function envoiMailFiche(Request $request, UtilisateurRepository $utilisateurRepository, ProspectRepository $prospectRepository, EntityManagerInterface $em): JsonResponse
{
$auteurId = $request->get('auteurId');
$prospectId = $request->get('prospectId');
$userConnected = $this->getUser();
if ($auteurId || $prospectId) {
$this->notificationService->alertAuteurProspect($prospectId, $auteurId, $userConnected);
$infoSuivi = new InfosSuivi();
$infoSuivi->setUtilisateur($utilisateurRepository->find($auteurId));
$infoSuivi->addProspect($prospectRepository->find($prospectId));
$infoSuivi->setType('client');
$infoSuivi->setDescription('Un nouveau client vous a été attribué : [prospect]');
$infoSuivi->setDate(new DateTime());
$infoSuivi->setLu(false);
$em->persist($infoSuivi);
$em->flush();
return $this->json([
'status' => 'success',
'message' => 'Email envoyé avec succès'
]);
}
return $this->json([
'status' => 'error',
'message' => 'Auteur non trouvé ou erreur d\'envoi'
]);
}
/**
* @Route("/info-suivi/{id}/lu", name="ajax_info_suivi_lu", methods={"POST"})
*/
public function setInfoSuiviLu(Request $request, InfosSuivi $infoSuivi): Response
{
$infoSuivi->setLu(true);
$entityManager = $this->getDoctrine()->getManager();
$entityManager->flush();
return new Response();
}
/**
* @Route("/prospect/check-duplicate", name="ajax_prospect_check_duplicate")
*/
public function checkProspectDuplicate(Request $request, ProspectRepository $prospectRepository): JsonResponse
{
$nom = trim($request->query->get('nom', ''));
$prenom = trim($request->query->get('prenom', ''));
$currentProspectId = $request->query->get('currentId', null);
if (empty($nom) || empty($prenom)) {
return $this->json([
'exists' => false,
'message' => 'Nom et prénom requis'
]);
}
if (strlen($nom) < 2 || strlen($prenom) < 2) {
return $this->json([
'exists' => false,
'message' => 'Nom et prénom trop courts'
]);
}
$user = $this->getUser();
if (!$user instanceof Utilisateur || !$user->getEntreprise()) {
return $this->json([
'exists' => false,
'error' => 'Utilisateur non authentifié ou entreprise non définie'
]);
}
try {
$currentNom = null;
$currentPrenom = null;
if ($currentProspectId) {
$currentProspect = $prospectRepository->find($currentProspectId);
if ($currentProspect) {
$currentNom = trim($currentProspect->getEmprunteurNom());
$currentPrenom = trim($currentProspect->getEmprunteurPrenom());
}
}
$existingProspect = $prospectRepository->findExistingProspectByNomPrenom(
$nom,
$prenom,
$user->getEntreprise(),
$currentProspectId,
$currentNom,
$currentPrenom
);
if ($existingProspect) {
return $this->json([
'exists' => true,
'blocked' => true,
'message' => 'Un prospect avec ce nom et prénom existe déjà',
'prospect' => [
'id' => $existingProspect->getId(),
'nom' => $existingProspect->getEmprunteurNom(),
'prenom' => $existingProspect->getEmprunteurPrenom(),
'email' => $existingProspect->getEmprunteurEmail(),
'dateCreation' => $existingProspect->getDateheure() ? $existingProspect->getDateheure()->format('d/m/Y H:i') : null,
'auteur' => $existingProspect->getAuteur() ? $existingProspect->getAuteur()->getNomEtPrenom() : null
]
]);
}
return $this->json([
'exists' => false,
'message' => 'Aucun doublon détecté'
]);
} catch (\Exception $e) {
return $this->json([
'exists' => false,
'error' => 'Erreur lors de la vérification des doublons',
], 500);
}
}
}