<?php
namespace App\Controller;
use App\Entity\Equipes;
use App\Entity\User;
use App\Entity\Client;
use App\Entity\Adresse;
use App\Entity\Interventions;
use App\Entity\Entreprise;
use App\Entity\TicketReseaux;
use App\Entity\Tikets;
use App\Entity\Site;
use App\Entity\UserFilters;
use App\Entity\InterventionTags;
use App\Entity\InterventionAffectedTags;
use App\Entity\InterventionAffectedUsers;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Validator\Validator\ValidatorInterface;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Symfony\Component\HttpFoundation\Response;
use \Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\Translation\TranslatorInterface;
use Symfony\Component\Validator\Constraints\DateTime;
use Ovh\Sms\SmsApi;
use Symfony\Component\DependencyInjection\ContainerInterface;
use App\Repository\InterventionsRepository;
use App\Repository\ProjectsRepository;
use App\Repository\ClientRepository;
use App\Repository\UserRepository;
use App\Repository\UserCongesRepository;
use App\Service\ServiceTeaminfo;
class SecurityController extends Controller
{
public $InterventionsRepository;
public $ProjectsRepository;
public $ClientRepository;
public $UserRepository;
private $service;
public function __construct(InterventionsRepository $InterventionsRepository, ProjectsRepository $ProjectsRepository, ClientRepository $ClientRepository, UserRepository $UserRepository, ServiceTeaminfo $service)
{
$this->InterventionsRepository = $InterventionsRepository;
$this->ProjectsRepository = $ProjectsRepository;
$this->ClientRepository = $ClientRepository;
$this->UserRepository = $UserRepository ;
$this->service = $service;
}
/**
* @Route("/security", name="security")
*/
public function index( Request $req, TokenStorageInterface $tokenStorage )
{
$user = $tokenStorage->getToken()->getUser();
$users = $this->UserRepository->findAll();
$equipes = $this->getDoctrine()->getRepository(Equipes::class)->findAll();
$years = $this->getUniqueListYearsInterventions() ;
$entreprise_id = $this->container->getParameter('entreprise_id');
$entreprise = $this->getDoctrine()->getRepository(Entreprise::class)->find($entreprise_id);
if( $user != "anon." ){
$now = new \Datetime('now');
$current_month = $now->format("n");
$current_year = $now->format("Y");
return $this->render('security/index.html.twig', array(
'titre_page' => "Tableau de bord",
'current_month' => $current_month,
'current_year' => $current_year,
'users' => $users,
'equipes' => $equipes,
'years' => $years,
'entreprise' => $entreprise,
'controller_name' => 'SecurityController',
'add_js_files' =>"security_js"
));
}else
return $this->redirectToRoute('connexion');
}
public function conges_index(UserCongesRepository $userCongesRepository , TokenStorageInterface $tokenStorage)
{
$user = $tokenStorage->getToken()->getUser();
$now = new \Datetime('now');
$current_month = $now->format("n");
$current_year = $now->format("Y");
$conges_courant = $userCongesRepository->getCongesCourant($now->format("Y-m-d"),$user);
$conges_venir = $userCongesRepository->getCongesVenir($now->format("Y-m-d"),$user);
$conges = $userCongesRepository->getNomberCongeAprendre($now->format("Y-m-d"),$user);
$nombre_conge_a_prendre = $this->calculJoursCongesAprendre ($conges,$now->format("Y-m-d"));
$conges_index = $this->renderView('/security/conges_entreprise.html.twig', array(
'conges_courant' => $conges_courant,
'conges_venir' => $conges_venir,
'nombre_conge_a_prendre' => $nombre_conge_a_prendre,
));
$response =new Response(json_encode(array($conges_index)));
return $response;
}
public function calculJoursCongesAprendre ($conges,$date_now)
{
$nombre_jours_conges = 0;
foreach ( $conges as $conge ){
if ( $conge->getDateDebut()->format('Y-m-d') > $date_now )
$d1 = date_create(($conge->getDateDebut()->format('Y-m-d')));
else
$d1 = date_create($date_now);
$d2 = date_create( $conge->getDateFin()->format('Y-m-d') );
$interval = date_diff($d1,$d2);
$nombre = intval($interval->format('%d')) + 1;
$nombre_jours_conges += $nombre;
}
return $nombre_jours_conges;
}
public function login(Request $request, AuthenticationUtils $authUtils, TokenStorageInterface $tokenStorage,ServiceTeaminfo $ServiceTeaminfo)
{
$user = $tokenStorage->getToken()->getUser();
$error_message = null;
if( $user != "anon."){
if($user->getIsActive() == 1 && $user->getDeleted() == null){
$user_id = $user->getId();
$cookies = $request->cookies;
$response = new RedirectResponse('home', 302);
if($cookies->has('indicateurs')) $response->headers->clearCookie('indicateurs', '/', null);
if($cookies->has('site')) $response->headers->clearCookie('site', '/', null);
if($cookies->has('current_'.$ServiceTeaminfo::PROJECT_FILTER)) $response->headers->clearCookie('current_'.$ServiceTeaminfo::PROJECT_FILTER, '/', null);
if($cookies->has('current_'.$ServiceTeaminfo::INTERVENTION_FILTER)) $response->headers->clearCookie($ServiceTeaminfo::INTERVENTION_FILTER, '/', null);
if($cookies->has('current_user_role')) $response->headers->clearCookie('current_user_role', '/', null);
if($cookies->has('current_intervention_vue')) $response->headers->clearCookie('current_intervention_vue', '/', null);
$current_vue = $user->getCurrentInterventionVue();
if($current_vue){
$current_vue_id = $current_vue->getId();
$current_vue_parameters = $current_vue->getParameters();
}else{
$current_vue_id = 0;
$current_vue_parameters = $ServiceTeaminfo-> getDefaultView($ServiceTeaminfo->widthsAndDefaultView);
$nbr_items =$ServiceTeaminfo::DEFAULT_LIMIT;
$current_vue_parameters = array_merge($current_vue_parameters, array("nb_items_to_show"=>$nbr_items));
}
$current_vue = array_merge(array("id"=>$current_vue_id),$current_vue_parameters);
$cookie = new Cookie('current_intervention_vue', serialize($current_vue), time() + (365 * 24 * 60 * 60), '/', null, false, false);
$response->headers->setCookie($cookie);
return $response;
}elseif(!$user->getIsActive())
$error_message = "Le compte de cet utilisateur n'est pas activé.";
else
$error_message = "Le compte de cet utilisateur est supprimé.";
}
// get the login error if there is one
$error = $authUtils->getLastAuthenticationError();
// last username entered by the user
$lastUsername = $authUtils->getLastUsername();
return $this->render('security/login.html.twig', array(
'titre_page' => "Connexion",
'last_username' => $lastUsername,
'error' => $error,
'add_js_files' =>"security_js",
'error_message' => $error_message
));
}
public function logout(){}
public function forget_password(Request $request, \Swift_Mailer $mailer, TranslatorInterface $translator )
{
$entityManager = $this->getDoctrine()->getManager();
$user = $entityManager->getRepository(User::class)->findOneByEmail( $request->get('email') );
if($user && $user->getDeleted() !=1){
$reset = '';
$chaine = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
srand((double)microtime()*1000000);
for($i=0; $i<32; $i++)
$reset .= $chaine[rand()%strlen($chaine)];
$user->setReset($reset);
$user->setIsActive(false);
$entityManager->flush();
$e_mail = $user->getEmail();
$base_url = '/connexion/reset_password/'.$reset.'/'.$e_mail;
$content = $this->get('twig')->render('emails/mot_de_passe_obliee.html.twig', [
'titre_page' => 'reset password',
'e_mail' => $e_mail,
'url'=> $base_url,
'add_js_files' =>"security_js",
]);
try{
$message = (new \Swift_Message())
->setSubject($translator->trans('Mot de passe oblié') )
->setFrom($this->getParameter('contact_email'))
->setTo($user->getEmail())
->setBody($content,'text/html')
->setContentType('text/html')
;
$mailer->send($message);
}catch(\Swift_TransportException $Ste){};
return $this->redirectToRoute('connexion', array(
'valide_msg' => $translator->trans("Un email veins d'étre envoyer à votre boite email"),
));
}else
return $this->redirectToRoute('connexion');
}
public function reset_password ($reset, $e_mail)
{
$entityManager = $this->getDoctrine()->getManager();
$user = $entityManager->getRepository(User::class)->findOneByEmail($e_mail);
if($user && strcmp ($user->getReset(), $reset)==0 && $user->getDeleted() !=1){
return $this->render('security/reset.html.twig', [
'titre_page' => 'reset password',
'reset'=>$reset,
'e_mail' => $e_mail,
'add_js_files' =>"security_js",
]);
}else{
return $this->redirectToRoute('connexion');
}
}
public function reset_password_check($reset,$e_mail , Request $request, UserPasswordEncoderInterface $encoder, \Swift_Mailer $mailer, TranslatorInterface $translator)
{
$entityManager = $this->getDoctrine()->getManager();
$user = $entityManager->getRepository(User::class)->findOneByEmail($e_mail);
if($user && strcmp ($user->getReset(), $reset) == 0 && $user->getDeleted() !=1){
if(strcmp ($request->get('password'), $request->get('password_confirm'))==0){
$encoded_password = $encoder->encodePassword($user, $request->get('password') );
$user->setPassword( $encoded_password );
$user->setReset(null);
$base_url = '/connexion';
$entityManager->flush();
$content = $this->get('twig')->render('emails/nouveau_mot_de_passe.html.twig', [
'titre_page' => 'Email',
'user'=>$user,
'pasword'=>$request->get('password'),
'url'=> $base_url,
'add_js_files' =>"security_js",
]);
try{
$message = (new \Swift_Message())
->setSubject($translator->trans('Nouveau mot de passe') )
->setFrom($this->getParameter('contact_email'))
->setTo($e_mail)
->setBody($content,'text/html')
->setContentType('text/html')
;
$mailer->send($message);
}catch(\Swift_TransportException $Ste){};
}else {
return $this->redirectToRoute('reset_password', array(
'valide_msg' => $translator->trans("Mot de passe invalide"),
'e_mail' =>$e_mail,
'reset'=>$reset
));
}
}
return $this->redirectToRoute('connexion');
}
public function connectivity (Request $request, TokenStorageInterface $tokenStorage)
{
$user = $tokenStorage->getToken()->getUser();
$connected = "false";
if($user != "anon.") $connected = "true";
return new Response($connected);
}
public function getClientAdresses(Request $request, TokenStorageInterface $tokenStorage )
{
$msg = "";
$id_client = $request->get('client');
$client = $this->getDoctrine()->getRepository(Client::class)->find($id_client);
$id_adresse = $request->get('id_adresse');
if( $client ){
$adresses = $this->getDoctrine()->getRepository(Adresse::class)->findBy(array('id_client' => $id_client, 'deleted' => null));
$id_ent = $this->container->getParameter('entreprise_id');
$entreprise = $this->getDoctrine()->getRepository(Entreprise::class)->find($id_ent);
$id_client_interne = $entreprise->getCompteInterne()->getId();
$params = array(
'adresses' => $adresses,
'id_adresse' =>$id_adresse,
'id_client_interne' => $id_client_interne
);
if($id_adresse == null && $id_client == $id_client_interne){
$user = $tokenStorage->getToken()->getUser();
$site_ratachement = $user->getSiteRatachement();
$site = $this->getDoctrine()->getRepository(Site::class)->find($site_ratachement->getId());
$adresse = $site->getAdresse();
$id_adresse_interne = $adresse->getId();
$params['id_adresse'] = $id_adresse_interne;
}
$msg = $this->get('twig')->render('clients/adresses/select_adresse.html.twig', $params );
}else
$msg = "invalide client";
return new Response($msg);
}
public function getClients( Request $request )
{
$msg = "";
$id_client = $request->get('client');
$clients = $this->getDoctrine()->getRepository(Client::class)->findBy(['deleted' => null],["denomination" => "ASC"]);
$id_ent = $this->container->getParameter('entreprise_id');
$entreprise = $this->getDoctrine()->getRepository(Entreprise::class)->find($id_ent);
$id_client_interne = $entreprise->getCompteInterne()->getId();
$msg = $this->get('twig')->render('clients/select_client.html.twig',[
'clients' =>$clients,
'newClient' => $id_client,
'id_client_interne' => $id_client_interne
]);
return new Response($msg);
}
public function getClient( Request $request )
{
$id = $request->get('client');
$client = $this->getDoctrine()->getRepository(Client::class)->find($id);
$output = array(
"email" => $client->getEmail(),
"telephone" => ($client->getTelephoneMobile() || $client->getTelephone()) ?
($client->getTelephoneMobile() ?: $client->getTelephone()) :
"",
"machine" => $client->getMachineName(),
"teamviewer" => $client->getTeamviewerName()
);
return new Response(json_encode($output), 200, ['Content-Type' => 'application/json']);
}
public function get_client_site(Request $request)
{
$client = $this->getDoctrine()->getRepository(Client::class)->find( $request->get('client') );
return new Response( $client->getSiteAffectation()->getLibelle() );
}
/**
* @Route("/interventions_chart", name="interventions_chart")
*/
public function interventions_chart( Request $request, TokenStorageInterface $tokenStorage )
{
$user = $tokenStorage->getToken()->getUser();
$users = $request->get("users");
$result = array("Names" => ["Names"]);
$index = 1;
if($request->get("years")){
$first_month_name = "January";
$last_month_name = "December";
$result_length = 12;
$format_character = "M";
$years = $request->get("years");
$nb_columns = count($years);
if($users) $nb_columns *= count($users);
for($i=1; $i <= $result_length; $i++){
$dateObj = \DateTime::createFromFormat('!m', $i);
$month_short_name = $dateObj->format($format_character);
switch ($month_short_name) {
case "Feb":
$result[$month_short_name] = ["fev"];
break;
case "Apr":
$result[$month_short_name] = ["Avr"];
break;
case "May":
$result[$month_short_name] = ["Mai"];
break;
case "Jun":
$result[$month_short_name] = ["Jui"];
break;
case "Jul":
$result[$month_short_name] = ["Juil"];
break;
case "Aug":
$result[$month_short_name] = ["Aou"];
break;
default:
$result[$month_short_name] = [$month_short_name];
}
$zero_array = array_fill(1, $nb_columns, 0);
array_push($result[$month_short_name], ...$zero_array);
}
foreach($years as $year_key => $year){
$first_month_name = 'January '.$year;
$last_month_name = 'December '.$year;
$interventions_filters = array(
"start_date" => date('Y-m-01', strtotime($first_month_name)),
"end_date" => date('Y-m-t', strtotime($last_month_name)),
);
if( $user->getClient() ) $interventions_filters['clients'] = [$user->getClient()->getId()];
$result = $this->addPeriodElementsToArray($result, $index, $users, $interventions_filters, $format_character, $year);
$index++;
}
}else{
$format_character = "j";
$months = $request->get("months");
$interventions_filters = array();
if($user->getClient()) $interventions_filters['clients'] = [$user->getClient()->getId()];
$nb_columns = count($months);
if($users) $nb_columns *= count($users);
$result_length = 31;
if(count($months) == 1){
$month = \DateTime::createFromFormat('!m', $months[0]);
$result_length = date("t", $month->getTimestamp());
}
for($day=1; $day <= $result_length; $day++){
$key = strval($day);
$result[$key] = [$key];
$zero_array = array_fill(1, $nb_columns, 0);
array_push($result[$key], ...$zero_array);
}
foreach($months as $month_key => $month_number){
$month = \DateTime::createFromFormat('!m', $month_number);
$month_name = $month->format("F");
$fr_month_name = $this->service::MONTHS[$month_number]["libelle"];
$start_date = new \Datetime('first day of '.$month_name);
$end_date = new \Datetime('last day of '.$month_name);
$interventions_filters["start_date"] = $start_date->format("Y-m-d");
$interventions_filters["end_date"] = $end_date->format("Y-m-d");
$result = $this->addPeriodElementsToArray($result, $index, $users, $interventions_filters, $format_character, $fr_month_name);
$index++;
}
}
return new Response(json_encode($result));
}
public function getUniqueListYearsInterventions()
{
$listAllDates = array_column($this->InterventionsRepository->getlistDatesInterventions (),'date');
$listAllYears = array_map(
function ($date){
return $date->format('Y');
},
$listAllDates
);
$uniqueListYears = array_unique($listAllYears);
sort($uniqueListYears,SORT_NUMERIC);
return $uniqueListYears ;
}
private function addPeriodElementsToArray($result, $index, $users, $interventions_filters, $format_character, $period)
{
if($users){
foreach($users as $user_key => $user_intervenant_id){
$explode_result = explode('|',$user_intervenant_id);
$user_id = $equipe_id = null;
if($explode_result[0] === "u")
$user_id = $explode_result[1];
else
$equipe_id = $explode_result[1];
if($user_id){
$user_intervenant = $this->getDoctrine()->getRepository(User::class)->find($user_id);
$name = $user_intervenant->getNom()." ".$user_intervenant->getPrenom()." ".$period;
$result["Names"][] = $name;
$interventions_filters['users'] = [$user_id] ;
}else{
$equipe = $this->getDoctrine()->getRepository(Equipes::class)->find($equipe_id);
$name = $equipe->getLibelle()." ".$period;
$result["Names"][] = $name;
$interventions_filters['equipes'] = [$equipe_id];
}
$interventions = $this->InterventionsRepository->getInterventionsByFilters($interventions_filters, false, true);
foreach($interventions as $intervention){
$key = $intervention->getDate()->format($format_character);
$result[$key][$index]++;
}
if( $user_key !== count($users) - 1 ) $index++;
}
}else{
$result["Names"][] = $period;
$interventions = $this->InterventionsRepository->getInterventionsByFilters($interventions_filters, false, true);
foreach($interventions as $intervention){
$key = $intervention->getDate()->format($format_character);
$result[$key][$index]++;
}
}
return $result;
}
/**
* @Route("/devis_chart", name="devis_chart")
*/
public function chart_chiffre_affaire(Request $request, ServiceTeaminfo $ServiceTeaminfo)
{
$year = $request->get("year");
$result = array();
$chiffre_affaire_total = 0;
$chiffre_affaire_reel = 0;
$chiffre_affaire_preventional = 0;
for($m=1; $m<=12; $m++){
$month_number = substr("0".$m, -2);
$first_part = $year.'-'.$month_number;
$start_date = new \Datetime(date($first_part.'-01'));
$end_date = new \Datetime(date($first_part.'-t'));
$fr_month_name = $this->service::MONTHS[$m]["key"];
if($fr_month_name=="Feb") $fr_month_name="Fev";
if($fr_month_name=="Apr") $fr_month_name="Avr";
if($fr_month_name=="May") $fr_month_name="Mai";
if($fr_month_name=="Jun") $fr_month_name="Jui";
if($fr_month_name=="Jul") $fr_month_name="Juil";
if($fr_month_name=="Aug") $fr_month_name="Aou";
$thisdate = new \DateTime();
$curent_date = $thisdate->format("Y/m/d");
$curent_moth = substr($curent_date,5,2);
$curent_moth = $this->service::MONTHS[intval($curent_moth)]["key"];
$projects_devis = $this->ProjectsRepository->getProjectByDate($start_date->format("Y/m/d"), $end_date->format("Y/m/d"));
$chifre_reel = $this->ProjectsRepository->getChiffreReel($start_date->format("Y/m/d"), $end_date->format("Y/m/d"));
$total_reel = floatval($chifre_reel);
$total_preventional = floatval($projects_devis) - $total_reel ;
if ($fr_month_name != $curent_moth) $total_preventional = 0 ;
$table_chiffre_date[] = [$fr_month_name,$total_preventional,$total_reel];
$chiffre_affaire_reel+= $total_reel;
$chiffre_affaire_preventional += $total_preventional;
}
$total_devis_ans = $this->ProjectsRepository->getProjectByDate($year.'/01/01', $year.'/12/31');
$html = [
"cat" => $ServiceTeaminfo->formatPrice($total_devis_ans,true),
"car" => $ServiceTeaminfo->formatPrice($chiffre_affaire_reel,true),
"cap" => $ServiceTeaminfo->formatPrice($chiffre_affaire_preventional,true)
] ;
$data = [
"table_chiffre_date" => $table_chiffre_date,
"html" => $html
];
return new Response(json_encode($data));
}
public function DeleteAllCookies() {
foreach ($_COOKIE as $name => $value) {
if (isset($_COOKIE[$name])) {
unset($_COOKIE[$name]);
setcookie($name, '', time() - 3600, '/');
}
}
return new Response("done");
}
}