<?php
namespace App\Controller;
use App\Enum\BasicEnum;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Security;
use App\Entity\Media;
use App\Entity\Detections;
use Doctrine\Persistence\ManagerRegistry;
use App\Service\ChartsService;
use App\Service\DataType;
class HomeController extends AbstractController
{
private $security;
private $doctrine;
private $charts;
public function __construct(
ManagerRegistry $doctrine,
Security $security,
ChartsService $charts
)
{
$this->doctrine = $doctrine;
$this->security = $security;
$this->charts = $charts;
}
#[Route('/', name: 'app_home')]
public function index(ManagerRegistry $doctrine): Response
{
$session = new Session();
//$session->start();
$user = $this->security->getUser();
$medias = $doctrine->getRepository(Media::class)->findBy(['createdBy'=>$user]);
if (!$medias) {
$session->getFlashBag()->add(
'warning',
'<h4 class="alert-heading">Welcome !</h4>To proceed, first create a new media profile.'
);
return $this->redirectToRoute('new_media');
}else{
//generating data
$countries = BasicEnum::getEnumAsArray('App\Enum\Additionnal\Country', '');
$today=new \DateTime();
//yesterday
$yesterday = $today->modify("-1 days");
$dateRange = ['from'=>$yesterday, 'to' => new \DateTime()] ;
//yestermonth
$yestermonth = (new \DateTime())->sub( ( new \DateInterval('P1M')))->format('m');
//! fin initialisation parameters
$todayDetections = $this->doctrine->getManager()->getRepository(Detections::class)->findDetections(null, null, false, null, null, null, ['from'=> new \DateTime(), 'to' => new \DateTime()], false, false, false, null, $this->security->getUser());
$todayConsumers = $this->doctrine->getManager()->getRepository(Detections::class)->findDetections(null, null, false, null, null, null, ['from'=> new \DateTime(), 'to' => new \DateTime()], false, true, false, null, $this->security->getUser());
$to7daysDetections = $this->doctrine->getManager()->getRepository(Detections::class)->findDetections(null, null , false, false, 'P7D', null, null, false, false, false, null, $this->security->getUser(), true);
$to7daysConsumers = $this->doctrine->getManager()->getRepository(Detections::class)->findDetections(null, null , false, false, 'P7D', null, null, false, true, false, null, $this->security->getUser(), true);
$yester7daysDetections = $this->doctrine->getManager()->getRepository(Detections::class)->findDetections(null, null , false, false, 'P14D', null, null, false, false, false, null, $this->security->getUser(), true );
$yester7daysConsumers = $this->doctrine->getManager()->getRepository(Detections::class)->findDetections(null, null , false, false, 'P14D', null, null, false, true, false, null, $this->security->getUser(), true);
$todayTopMediasDetections = $this->doctrine->getManager()->getRepository(Detections::class)->getTopMediasAndSpots(false, true , $this->security->getUser(), false, null, ['from'=> new \DateTime(), 'to' => new \DateTime()]);
$todayTopMediasConsumers = $this->doctrine->getManager()->getRepository(Detections::class)->getTopMediasAndSpots(false, true , $this->security->getUser(), true, null, ['from'=> new \DateTime(), 'to' => new \DateTime()]);
$todayTopSpotsDetections = $this->doctrine->getManager()->getRepository(Detections::class)->getTopMediasAndSpots(true, false , $this->security->getUser(), false, null, ['from'=> new \DateTime(), 'to' => new \DateTime()]);
$todayTopSpotsConsumers = $this->doctrine->getManager()->getRepository(Detections::class)->getTopMediasAndSpots(true, false , $this->security->getUser(), true, null, ['from'=> new \DateTime(), 'to' => new \DateTime()]);
$todayConsumersbyCountry = $this->doctrine->getManager()->getRepository(Detections::class)->findDetections(false, false, true, null, null, null, ['from'=> new \DateTime(), 'to' => new \DateTime()], false, true, false, null, $this->security->getUser(), false);
$toDayWorldMapConsumers = $this->charts->getMapAreas(array_column($todayConsumersbyCountry, "nbrConsumers", "country"), "Consumers", $countries);
$todayConsumersbyRegion = $this->doctrine->getManager()->getRepository(Detections::class)->findDetections(false, false, true, true, null, null, ['from'=> new \DateTime(), 'to' => new \DateTime()], false, true, false, null, $this->security->getUser(), false );
$todayConsumersbyOs = $this->doctrine->getManager()->getRepository(Detections::class)->findDetections(null, false, false, false, null, null, ['from'=> new \DateTime(), 'to' => new \DateTime()], true, true, false, null, $this->security->getUser(), false);
$toDayDoughnutConsumersChart = $this->charts->generateDoughnutChart($todayConsumersbyOs, "nbrConsumers", "nbrOsDetections", DataType::Consumers, "os");
$todayConsumersbyDeviceType = $this->doctrine->getManager()->getRepository(Detections::class)->findDetections(null, false, false, false, null, null, ['from'=> new \DateTime(), 'to' => new \DateTime()], false, true, true, null, $this->security->getUser(), false);
$toDayBarConsumersChart = $this->charts->generateBarChart($todayConsumersbyDeviceType, "nbrConsumers", "nbrDeviceDetections", DataType::Consumers, "deviceType");
//Charts
$chart7daysConsumers = $this->charts->generateLineChart(
$period = ['from' => (new \DateTime())->modify("-7 days"), 'to' => new \DateTime()],[
['label' => 'Last 7 days Consumers','data'=>$this->charts->prepareForCharts($to7daysConsumers, "nbrConsumers", $period)],
['label' => 'The 7 days before Consumers',"borderDash" => [5, 5], "color" => "#8ca1ca", 'data'=>$this->charts->prepareForCharts($yester7daysConsumers, "nbrConsumers", ['from' => (new \DateTime())->modify("-14 days"), 'to' => (new \DateTime())->modify("-7 days")])]
],"Consumers", null
);
$chart7daysDetections = $this->charts->generateLineChart(
$period = ['from' => (new \DateTime())->modify("-7 days"), 'to' => new \DateTime()],[
['label' => 'Last 7 days Consumers','data'=>$this->charts->prepareForCharts($to7daysDetections, "nbrUserDetections", $period)],
['label' => 'The 7 days before Consumers',"borderDash" => [5, 5], "color" => "#8ca1ca", 'data'=>$this->charts->prepareForCharts($yester7daysDetections, "nbrUserDetections", ['from' => (new \DateTime())->modify("-14 days"), 'to' => (new \DateTime())->modify("-7 days")])]
],"Detections", null
);
return $this->render('home/index.html.twig', [
'countries' => array_flip($countries),
'chart7daysConsumers'=>$chart7daysConsumers,
'chart7daysDetections'=>$chart7daysDetections,
'todayDetections' => $todayDetections,
'todayConsumers'=> $todayConsumers,
'topMediasByDetections'=>$todayTopMediasDetections,
'consumersTopMediasTable'=>$todayTopMediasConsumers,
//'mediasByDetections'=>$todayTopMediasDetections,
'consumersByMediasTable'=>$todayTopMediasConsumers,
//'spotsByDetections' => $todayTopSpotsDetections,
'consumersBySpotsTable' => $todayTopSpotsConsumers,
//'topSpotsByDetections' => $todayTopSpotsDetections,
'consumersTopSpotsTable' => $todayTopSpotsConsumers,
'consumersByCountry'=>$todayConsumersbyCountry,
'consumersTopCountry'=>$todayConsumersbyCountry,
'worldMapConsumers'=>$toDayWorldMapConsumers,
'consumersbyRegion'=>$todayConsumersbyRegion,
'doughnutConsumersChart'=>$toDayDoughnutConsumersChart,
'barConsumersChart'=>$toDayBarConsumersChart
]);
}
}
#[Route('/period/{period}', methods:"GET", name: 'update_home')]
public function updateHome($period)
{
//initialisation
$countries = BasicEnum::getEnumAsArray('App\Enum\Additionnal\Country', '');
//today is
$today=new \DateTime();
//yesterday
$yesterday = $today->modify("-1 days");
$dateRange = ['from'=>$yesterday, 'to' => new \DateTime()] ;
//yestermonth
$yestermonth = (new \DateTime())->sub( ( new \DateInterval('P1M')))->format('m');
//general
// $todayDetections = $this->doctrine->getManager()->getRepository(Detections::class)->getMediaTotalDetectionsPeriod($media, 'P1D');
$todayConsumers = $this->doctrine->getManager()->getRepository(Detections::class)->findDetections(null, null, false, null, null, null, ['from'=> new \DateTime(), 'to' => new \DateTime()], false, true, false, null, $this->security->getUser());
switch ($period) {
case "today":
//Today
$todayConsumers = $this->doctrine->getManager()->getRepository(Detections::class)->findDetections(null, null, false, null, null, null, ['from'=> new \DateTime(), 'to' => new \DateTime()], false, true, false, null, $this->security->getUser());
$todayTopMediasConsumers = $this->doctrine->getManager()->getRepository(Detections::class)->getTopMediasAndSpots(false, true , $this->security->getUser(), true, null, ['from'=> new \DateTime(), 'to' => new \DateTime()]);
$todayTopSpotsConsumers = $this->doctrine->getManager()->getRepository(Detections::class)->getTopMediasAndSpots(true, false , $this->security->getUser(), true, null, ['from'=> new \DateTime(), 'to' => new \DateTime()]);
$todayConsumersbyCountry = $this->doctrine->getManager()->getRepository(Detections::class)->findDetections(false, false, true, null, null, null, ['from'=> new \DateTime(), 'to' => new \DateTime()], false, true, false, null, $this->security->getUser(), false);
$toDayWorldMapConsumers = $this->charts->updateMapAreas($todayConsumersbyCountry, array_flip($countries), DataType::Consumers);
$todayConsumersbyRegion = $this->doctrine->getManager()->getRepository(Detections::class)->findDetections(false, false, true, true, null, null, ['from'=> new \DateTime(), 'to' => new \DateTime()], false, true, false, null, $this->security->getUser(), false );
$todayConsumersbyOs = $this->doctrine->getManager()->getRepository(Detections::class)->findDetections(null, false, false, false, null, null, ['from'=> new \DateTime(), 'to' => new \DateTime()], true, true, false, null, $this->security->getUser(), false);
$toDayDoughnutConsumersChart = $this->charts->generateDoughnutChart($todayConsumersbyOs, "nbrConsumers", "nbrOsDetections", DataType::Consumers, "os");
$todayConsumersbyDeviceType = $this->doctrine->getManager()->getRepository(Detections::class)->findDetections(null, false, false, null, null, null, ['from'=> new \DateTime(), 'to' => new \DateTime()], false, true, true, null, $this->security->getUser(), false);
$toDayBarConsumersChart = $this->charts->generateBarChart($todayConsumersbyDeviceType, "nbrConsumers", "nbrDeviceDetections", DataType::Consumers, "deviceType");
$consumersByCountryDT = $this->charts->generateDTDetectionsByCountry($todayConsumersbyCountry, DataType::Consumers, $countries);
$consumersbyRegionDT = $this->charts->generateDTDetectionsByRegion($todayConsumersbyRegion, DataType::Consumers, $countries);
$consumersTopMediasTable = $this->charts->generateDTDetectionsByMedia($todayTopMediasConsumers, DataType::Consumers);
$consumersTopSpotsTable = $this->charts->generateDTDetectionsBySpot($todayTopSpotsConsumers, DataType::Consumers);
return new JsonResponse([
'countries' => array_flip($countries),
//'todayConsumers'=> $todayConsumers,
'consumersTopMediasTable'=>$consumersTopMediasTable,
'consumersByMediasTable'=>$consumersTopMediasTable,
'consumersBySpotsTable' => $consumersTopSpotsTable,
'consumersTopSpotsTable' => $consumersTopSpotsTable,
'consumersByCountry'=>$todayConsumersbyCountry,
'consumersTopCountry'=>$todayConsumersbyCountry,
'worldMapConsumers'=>$toDayWorldMapConsumers,
'consumersbyRegion'=>$todayConsumersbyRegion,
'doughnutConsumersChart'=>$toDayDoughnutConsumersChart,
'barConsumersChart'=>$toDayBarConsumersChart,
'consumersbyCountryTable'=>$consumersByCountryDT,
'consumersbyRegionTable' => $consumersbyRegionDT,
]);
case "yesterday":
//yesterday
$yesterdayTopMediasConsumers = $this->doctrine->getManager()->getRepository(Detections::class)->getTopMediasAndSpots(false, true , $this->security->getUser(), true, null, ['from'=> $yesterday, 'to' => $yesterday]);
$yesterdayTopSpotsConsumers = $this->doctrine->getManager()->getRepository(Detections::class)->getTopMediasAndSpots(true, false , $this->security->getUser(), true, null, ['from'=> $yesterday, 'to' => $yesterday]);
$yesterdayConsumersbyCountry = $this->doctrine->getManager()->getRepository(Detections::class)->findDetections(false, false, true, null, null, null, ['from'=> $yesterday, 'to' => $yesterday], false, true, false, null, $this->security->getUser(), false);
$yesterdayWorldMapConsumers = $this->charts->updateMapAreas($yesterdayConsumersbyCountry, array_flip($countries), DataType::Consumers);
$yesterdayConsumersbyRegion = $this->doctrine->getManager()->getRepository(Detections::class)->findDetections(false, false, true, true, null, null, ['from'=> $yesterday, 'to' => $yesterday], false, true, false, null, $this->security->getUser(), false );
$yesterdayConsumersbyOs = $this->doctrine->getManager()->getRepository(Detections::class)->findDetections(null, false, false, false, null, null, ['from'=> $yesterday, 'to' => $yesterday], true, true, false, null, $this->security->getUser(), false);
$yesterdayDoughnutConsumersChart = $this->charts->generateDoughnutChart($yesterdayConsumersbyOs, "nbrConsumers", "nbrOsDetections", DataType::Consumers, "os");
$yesterdayConsumersbyDeviceType = $this->doctrine->getManager()->getRepository(Detections::class)->findDetections(null, false, false, null, null, null, ['from'=> $yesterday, 'to' => $yesterday], false, true, true, null, $this->security->getUser(), false);
$yesterdayBarConsumersChart = $this->charts->generateBarChart($yesterdayConsumersbyDeviceType, "nbrConsumers", "nbrDeviceDetections", DataType::Consumers, "deviceType");
$consumersByCountryDT = $this->charts->generateDTDetectionsByCountry($yesterdayConsumersbyCountry, DataType::Consumers, $countries);
$consumersbyRegionDT = $this->charts->generateDTDetectionsByRegion($yesterdayConsumersbyRegion, DataType::Consumers, $countries);
$consumersTopMediasTable = $this->charts->generateDTDetectionsByMedia($yesterdayTopMediasConsumers, DataType::Consumers);
$consumersTopSpotsTable = $this->charts->generateDTDetectionsBySpot($yesterdayTopSpotsConsumers, DataType::Consumers);
return new JsonResponse([
'countries' => array_flip($countries),
//'todayConsumers'=> $todayConsumers,
'consumersTopMediasTable'=>$consumersTopMediasTable,
'consumersByMediasTable'=>$consumersTopMediasTable,
'consumersBySpotsTable' => $consumersTopSpotsTable,
'consumersTopSpotsTable' => $consumersTopSpotsTable,
'consumersByCountry'=>$yesterdayConsumersbyCountry,
'consumersTopCountry'=>$yesterdayConsumersbyCountry,
'worldMapConsumers'=>$yesterdayWorldMapConsumers,
'consumersbyRegion'=>$yesterdayConsumersbyRegion,
'doughnutConsumersChart'=>$yesterdayDoughnutConsumersChart,
'barConsumersChart'=>$yesterdayBarConsumersChart,
'consumersbyCountryTable'=>$consumersByCountryDT,
'consumersbyRegionTable' => $consumersbyRegionDT,
]);
case "tomonth":
//toMonth
$tomonthTopMediasConsumers = $this->doctrine->getManager()->getRepository(Detections::class)->getTopMediasAndSpots(false, true , $this->security->getUser(), true, (new \DateTime())->format('m'));
$tomonthTopSpotsConsumers = $this->doctrine->getManager()->getRepository(Detections::class)->getTopMediasAndSpots(true, false , $this->security->getUser(), true, (new \DateTime())->format('m'));
$tomonthConsumersbyCountry = $this->doctrine->getManager()->getRepository(Detections::class)->findDetections(false, false, true, null, null, (new \DateTime())->format('m'), null, false, true, false, null, $this->security->getUser(), false);
$tomonthWorldMapConsumers = $this->charts->updateMapAreas($tomonthConsumersbyCountry, array_flip($countries), DataType::Consumers);
$tomonthConsumersbyRegion = $this->doctrine->getManager()->getRepository(Detections::class)->findDetections(false, false, true, true, null,(new \DateTime())->format('m'), null, false, true, false, null, $this->security->getUser(), false );
$tomonthConsumersbyOs = $this->doctrine->getManager()->getRepository(Detections::class)->findDetections(null, false, false, false, null, (new \DateTime())->format('m'), null, true, true, false, null, $this->security->getUser(), false);
$tomonthDoughnutConsumersChart = $this->charts->generateDoughnutChart($tomonthConsumersbyOs, "nbrConsumers", "nbrOsDetections", DataType::Consumers, "os");
$tomonthConsumersbyDeviceType = $this->doctrine->getManager()->getRepository(Detections::class)->findDetections(null, false, false, null, null, (new \DateTime())->format('m'), null, false, true, true, null, $this->security->getUser(), false);
$tomonthBarConsumersChart = $this->charts->generateBarChart($tomonthConsumersbyDeviceType, "nbrConsumers", "nbrDeviceDetections", DataType::Consumers, "deviceType");
$consumersByCountryDT = $this->charts->generateDTDetectionsByCountry($tomonthConsumersbyCountry, DataType::Consumers, $countries);
$consumersbyRegionDT = $this->charts->generateDTDetectionsByRegion($tomonthConsumersbyRegion, DataType::Consumers, $countries);
$consumersTopMediasTable = $this->charts->generateDTDetectionsByMedia($tomonthTopMediasConsumers, DataType::Consumers);
$consumersTopSpotsTable = $this->charts->generateDTDetectionsBySpot($tomonthTopSpotsConsumers, DataType::Consumers);
return new JsonResponse([
'countries' => array_flip($countries),
//'todayConsumers'=> $todayConsumers,
'consumersTopMediasTable'=>$consumersTopMediasTable,
'consumersByMediasTable'=>$consumersTopMediasTable,
'consumersBySpotsTable' => $consumersTopSpotsTable,
'consumersTopSpotsTable' => $consumersTopSpotsTable,
'consumersByCountry'=>$tomonthConsumersbyCountry,
'consumersTopCountry'=>$tomonthConsumersbyCountry,
'worldMapConsumers'=>$tomonthWorldMapConsumers,
'consumersbyRegion'=>$tomonthConsumersbyRegion,
'doughnutConsumersChart'=>$tomonthDoughnutConsumersChart,
'barConsumersChart'=>$tomonthBarConsumersChart,
'consumersbyCountryTable'=>$consumersByCountryDT,
'consumersbyRegionTable' => $consumersbyRegionDT,
]);
case "yestermonth":
//yesterMonth
$yestermonthTopMediasConsumers = $this->doctrine->getManager()->getRepository(Detections::class)->getTopMediasAndSpots(false, true , $this->security->getUser(), true, $yestermonth);
$yestermonthTopSpotsConsumers = $this->doctrine->getManager()->getRepository(Detections::class)->getTopMediasAndSpots(true, false , $this->security->getUser(), true, $yestermonth);
$yestermonthConsumersbyCountry = $this->doctrine->getManager()->getRepository(Detections::class)->findDetections(false, false, true, null, null, $yestermonth, null, false, true, false, null, $this->security->getUser(), false);
$yestermonthWorldMapConsumers = $this->charts->updateMapAreas($yestermonthConsumersbyCountry,array_flip( $countries), DataType::Consumers);
$yestermonthConsumersbyRegion = $this->doctrine->getManager()->getRepository(Detections::class)->findDetections(false, false, true, true, null,$yestermonth, null, false, true, false, null, $this->security->getUser(), false );
$yestermonthConsumersbyOs = $this->doctrine->getManager()->getRepository(Detections::class)->findDetections(null, false, false, false, null, $yestermonth, null, true, true, false, null, $this->security->getUser(), false);
$yestermonthDoughnutConsumersChart = $this->charts->generateDoughnutChart($yestermonthConsumersbyOs, "nbrConsumers", "nbrOsDetections", DataType::Consumers, "os");
$yestermonthConsumersbyDeviceType = $this->doctrine->getManager()->getRepository(Detections::class)->findDetections(null, false, false, null, null, $yestermonth, null, false, true, true, null, $this->security->getUser(), false);
$yestermonthBarConsumersChart = $this->charts->generateBarChart($yestermonthConsumersbyDeviceType, "nbrConsumers", "nbrDeviceDetections", DataType::Consumers, "deviceType");
$consumersByCountryDT = $this->charts->generateDTDetectionsByCountry($yestermonthConsumersbyCountry, DataType::Consumers, $countries);
$consumersbyRegionDT = $this->charts->generateDTDetectionsByRegion($yestermonthConsumersbyRegion, DataType::Consumers, $countries);
$consumersTopMediasTable = $this->charts->generateDTDetectionsByMedia($yestermonthTopMediasConsumers, DataType::Consumers);
$consumersTopSpotsTable = $this->charts->generateDTDetectionsBySpot($yestermonthTopSpotsConsumers, DataType::Consumers);
return new JsonResponse([
'countries' => array_flip($countries),
//'todayConsumers'=> $todayConsumers,
'consumersTopMediasTable'=>$consumersTopMediasTable,
'consumersByMediasTable'=>$consumersTopMediasTable,
'consumersBySpotsTable' => $consumersTopSpotsTable,
'consumersTopSpotsTable' => $consumersTopSpotsTable,
'consumersByCountry'=>$yestermonthConsumersbyCountry,
'consumersTopCountry'=>$yestermonthConsumersbyCountry,
'worldMapConsumers'=>$yestermonthWorldMapConsumers,
'consumersbyRegion'=>$yestermonthConsumersbyRegion,
'doughnutConsumersChart'=>$yestermonthDoughnutConsumersChart,
'barConsumersChart'=>$yestermonthBarConsumersChart,
'consumersbyCountryTable'=>$consumersByCountryDT,
'consumersbyRegionTable' => $consumersbyRegionDT,
]);
}
}
}