<?php
namespace App\Controller;
use App\Entity\GasMeter;
use App\Entity\ElectricMeter;
use App\Entity\Entreprise;
use App\Entity\Rappel;
use App\Entity\Contrat;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Routing\Annotation\Route;
use Doctrine\Persistence\ManagerRegistry;
use Doctrine\ORM\EntityManagerInterface;
class HomeController extends AbstractController
{
/**
* @Route("/", name="app_home")
*/
public function index(): Response
{
return $this->redirectToRoute('app_site');
}
/**
* @Route("/site", name="app_site")
*/
public function site(ManagerRegistry $doctrine, Request $request): Response
{
// Vérifier si l'utilisateur est connecté et a le rôle ROLE_TEAM
if (!$this->getUser() || !$this->isGranted('ROLE_TEAM')) {
return $this->redirectToRoute('app_login');
}
// Récupérer le nombre de jours depuis la requête, par défaut 7 jours
$nbJours = $request->query->get('nbJours', 7);
// Calculer la date limite
$dateLimite = new \DateTime();
$dateLimite->modify('+' . $nbJours . ' days');
// Récupérer les rappels non complétés à venir dans les X prochains jours
$rappels = $doctrine->getRepository(Rappel::class)
->createQueryBuilder('r')
->where('r.completer = :completer')
->andWhere('r.echeance >= :now')
->andWhere('r.echeance <= :dateLimite')
->setParameter('completer', false)
->setParameter('now', new \DateTime())
->setParameter('dateLimite', $dateLimite)
->orderBy('r.echeance', 'ASC')
->getQuery()
->getResult();
// Récupérer les entreprises liées aux rappels
$entreprises = [];
foreach ($rappels as $rappel) {
if ($rappel->getEntrepriseId()) {
$entreprise = $doctrine->getRepository(Entreprise::class)->find($rappel->getEntrepriseId());
if ($entreprise) {
$entreprises[$rappel->getId()] = $entreprise->getRaisonSociale();
}
}
}
return $this->render('home/index.html.twig', [
'controller_name' => 'HomeController',
'rappels' => $rappels,
'entreprises' => $entreprises,
'nbJours' => $nbJours
]);
}
/**
* @Route("/rappel/complete/{id}", name="app_rappel_complete", methods={"POST"})
*/
public function completeRappel(Rappel $rappel, EntityManagerInterface $entityManager): JsonResponse
{
// Vérifier si l'utilisateur est connecté et a le rôle ROLE_TEAM
if (!$this->getUser() || !$this->isGranted('ROLE_TEAM')) {
return new JsonResponse(['error' => 'Accès non autorisé'], 403);
}
$rappel->setCompleter(true);
$entityManager->flush();
return new JsonResponse(['success' => true]);
}
/**
* @Route("/requetes", name="app_requetes")
*/
public function requetes(ManagerRegistry $doctrine): Response
{
// Vérifier si l'utilisateur est connecté et a le rôle ROLE_TEAM
if (!$this->getUser() || !$this->isGranted('ROLE_TEAM')) {
return $this->redirectToRoute('app_login');
}
$electricMeterRepository = $doctrine->getRepository(ElectricMeter::class);
$gasMeterRepository = $doctrine->getRepository(GasMeter::class);
$entrepriseRepository = $doctrine->getRepository(Entreprise::class);
$contratRepository = $doctrine->getRepository(Contrat::class);
$electric_meters = $electricMeterRepository->findAll();
$gas_meters = $gasMeterRepository->findAll();
$entreprises = $entrepriseRepository->findAll();
// prepare entities to display in datatables
$electric_meters_array = [];
foreach ($electric_meters as $electric_meter) {
$entreprise = $doctrine->getRepository(Entreprise::class)->find($electric_meter->getEntrepriseId());
$latestContract = $contratRepository->createQueryBuilder('c')
->where('c.pdl = :pdl')
->setParameter('pdl', $electric_meter->getPDL())
->orderBy('c.date_debut', 'DESC')
->setMaxResults(1)
->getQuery()
->getOneOrNullResult();
$electric_meters_array[] = [
$entreprise ? $entreprise->getRaisonSociale() : '',
$electric_meter->getAdresseCompteur(),
$electric_meter->getPDL(),
($latestContract && $latestContract->getDateDebut()) ? $latestContract->getDateDebut()->format('d/m/Y') : '',
($latestContract && $latestContract->getDateFin()) ? $latestContract->getDateFin()->format('d/m/Y') : '',
$electric_meter->getProfil(),
$electric_meter->getCAR(),
$latestContract ? $latestContract->getFournisseur() : '',
$electric_meter->getPrix(),
'',
];
}
$gas_meters_array = [];
foreach ($gas_meters as $gas_meter) {
if ($gas_meter->getDateFin() !== null) { // Only include meters with a set end date
$entreprise = $doctrine->getRepository(Entreprise::class)->find($gas_meter->getEntrepriseId());
$latestContract = $contratRepository->createQueryBuilder('c')
->where('c.pdl = :pdl')
->setParameter('pdl', $gas_meter->getPDL())
->orderBy('c.date_debut', 'DESC')
->setMaxResults(1)
->getQuery()
->getOneOrNullResult();
$gas_meters_array[] = [
$entreprise ? $entreprise->getRaisonSociale() : '',
$gas_meter->getAdresseCompteur(),
$gas_meter->getPDL(),
($latestContract && $latestContract->getDateDebut()) ? $latestContract->getDateDebut()->format('d/m/Y') : '',
($latestContract && $latestContract->getDateFin()) ? $latestContract->getDateFin()->format('d/m/Y') : '',
$gas_meter->getProfil(),
$gas_meter->getCAR(),
$latestContract ? $latestContract->getFournisseur() : '',
$gas_meter->getPrix(),
'',
];
}
}
$entreprises_array = [];
foreach ($entreprises as $entreprise) {
$entreprises_array[] = [
$entreprise->getRaisonSociale(),
$entreprise->getAdresse(),
$entreprise->getSiret(),
$entreprise->getNaf(),
$entreprise->getCodeInsee(),
$entreprise->getStatut(),
'',
];
}
return $this->render('requetes.html.twig', [
'electric_meters' => $electric_meters_array,
'gas_meters' => $gas_meters_array,
'entreprises' => $entreprises_array,
]);
}
/**
* @Route("/requetes2", name="app_requetes2")
*/
public function requetes2(ManagerRegistry $doctrine,Request $request): JsonResponse
{
// Vérifier si l'utilisateur est connecté et a le rôle ROLE_TEAM
if (!$this->getUser() || !$this->isGranted('ROLE_TEAM')) {
return new JsonResponse(['error' => 'Accès non autorisé'], 403);
}
$filters = $request->request->all();
// prepare filters for each entities
$electric_meter_filters = [];
$gas_meter_filters = [];
$entreprise_filters = [];
foreach ($filters as $key => $value) {
if (strpos($key, 'Electric')) {
$electric_meter_filters[str_replace(['Electric','Filter'], '', $key)] = $value;
} elseif (strpos($key, 'Gaz')) {
$gas_meter_filters[str_replace(['Gaz','Filter'], '', $key)] = $value;
} elseif (strpos($key, 'Entreprise')) {
$entreprise_filters[str_replace(['Entreprise','Filter'], '', $key)] = $value;
}
}
// Fetch the repository for each entity type
$electricMeterRepository = $doctrine->getRepository(ElectricMeter::class);
$gasMeterRepository = $doctrine->getRepository(GasMeter::class);
$entrepriseRepository = $doctrine->getRepository(Entreprise::class);
$contratRepository = $doctrine->getRepository(Contrat::class);
//convert filters date to datetime
if(isset($electric_meter_filters['date_debut']) && $electric_meter_filters['date_debut'] !== '') {
$electric_meter_filters['date_debut'] = new \DateTime($electric_meter_filters['date_debut']);
}
if(isset($electric_meter_filters['date_fin']) && $electric_meter_filters['date_fin'] !== '') {
$electric_meter_filters['date_fin'] = new \DateTime($electric_meter_filters['date_fin']);
}
if(isset($gas_meter_filters['date_debut']) && $gas_meter_filters['date_debut'] !== '') {
$gas_meter_filters['date_debut'] = new \DateTime($gas_meter_filters['date_debut']);
}
if(isset($gas_meter_filters['date_fin']) && $gas_meter_filters['date_fin'] !== '') {
$gas_meter_filters['date_fin'] = new \DateTime($gas_meter_filters['date_fin']);
}
// First get filtered entreprises IDs
$entreprises = $entrepriseRepository->createQueryBuilder('e');
if(isset($entreprise_filters['RaisonSociale']) && $entreprise_filters['RaisonSociale'] !== '') {
$entreprises->andWhere('e.RaisonSociale LIKE :RaisonSociale')
->setParameter('RaisonSociale', '%'.$entreprise_filters['RaisonSociale'].'%');
}
if(isset($entreprise_filters['Adresse']) && $entreprise_filters['Adresse'] !== '') {
$entreprises->andWhere('e.Adresse LIKE :Adresse')
->setParameter('Adresse', '%'.$entreprise_filters['Adresse'].'%');
}
if(isset($entreprise_filters['Siret']) && $entreprise_filters['Siret'] !== '') {
$entreprises->andWhere('e.Siret LIKE :Siret')
->setParameter('Siret', '%'.$entreprise_filters['Siret'].'%');
}
// Gestion du filtrage par plage de codes NAF
if(isset($entreprise_filters['NafStart']) && $entreprise_filters['NafStart'] !== '' &&
isset($entreprise_filters['NafEnd']) && $entreprise_filters['NafEnd'] !== '') {
// Fonction pour extraire la partie numérique du code NAF
$extractNafNumber = function($naf) {
return (int) preg_replace('/[^0-9]/', '', substr($naf, 0, -1));
};
$nafStart = $extractNafNumber($entreprise_filters['NafStart']);
$nafEnd = $extractNafNumber($entreprise_filters['NafEnd']);
// Assurons-nous que nafStart est inférieur à nafEnd
if ($nafStart > $nafEnd) {
$temp = $nafStart;
$nafStart = $nafEnd;
$nafEnd = $temp;
}
$entreprises->andWhere(
$entreprises->expr()->andX(
// La partie numérique du NAF doit être >= à nafStart
'CAST(REGEXP_REPLACE(SUBSTRING(e.Naf, 1, LENGTH(e.Naf)-1), \'[^0-9]\', \'\') AS INTEGER) >= :nafStart',
// La partie numérique du NAF doit être <= à nafEnd
'CAST(REGEXP_REPLACE(SUBSTRING(e.Naf, 1, LENGTH(e.Naf)-1), \'[^0-9]\', \'\') AS INTEGER) <= :nafEnd'
)
)
->setParameter('nafStart', $nafStart)
->setParameter('nafEnd', $nafEnd);
}
if(isset($entreprise_filters['Code_Insee']) && $entreprise_filters['Code_Insee'] !== '') {
$entreprises->andWhere('e.Code_Insee LIKE :Code_Insee')
->setParameter('Code_Insee', '%'.$entreprise_filters['Code_Insee'].'%');
}
if(isset($entreprise_filters['Statut']) && $entreprise_filters['Statut'] !== '') {
$entreprises->andWhere('e.Statut LIKE :Statut')
->setParameter('Statut', '%'.$entreprise_filters['Statut'].'%');
}
// Get filtered electric meter entreprise IDs
$electricMeterEntrepriseIds = $electricMeterRepository->createQueryBuilder('e')
->select('DISTINCT e.entreprise_id')
->leftJoin(Contrat::class, 'c', 'WITH', 'e.PDL = c.pdl')
->orderBy('c.date_debut', 'DESC');
if(isset($electric_meter_filters['adresse_compteur']) && $electric_meter_filters['adresse_compteur'] !== '') {
$electricMeterEntrepriseIds->andWhere('e.adresse_compteur LIKE :adresse_compteur')
->setParameter('adresse_compteur', '%'.$electric_meter_filters['adresse_compteur'].'%');
}
if(isset($electric_meter_filters['PDL']) && $electric_meter_filters['PDL'] !== '') {
$electricMeterEntrepriseIds->andWhere('e.PDL LIKE :PDL')
->setParameter('PDL', '%'.$electric_meter_filters['PDL'].'%');
}
if(isset($electric_meter_filters['Profil']) && $electric_meter_filters['Profil'] !== '') {
$electricMeterEntrepriseIds->andWhere('e.Profil = :profil_electric')
->setParameter('profil_electric', $electric_meter_filters['Profil']);
}
$dateTypeElectric = isset($filters['dateTypeElectricFilter']) ? $filters['dateTypeElectricFilter'] : 'start';
if(isset($electric_meter_filters['date_fin']) && $electric_meter_filters['date_fin'] !== '') {
if ($dateTypeElectric === 'end') {
$electricMeterEntrepriseIds->andWhere('c.date_fin <= :date_fin')
->setParameter('date_fin', $electric_meter_filters['date_fin']);
} else {
$electricMeterEntrepriseIds->andWhere('c.date_debut <= :date_fin')
->setParameter('date_fin', $electric_meter_filters['date_fin']);
}
}
if(isset($electric_meter_filters['date_debut']) && $electric_meter_filters['date_debut'] !== '') {
if ($dateTypeElectric === 'end') {
$electricMeterEntrepriseIds->andWhere('c.date_fin >= :date_debut')
->setParameter('date_debut', $electric_meter_filters['date_debut']);
} else {
$electricMeterEntrepriseIds->andWhere('c.date_debut >= :date_debut')
->setParameter('date_debut', $electric_meter_filters['date_debut']);
}
}
// Get filtered gas meter entreprise IDs
$gasMeterEntrepriseIds = $gasMeterRepository->createQueryBuilder('g')
->select('DISTINCT g.entreprise_id')
->leftJoin(Contrat::class, 'c', 'WITH', 'g.PDL = c.pdl')
->orderBy('c.date_debut', 'DESC');
if(isset($gas_meter_filters['adresse_compteur']) && $gas_meter_filters['adresse_compteur'] !== '') {
$gasMeterEntrepriseIds->andWhere('g.adresse_compteur LIKE :adresse_compteur')
->setParameter('adresse_compteur', '%'.$gas_meter_filters['adresse_compteur'].'%');
}
if(isset($gas_meter_filters['PDL']) && $gas_meter_filters['PDL'] !== '') {
$gasMeterEntrepriseIds->andWhere('g.PDL LIKE :PDL')
->setParameter('PDL', '%'.$gas_meter_filters['PDL'].'%');
}
if(isset($gas_meter_filters['Profil']) && $gas_meter_filters['Profil'] !== '') {
$gasMeterEntrepriseIds->andWhere('g.Profil = :profil_gas')
->setParameter('profil_gas', $gas_meter_filters['Profil']);
}
$dateTypeGaz = isset($filters['dateTypeGazFilter']) ? $filters['dateTypeGazFilter'] : 'start';
if(isset($gas_meter_filters['date_fin']) && $gas_meter_filters['date_fin'] !== '') {
if ($dateTypeGaz === 'end') {
$gasMeterEntrepriseIds->andWhere('c.date_fin <= :date_fin')
->setParameter('date_fin', $gas_meter_filters['date_fin']);
} else {
$gasMeterEntrepriseIds->andWhere('c.date_debut <= :date_fin')
->setParameter('date_fin', $gas_meter_filters['date_fin']);
}
}
if(isset($gas_meter_filters['date_debut']) && $gas_meter_filters['date_debut'] !== '') {
if ($dateTypeGaz === 'end') {
$gasMeterEntrepriseIds->andWhere('c.date_fin >= :date_debut')
->setParameter('date_debut', $gas_meter_filters['date_debut']);
} else {
$gasMeterEntrepriseIds->andWhere('c.date_debut >= :date_debut')
->setParameter('date_debut', $gas_meter_filters['date_debut']);
}
}
// Get the entreprise IDs from both meter queries
$electricMeterIds = array_map(function($row) {
return $row['entreprise_id'];
}, $electricMeterEntrepriseIds->getQuery()->getResult());
$gasMeterIds = array_map(function($row) {
return $row['entreprise_id'];
}, $gasMeterEntrepriseIds->getQuery()->getResult());
// If any meter filters are applied, filter entreprises by those IDs
if (!empty($electric_meter_filters) || !empty($gas_meter_filters)) {
$filteredIds = array_unique(array_merge($electricMeterIds, $gasMeterIds));
if (empty($filteredIds)) {
// If no meters match the filters, return no enterprises
$entreprises->andWhere('e.id = 0'); // This will ensure no results
} else {
$entreprises->andWhere('e.id IN (:meter_entreprise_ids)')
->setParameter('meter_entreprise_ids', $filteredIds);
}
}
$entreprises = $entreprises->getQuery()->getResult();
$entrepriseIds = array_map(function($entreprise) {
return $entreprise->getId();
}, $entreprises);
// If no enterprises match the filters, don't return any meters
if (empty($entrepriseIds)) {
return new JsonResponse([
'electric_meters' => [],
'gas_meters' => [],
'entreprises' => [],
'filters' => $filters,
'electric_meter_filters' => $electric_meter_filters,
'gas_meter_filters' => $gas_meter_filters,
'entreprise_filters' => $entreprise_filters,
]);
}
// Build the query for electric meters with contracts and filtered entreprises
$electric_meters = $electricMeterRepository->createQueryBuilder('e')
->leftJoin(Contrat::class, 'c', 'WITH', 'e.PDL = c.pdl')
->orderBy('c.date_debut', 'DESC')
->select('e')
->distinct()
->andWhere('e.entreprise_id IN (:entreprise_ids)')
->setParameter('entreprise_ids', $entrepriseIds);
if(isset($electric_meter_filters['adresse_compteur']) && $electric_meter_filters['adresse_compteur'] !== '') {
$electric_meters->andWhere('e.adresse_compteur LIKE :adresse_compteur')
->setParameter('adresse_compteur', '%'.$electric_meter_filters['adresse_compteur'].'%');
}
if(isset($electric_meter_filters['PDL']) && $electric_meter_filters['PDL'] !== '') {
$electric_meters->andWhere('e.PDL LIKE :PDL')
->setParameter('PDL', '%'.$electric_meter_filters['PDL'].'%');
}
if(isset($electric_meter_filters['Profil']) && $electric_meter_filters['Profil'] !== '') {
$electric_meters->andWhere('e.Profil = :profil_electric')
->setParameter('profil_electric', $electric_meter_filters['Profil']);
}
// Check if there are no contracts after date_fin
if(isset($electric_meter_filters['date_fin']) && $electric_meter_filters['date_fin'] !== '') {
if ($dateTypeElectric === 'end') {
$electric_meters->andWhere('c.date_fin <= :date_fin')
->setParameter('date_fin', $electric_meter_filters['date_fin']);
} else {
$electric_meters->andWhere('c.date_debut <= :date_fin')
->setParameter('date_fin', $electric_meter_filters['date_fin']);
}
}
if(isset($electric_meter_filters['date_debut']) && $electric_meter_filters['date_debut'] !== '') {
if ($dateTypeElectric === 'end') {
$electric_meters->andWhere('c.date_fin >= :date_debut')
->setParameter('date_debut', $electric_meter_filters['date_debut']);
} else {
$electric_meters->andWhere('c.date_debut >= :date_debut')
->setParameter('date_debut', $electric_meter_filters['date_debut']);
}
}
$electric_meters = $electric_meters->getQuery()->getResult();
// Build the query for gas meters with contracts and filtered entreprises
$gas_meters = $gasMeterRepository->createQueryBuilder('g')
->leftJoin(Contrat::class, 'c', 'WITH', 'g.PDL = c.pdl')
->orderBy('c.date_debut', 'DESC')
->select('g')
->distinct()
->andWhere('g.entreprise_id IN (:entreprise_ids)')
->setParameter('entreprise_ids', $entrepriseIds);
if(isset($gas_meter_filters['adresse_compteur']) && $gas_meter_filters['adresse_compteur'] !== '') {
$gas_meters->andWhere('g.adresse_compteur LIKE :adresse_compteur')
->setParameter('adresse_compteur', '%'.$gas_meter_filters['adresse_compteur'].'%');
}
if(isset($gas_meter_filters['PDL']) && $gas_meter_filters['PDL'] !== '') {
$gas_meters->andWhere('g.PDL LIKE :PDL')
->setParameter('PDL', '%'.$gas_meter_filters['PDL'].'%');
}
if(isset($gas_meter_filters['Profil']) && $gas_meter_filters['Profil'] !== '') {
$gas_meters->andWhere('g.Profil = :profil_gas')
->setParameter('profil_gas', $gas_meter_filters['Profil']);
}
// Check if there are no contracts after date_fin
if(isset($gas_meter_filters['date_fin']) && $gas_meter_filters['date_fin'] !== '') {
if ($dateTypeGaz === 'end') {
$gas_meters->andWhere('c.date_fin <= :date_fin')
->setParameter('date_fin', $gas_meter_filters['date_fin']);
} else {
$gas_meters->andWhere('c.date_debut <= :date_fin')
->setParameter('date_fin', $gas_meter_filters['date_fin']);
}
}
if(isset($gas_meter_filters['date_debut']) && $gas_meter_filters['date_debut'] !== '') {
if ($dateTypeGaz === 'end') {
$gas_meters->andWhere('c.date_fin >= :date_debut')
->setParameter('date_debut', $gas_meter_filters['date_debut']);
} else {
$gas_meters->andWhere('c.date_debut >= :date_debut')
->setParameter('date_debut', $gas_meter_filters['date_debut']);
}
}
$gas_meters = $gas_meters->getQuery()->getResult();
// Prepare arrays for response
$electric_meters_array = [];
foreach ($electric_meters as $electric_meter) {
$entreprise = $doctrine->getRepository(Entreprise::class)->find($electric_meter->getEntrepriseId());
// Get the latest contract for this PDL
$latestContract = $contratRepository->createQueryBuilder('c')
->where('c.pdl = :pdl')
->setParameter('pdl', $electric_meter->getPDL())
->orderBy('c.date_debut', 'DESC')
->setMaxResults(1)
->getQuery()
->getOneOrNullResult();
$electric_meters_array[] = [
$entreprise ? $entreprise->getRaisonSociale() : '',
$electric_meter->getAdresseCompteur(),
$electric_meter->getPDL(),
($latestContract && $latestContract->getDateDebut()) ? $latestContract->getDateDebut()->format('d/m/Y') : '',
($latestContract && $latestContract->getDateFin()) ? $latestContract->getDateFin()->format('d/m/Y') : '',
$electric_meter->getProfil(),
$latestContract ? $latestContract->getCAR() : $electric_meter->getCAR(),
$latestContract ? $latestContract->getFournisseur() : $electric_meter->getFournisseur(),
$electric_meter->getPrix(),
'',
];
}
$gas_meters_array = [];
foreach ($gas_meters as $gas_meter) {
$entreprise = $doctrine->getRepository(Entreprise::class)->find($gas_meter->getEntrepriseId());
// Get the latest contract for this PDL
$latestContract = $contratRepository->createQueryBuilder('c')
->where('c.pdl = :pdl')
->setParameter('pdl', $gas_meter->getPDL())
->orderBy('c.date_debut', 'DESC')
->setMaxResults(1)
->getQuery()
->getOneOrNullResult();
$gas_meters_array[] = [
$entreprise ? $entreprise->getRaisonSociale() : '',
$gas_meter->getAdresseCompteur(),
$gas_meter->getPDL(),
($latestContract && $latestContract->getDateDebut()) ? $latestContract->getDateDebut()->format('d/m/Y') : '',
($latestContract && $latestContract->getDateFin()) ? $latestContract->getDateFin()->format('d/m/Y') : '',
$gas_meter->getProfil(),
$latestContract ? $latestContract->getCAR() : $gas_meter->getCAR(),
$latestContract ? $latestContract->getFournisseur() : $gas_meter->getFournisseur(),
$gas_meter->getPrix(),
'',
];
}
$entreprises_array = [];
foreach ($entreprises as $entreprise) {
$entreprises_array[] = [
$entreprise->getRaisonSociale(),
$entreprise->getAdresse(),
$entreprise->getSiret(),
$entreprise->getNaf(),
$entreprise->getCodeInsee(),
$entreprise->getStatut(),
'',
];
}
return new JsonResponse([
'electric_meters' => $electric_meters_array,
'gas_meters' => $gas_meters_array,
'entreprises' => $entreprises_array,
'filters' => $filters,
'electric_meter_filters' => $electric_meter_filters,
'gas_meter_filters' => $gas_meter_filters,
'entreprise_filters' => $entreprise_filters,
]);
}
}