<?php
namespace App\Controller\Statistiques;
use App\Repository\FactureFournisseurRepository;
use App\Repository\FactureRepository;
use App\Repository\StatistiquesRepository;
use App\Service\BaseService;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Session\Session;
use App\Repository\MarcheRepository;
use Doctrine\ORM\EntityManagerInterface;
use App\Entity\Marche;
use App\Entity\Devis;
use App\Entity\Bordereau;
use DateTime;
use App\Repository\MissionRepository;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
class statistiquesController extends AbstractController
{
public $baseService;
private $router;
public function __construct(BaseService $baseService,RouterInterface $router
)
{
$this->baseService = $baseService;
$this->router = $router;
}
#[Route('/dashboard' , name: 'dashboard') ]
public function dashboard(Request $request , EntityManagerInterface $entityManager ,FactureFournisseurRepository $factFornisseursRepo , StatistiquesRepository $statistiquesRepo ,MarcheRepository $marcheRepository , FactureRepository $factureRepo ): Response
{
$chckAccess = $this->baseService->Role(2);
if($chckAccess == 0){
return $this->redirectToRoute('login');
}else if ($chckAccess == 2){
return $this->redirectToRoute('infoUtilisateur');
}
// return $this->redirectToRoute('listBureaux'); //
$session = new Session;
$isConnected = $session->get('isConnected');
$user = $session->get('user');
$bureauSelected = $session->get('bureauSelected');
$marche = null;
$articles = [];
$agentDetails = [];
if($bureauSelected == 0)
{
$marches = $entityManager->getRepository(Marche::class)->findAll();
}
else
{
$marches = $marcheRepository->getMarches($bureauSelected);
}
if(isset($marches[0])){
$marche = $marches[0];
if($request->getMethod() == 'POST'){
$marcheSelected = $request->get('marchesSelected');
$marche = $entityManager->getRepository(Marche::class)->findOneBy(['id'=>$marcheSelected]);
}
if($marche)
{
if($marche->getTypeMarc() == 1)
{
$dv = $entityManager->getRepository(Devis::class)->find($marche->getIdDevis());
$articles = $factureRepo->getArticlesDv($dv->getId());
}
else
{
$dv = $entityManager->getRepository(Bordereau::class)->find($marche->getIdDevis());
$articles = $factureRepo->getArticlesBord($dv->getId());
}
}
}
$currentDate = new \DateTime();
$bureauSelected = $session->get('bureauSelected');
$currentDate->modify('first day of this year');
$date_debut = $currentDate->format('Y-m-d');
$currentDate->modify('last day of this year');
$date_fin = $currentDate->format('Y-m-d');
$factureDetails = $factFornisseursRepo->getStatistiquesFactByThisYear($date_debut , $date_fin);
if(isset($marches[0]))
{
$agentDetails = $statistiquesRepo->getAgentsStatistiques($marche->getId());
}
return $this->render('statiqtiques/dashboard.html.twig', [
'controller_name' => 'statistiquesController',
'bureauSelected'=>$bureauSelected,
'marches'=>$marches,
'marche'=>$marche,
'articles'=>$articles,
'facturesDetails'=>$factureDetails,
'agentDetails'=>$agentDetails,
'dateYear'=>date('Y')
]);
}
#[Route('/statistiques' , name: 'statistiques') ]
public function statistiques(Request $request ,MissionRepository $missionsRepository ,EntityManagerInterface $entityManager ,FactureFournisseurRepository $factFornisseursRepo , StatistiquesRepository $statistiquesRepo ,MarcheRepository $marcheRepository , FactureRepository $factureRepo ): Response
{
$chckAccess = $this->baseService->Role(1);
if($chckAccess == 0){
return $this->redirectToRoute('login');
}else if ($chckAccess == 2){
return $this->redirectToRoute('infoUtilisateur');
}
$session = new Session;
$isConnected = $session->get('isConnected');
$user = $session->get('user');
$bureauSelected = $session->get('bureauSelected');
$marche = null;
$articles = [];
$agentDetails = [];
$years = [];
$yearsDebut = 2023;
$yearsFin = (new DateTime())->format('Y');
for ($i = $yearsDebut; $i <= $yearsFin; $i++) {
$years[] = $i;
}
$yearSelect = $yearsFin;
$months = [];
if($bureauSelected == 0)
{
$marches = $entityManager->getRepository(Marche::class)->findAll();
}
else
{
$marches = $marcheRepository->getMarches($bureauSelected);
}
if($request->getMethod() == 'POST' && $request->get('isForm2')){
$yearSelect = $request->get('yearSelect'); // Replace with the desired year
}
// Calculate the start date of the year
$dateDebut = new \DateTime("$yearSelect-01-01 00:00");
// Calculate the end date of the year
if ($yearSelect == (int) date('Y')) {
$dateFin = new \DateTime();
} else {
$dateFin = new \DateTime("$yearSelect-12-31 23:59");
}
// Format the dates as strings if needed
$dateDebutStr = $dateDebut->format('Y-m-d H:i');
$dateFinStr = $dateFin->format('Y-m-d H:i');
$factureDetails = $factFornisseursRepo->getStatistiquesFact($dateDebutStr,$dateFinStr);
$year=date("Y");
if ($request->getMethod()=="POST")
{
$year=$request->get('year');
}
$dataParMois=array();
$length = 12;
if($yearSelect == date("Y")){
}
for($i=0 ; $i < $length ; $i++)
{
$dateDebut=date($yearSelect."-".$i."-01 00:00:00");
$dateFin=date($yearSelect."-".$i."-t 23:59:59");
$dataParMois[$i]["mois"]=date("F-Y",strtotime($dateDebut));
$dataFromQuery=$factFornisseursRepo->getStatistiquesFact($dateDebut,$dateFin);
$dataParMois[$i]["totalTtc"]=$dataFromQuery['totalTtc']['TotalTtc'] ? $dataFromQuery['totalTtc']['TotalTtc'] : 0 ;
$dataParMois[$i]["totalFactPaye"]= $dataFromQuery['totalFactPaye']['TotalPaye'] ? $dataFromQuery['totalFactPaye']['TotalPaye'] : 0;
}
//TODO:Get missions details
$missionTerminee = null;
$missionEnCours = null;
$missionEnConfigurations = null;
$currentDate = new \DateTime();
$currentDate->modify('first day of this month');
$date_debutFilter = $currentDate->format('Y-m-d');
$currentDate->modify('last day of this month');
$date_finFilter = $currentDate->format('Y-m-d');
if(isset($marches[0])){
$marche = $marches[0];
if($request->getMethod() == 'POST'){
if($request->get('date_debut') < $request->get('date_fin')){
$marcheSelected = $request->get('marchesSelected');
$marche = $entityManager->getRepository(Marche::class)->findOneBy(['id'=>$marcheSelected]);
if(!$marche){
$marche = $marches[0];
}
$date_debutFilter = $request->get('date_debut');
$date_finFilter = $request->get('date_fin');
}
}
$missionTerminee = $missionsRepository->getMissionsByMarche(2,$marche->getId(),$date_debutFilter , $date_finFilter);
$missionEnCours = $missionsRepository->getMissionsByMarche(1,$marche->getId(),$date_debutFilter , $date_finFilter);
$missionEnConfigurations = $missionsRepository->getMissionsByMarche(0,$marche->getId(),$date_debutFilter , $date_finFilter);
}
$missionsDetail = [
['missionsDetail'=>'Missions terminée' , 'mission'=>$missionTerminee],
['missionsDetail'=>'Missions en cours' , 'mission'=>$missionEnCours],
['missionsDetail'=>'Missions en configuration' , 'mission'=>$missionEnConfigurations]
];
//TODO:Get détails cards
$currentDate->modify('first day of this year');
$date_debut1 = $currentDate->format('Y-m-d');
$currentDate->modify('last day of this year');
$date_fin1 = $currentDate->format('Y-m-d');
$yearSelect1 = date('Y');
if($request->getMethod() == 'POST' && ($request->get('isForm1'))){
$yearSelect1 = $request->get('yearSelect1');
$date_debut1 = date("$yearSelect1-01-01");
// Calculate the end date of the year
if($yearSelect1 == (int) date('Y')){
$date_fin1 = date('Y-m-d');
}else {
$date_fin1 = date("$yearSelect1-12-31");
}
}
$dataCards = $statistiquesRepo->getCardsStatistiques($date_debut1,$date_fin1);
//TODO:Get détails cards
$dataParMoisCharge = [];
$lengthOfCharge = 12;
for($i=0 ; $i < $lengthOfCharge ; $i++)
{
$dateDebut=date($yearSelect."-".$i."-01 00:00:00");
$dateFin=date($yearSelect."-".$i."-t 23:59:59");
$dataParMoisCharge[$i]["mois"]=date("F-Y",strtotime($dateDebut));
$dataFromQuery=$factFornisseursRepo->getStatistiquesCharge($dateDebut,$dateFin);
$dataParMoisCharge[$i]["totalTtc"]=$dataFromQuery['totalTtc']['TotalTtc'] ? $dataFromQuery['totalTtc']['TotalTtc'] : 0 ;
}
//TODO:Get détails factures
$dataParMoisFacture = [];
$lengthOfFactures = 12;
$yearSelectFactures = '2024';
for($i=0 ; $i < $lengthOfFactures ; $i++)
{
$dateDebut=date($yearSelectFactures."-".$i."-01 00:00:00");
$dateFin=date($yearSelectFactures."-".$i."-t 23:59:59");
$dataParMoisFacture[$i]["mois"]=date("F-Y",strtotime($dateDebut));
$dataFromQuery=$factureRepo->getStatistiquesFact($dateDebut,$dateFin);
$dataParMoisFacture[$i]["totalTtc"]=$dataFromQuery['totalTtc']['TotalTtc'] ? $dataFromQuery['totalTtc']['TotalTtc'] : 0 ;
}
//TODO:Get details by mois
$yearSelectForAgent = date('Y');
$month = date('m');
if($request->getMethod() == 'POST' && $request->get('isForm3')){
list($yearSelectForAgent, $month) = explode("-", $request->get('month'));
}
$agentDetails = [];
if($marche)
{
$agentDetails = $statistiquesRepo->getDetailsStatAgent($marche->getId(),$month , $yearSelectForAgent);
}
return $this->render('statiqtiques/statistiques.html.twig', [
'controller_name' => 'statistiquesController',
'bureauSelected'=>$bureauSelected,
'dataCards'=>$dataCards,
'marches'=>$marches,
'marche'=>$marche,
'articles'=>$articles,
'agentDetails'=>$agentDetails,
'years'=>$years,
'yearSelect'=>$yearSelect,
'dataParMois'=>$dataParMois,
'factureDetails'=>$factureDetails,
'missionsDetail'=>$missionsDetail,
'date_debutFilter'=>$date_debutFilter,
'date_finFilter'=>$date_finFilter,
'dataParMoisFacture'=>$dataParMoisFacture,
'yearSelect1'=>$yearSelect1,
'yearSelectForAgent'=>$yearSelectForAgent,
'month'=>$month,
]);
}
}