<?php
namespace App\Controller;
use App\Entity\Alert;
use App\Entity\AlertProduct;
use App\Entity\Competitor;
use App\Entity\CompetitorProduct;
use App\Entity\PriceScraped;
use DateInterval;
use DateTime;
use http\Env\Request;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class DashboardController extends AbstractController
{
/**
* @Route("/", name="home")
*/
public function index(): Response
{
$em = $this->getDoctrine()->getManager();
$interval = $this->lastScrapedCard();
$nbErrors = $this->countProductError();
$monitoredProduct = $em->getRepository(CompetitorProduct::class)->findMonitoredProducts();
$number_prices_scrapped = $this->countPriceScrap();
$compScrap = $this->countCompScrap();
if($monitoredProduct)
$monitoredProduct = count($monitoredProduct);
else
$monitoredProduct = 0;
return $this->render('dashboard/index.html.twig', [
'interval' => $interval,
'nbErrors' => $nbErrors,
'monitoredProduct' => $monitoredProduct,
'pricesScrapped' => $number_prices_scrapped,
'compScrap' => $compScrap
]);
}
public function lastScrapedCard(): string
{
$em = $this->getDoctrine()->getManager();
$idLast = $em->getRepository(PriceScraped::class)->findLastScrap();
$lastScrap = $em->getRepository(PriceScraped::class)->findOneBy(['id' => $idLast[0][1]]);
$dateLastScrap = $lastScrap->getDate();
$date = new DateTime('now');
$intervalDate = $dateLastScrap->diff($date);
$interval = ($intervalDate->h)*60 + $intervalDate->i;
if($intervalDate->h > 0 || $intervalDate->i > 5){
return '<p class="uk-margin-remove-bottom uk-padding-small uk-padding-remove-bottom"><i class="fas fa-exclamation-triangle fa-xl uk-margin-small-right" style="color: orange"></i>Attention, il y a peut-être un caillou dans l\'engrenage :</p>
<p class="uk-padding-small uk-padding-remove-top uk-margin-small-left">dernier prix relevé il y a '.$interval.' minutes</p>';
}else{
return '<p class="uk-padding-small"><i class="fas fa-check-circle fa-xl uk-margin-small-right" style="color: green"></i>La routourne tourne rond, dernier prix relevé à '.$dateLastScrap->format('h:i').' sur
'.$em->getRepository(Competitor::class)->findOneBy(['competitor_id' => $lastScrap->getCompetitorId()])->getBrand().'</p>';
}
}
public function countProductError(): string
{
$em = $this->getDoctrine()->getManager();
$date = new DateTime('now');
$interval = $date->sub(new DateInterval('P7D'));
$products = $em->getRepository(PriceScraped::class)->findProductError($interval);
if ($products)
$nb_errors = '<p class="uk-padding-small"><i class="fas fa-exclamation-triangle fa-xl uk-margin-small-right" style="color: orange"></i>'.count($products).' Produits n\'ont pas pu être mis à jour</p>';
else
$nb_errors = '';
return $nb_errors;
}
public function countPriceScrap(){
$em = $this->getDoctrine()->getManager();
$date = new DateTime('now');
$intervalDate = $date->sub(new DateInterval('P7D'));
$pricesScrapped = $em->getRepository(PriceScraped::class)->findPriceScrap($intervalDate);
if($pricesScrapped)
return count($pricesScrapped);
else
return 0;
}
/**
* count the number of competitor activated
* @return int
*/
public function countCompScrap(){
$em = $this->getDoctrine()->getManager();
$date = new DateTime('now');
$intervalDate = $date->sub(new DateInterval('P7D'));
$compScrap = $em->getRepository(PriceScraped::class)->findCompScrap($intervalDate);
if($compScrap)
return count($compScrap);
else
return 0;
}
/**
* construct table with all alerts
* @Route("/load/dashboardTable", name="dashboard_table")
*/
public function constructTable(\Symfony\Component\HttpFoundation\Request $request){
$data = $request->request->all();
$em = $this->getDoctrine()->getManager();
$alerts = $em->getRepository(Alert::class)->findAll();
foreach($alerts as $alert){
$alert_table['icon'] = '<p class="uk-align-center">'.$alert->getIconLink().'</p>';
$alert_table['alert_level'] = '<p style="text-align: center">'.$alert->getAlertLevel().'</p>';
$alert_table['name'] = '<p class="uk-align-center">'.$alert->getMessage().'</p>';
$alerted_products = $em->getRepository(AlertProduct::class)->findBy(['alert_level' => $alert->getAlertLevel()]);
if($alerted_products){
$number_products = count($alerted_products);
}else
$number_products = 0;
$alert_table['number_products'] = '<p class="uk-align-center">'.$number_products.'</p>';
$alert_table['list_products'] = '<a href="https://pricedemo.romapps.com/comparativeTable/'.$alert->getAlertLevel().'"
class="uk-button uk-button-primary uk-margin-small-left uk-align-center">Voir produits</a>';
$alerts_table[] = $alert_table;
}
$json_alerts_table = json_encode($alerts_table);
$returnResponse = new JsonResponse($json_alerts_table);
$returnResponse->setJson($json_alerts_table);
return $returnResponse;
}
}