<?php
namespace App\Controller;
use App\Entity\User;
use App\Entity\UserConges;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Cookie;
use Symfony\Component\Validator\Constraints\DateTime;
use Symfony\Component\Translation\TranslatorInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use App\Repository\UserCongesRepository;
use App\Service\ServiceTeaminfo;
use App\Repository\InterventionsRepository;
class UserCongeController extends Controller
{
public $InterventionsRepository;
public $UserCongesRepository;
public $serviceTeaminfo;
public function __construct(UserCongesRepository $UserCongesRepository, ServiceTeaminfo $serviceTeaminfo, InterventionsRepository $InterventionsRepository)
{
$this->InterventionsRepository = $InterventionsRepository;
$this->UserCongesRepository = $UserCongesRepository;
$this->ServiceTeaminfo = $serviceTeaminfo;
}
public function index(Request $request)
{
return $this->render('conge/index.html.twig', [
'titre_page' => 'Congés',
'add_js_files' => "conge_js",
]);
}
public function add(Request $request, TokenStorageInterface $tokenStorage)
{
$path = parse_url($request->headers->get('referer'), PHP_URL_PATH);
$router = $this->get('router');
$routeName = $router->match($path)['_route'];
$user_selected = $tokenStorage->getToken()->getUser();
$users = $this->getDoctrine()->getRepository(User::class)->findAll();
return $this->render('conge/conge_add.html.twig', [
'users' => $users,
'user_selected' => $user_selected,
'titre_page' => 'conge',
'add_js_files' => "conge_js",
'redirectUrl' => $routeName
]);
}
public function conge_validation(Request $request)
{
$id_user = $request->get('id_user');
if ($request->get("start_date"))
$start_date = new \Datetime($request->get('start_date'));
if ($request->get("end_date"))
$end_date = new \Datetime($request->get('end_date'));
$conges_user = $this->UserCongesRepository->conge_validation($id_user, $start_date->format("Y/m/d"), $end_date->format("Y/m/d"));
return new Response(count($conges_user));
}
public function add_check(Request $request, TokenStorageInterface $tokenStorage, TranslatorInterface $translator)
{
$entityManager = $this->getDoctrine()->getManager();
$conge = new UserConges();
$date_debut = new \Datetime($request->get('date_debut'));
$date_fin = new \Datetime($request->get('date_fin'));
$interval = $date_debut->diff($date_fin);
$numberOfDays = $interval->days;
$user_id = $request->get('user');
$currentUser = $tokenStorage->getToken()->getUser();
if ($user_id)
$user = $this->getDoctrine()->getRepository(User::class)->find($user_id);
else
$user = $currentUser;
for ($i = 0; $i <= $numberOfDays; $i++) {
$check_user_conge = $this->CheckUserConge($date_debut, $date_debut, $user_id);
if ($check_user_conge) {
$conge = new UserConges();
$conge->setDateDebut($date_debut);
$conge->setDateFin($date_debut);
$conge->setUser($user);
$conge->setState("accepte");
$entityManager->persist($conge);
$entityManager->flush();
}
$date_debut->modify("+1 days");
}
return $this->redirectToRoute(
"liste_conges",
array(
'valide_msg' => $translator->trans("Disponibilité ajouté avec success"),
'no_valide_msg' => null
)
);
}
public function CheckUserConge($date_debut, $date_fin, $user_id)
{
$user_conge = $this->getDoctrine()->getRepository(UserConges::class)->findby(array('user' => $user_id, 'date_debut' => $date_debut, 'date_fin' => $date_fin));
if ($user_conge) {
return false;
} else {
return true;
}
}
public function get_user_info_by_date(Request $request)
{
$user_id = $request->get('user_id');
$date = $request->get('date');
$users = [$user_id];
$filters = ["users" => $users, "start_date" => $date, "end_date" => $date];
$interventions_equipe = [];
$interventions = [];
$projects = [];
$equipes = [];
$interventions_equipe = $this->InterventionsRepository->getInterventionsByFilters($filters, false, false, false, false, true);
$interventions = $this->InterventionsRepository->getInterventionsByFilters($filters, false, true);
foreach ($interventions as $key => $value) {
if ($value->getProject() && !array_key_exists($value->getProject()->getId(), $projects)) {
$projects[$value->getProject()->getId()]["libelle"] = $value->getProject()->getLibelle();
$projects[$value->getProject()->getId()]["client"] = $value->getProject()->getClient()->getDenomination();
$projects[$value->getProject()->getId()]["id"] = $value->getProject()->getId();
$projects[$value->getProject()->getId()]["start"] = $value->getProject()->getDateDebut();
$projects[$value->getProject()->getId()]["end"] = $value->getProject()->getDateFin();
}
}
$Date = new \DateTime($request->get('date'));
$strDate = $Date->format("d/m/Y");
$html = $this->get('twig')->render('conge/modalUserInfoByDate.html.twig', ["projects" => $projects, "date" => $strDate]);
return new Response($html);
}
public function AddOneDayDispo(Request $request)
{
$entityManager = $this->getDoctrine()->getManager();
$userConge = new UserConges();
$userConge->setUser($this->getDoctrine()->getRepository(User::class)->find($request->get('IdUser')));
$userConge->setDateDebut(new \DateTime(substr($request->get('date'), 0, 10)));
$userConge->setDateFin(new \DateTime(substr($request->get('date'), 0, 10)));
$userConge->setState("accepte");
$entityManager->persist($userConge);
$entityManager->flush();
$cookies = $request->cookies;
$colors_array = array();
if ($cookies->has('users_conges_colors'))
$colors_array = unserialize($cookies->get('users_conges_colors'));
$color_result = $this->ServiceTeaminfo->getItemColor($request->get('IdUser'), $colors_array, count($colors_array), false);
$colors_array = $color_result["graphic_view_colors"];
if ($color_result["cookie_updated"]) {
$headers_to_send = new Response();
$cookie_to_send = new Cookie('users_conges_colors', serialize($colors_array), time() + (365 * 24 * 60 * 60), '/', null, false, false);
$headers_to_send->headers->setCookie($cookie_to_send);
$headers_to_send->sendHeaders();
}
$conge_element = array();
$conge_element["id"] = $userConge->getId();
$conge_element["color"] = $color_result['item_color'];
$conge_element["path"] = $this->generateUrl("conge_modify", array('id' => $userConge->getId()));
return new Response(json_encode($conge_element));
}
public function modify(Request $request, $id)
{
$url = parse_url($request->headers->get('referer'), PHP_URL_PATH);
$userConge = $this->getDoctrine()->getRepository(UserConges::class)->find($id);
$users = $this->getDoctrine()->getRepository(User::class)->findAll();
$user_selected = $this->getDoctrine()->getRepository(User::class)->find($userConge->getUser());
return $this->render('conge/conge_modify.html.twig', [
'users' => $users,
'user_selected' => $user_selected,
'userConge' => $userConge,
'titre_page' => 'conge',
'add_js_files' => "conge_js",
'redirectUrl' => $url
]);
}
public function modify_check(Request $request, TranslatorInterface $translator)
{
$entityManager = $this->getDoctrine()->getManager();
$conge = $this->getDoctrine()->getRepository(UserConges::class)->find($request->get('idUserConge'));
if ($request->get('users')) {
$user_id = $request->get('users');
$user = $this->getDoctrine()->getRepository(User::class)->find($user_id[0]);
$conge->setUser($user);
}
if ($request->get("date_debut"))
$conge->setDateDebut(new \Datetime($request->get('date_debut')));
if ($request->get("date_fin"))
$conge->setDateFin(new \Datetime($request->get('date_fin')));
$entityManager->persist($conge);
$entityManager->flush();
if ($request->get("modify_ajax"))
return new Response("done");
$url = $request->get("redirectUrl");
$router = $this->get('router');
$routeName = $router->match($url)['_route'];
$url_parts = explode("/", $url);
krsort($url_parts);
$url_parts = array_values($url_parts);
$id = $url_parts[0];
$parameters = array(
'valide_msg' => $translator->trans("Disponibilité modifié avec success"),
'no_valide_msg' => null
);
if (intval($id) == true) {
$parameters['id'] = intval($id);
$parameters['from'] = $url_parts[1];
}
return $this->redirectToRoute($routeName, $parameters);
}
function addUserToArray($User, $Techniciens)
{
$Technicien = array();
$Technicien["id"] = $User->getId();
$Technicien["nom"] = $User->getNom();
$Technicien["prenom"] = $User->getPrenom();
array_push($Techniciens, $Technicien);
return $Techniciens;
}
public function getTimelineUsers(Request $request)
{
$AllUsers = $this->getDoctrine()->getRepository(User::class)->findAll();
$Techniciens = array();
$id_user = $request->get("id_user");
$User = null;
$AllUsers = null;
if ($id_user)
$User = $this->getDoctrine()->getRepository(User::class)->find($id_user);
else {
$currentFilter = (array) json_decode($this->forward('App\Controller\UserFilterController::verify_cookie')->getContent());
if (isset($currentFilter["users"])) {
foreach ($currentFilter["users"] as $user_id) {
$current_user = $this->getDoctrine()->getRepository(User::class)->find($user_id);
$AllUsers[] = $current_user;
}
} else {
$AllUsers = $this->getDoctrine()->getRepository(User::class)->findBy([], ['nom' => 'ASC', 'prenom' => 'ASC']);
}
}
if (in_array("ROLE_admin", $this->getUser()->getRoles())) {
if ($User)
$Techniciens = $this->addUserToArray($User, $Techniciens);
else if ($AllUsers)
foreach ($AllUsers as $key => $User) {
$Techniciens = $this->addUserToArray($User, $Techniciens);
}
} else
$Techniciens = $this->addUserToArray($this->getUser(), $Techniciens);
return new Response(json_encode($Techniciens));
}
public function getTimelineConges(Request $request)
{
if ($request->get("user_id")) {
$currentFilter = (array) json_decode($this->forward('App\Controller\UserFilterController::verify_cookie')->getContent());
$start_date = new \Datetime($request->get("start_date") . " 00:00:00");
$end_date = new \Datetime($request->get("end_date") . " 23:59:59");
$currentFilter["users"] = [$request->get("user_id")];
$conges_objects = $this->UserCongesRepository->getCongeByDate($currentFilter, $start_date->format("Y/m/d"), $end_date->format("Y/m/d"));
$conges = array();
$cookies = $request->cookies;
$colors_array = array();
if ($cookies->has('users_conges_colors'))
$colors_array = unserialize($cookies->get('users_conges_colors'));
$cookie_updated = false;
foreach ($conges_objects as $i => $conge) {
$user = $conge->getUser();
$conge_element = array();
$conge_element["id"] = $conge->getId();
$conge_start_date = $conge->getDateDebut();
$conge_end_date = $conge->getDateFin();
if ($conge_start_date < $start_date)
$conge_start_date = $start_date;
if ($conge_end_date > $end_date)
$conge_end_date = $end_date;
$conge_element["user_id"] = $user->getId();
$conge_element["path"] = $this->generateUrl("conge_modify", array('id' => $conge->getId()));
$color_result = $this->ServiceTeaminfo->getItemColor($user->getId(), $colors_array, $i, $cookie_updated);
$conge_element["color"] = $color_result['item_color'];
$cookie_updated = $color_result["cookie_updated"];
$colors_array = $color_result["graphic_view_colors"];
$interval = new \DateInterval('PT12H');
$begin = clone $conge_start_date;
$end = clone $conge_end_date;
$end->setTime(0, 0, 1);
$date_range = new \DatePeriod($begin, $interval, $end);
foreach ($date_range as $date) {
$conge_element["start_date"] = $date->format("Y-m-d 00:00:00");
$conge_element["end_date"] = $date->format("Y-m-d 11:59:59");
$conges[] = $conge_element;
$conge_element["start_date"] = $date->format("Y-m-d 12:00:00");
$conge_element["end_date"] = $date->format("Y-m-d 23:59:59");
$conges[] = $conge_element;
}
}
if ($cookie_updated) {
$headers_to_send = new Response();
$cookie_to_send = new Cookie('users_conges_colors', serialize($colors_array), time() + (365 * 24 * 60 * 60), '/', null, false, false);
$headers_to_send->headers->setCookie($cookie_to_send);
$headers_to_send->sendHeaders();
}
return new Response(json_encode($conges));
}
return new Response("none");
}
public function delete(Request $request, TranslatorInterface $translator)
{
$entityManager = $this->getDoctrine()->getManager();
$conge = $this->getDoctrine()->getRepository(UserConges::class)->find($request->get('id'));
if ($conge) {
$entityManager->remove($conge);
$entityManager->flush();
return new Response("done");
}
return new Response("not found");
}
public function liste_conges(Request $request, TokenStorageInterface $tokenStorage, TranslatorInterface $translator)
{
$currentFilter = json_decode($this->forward('App\Controller\UserFilterController::verify_cookie')->getContent());
$user = $tokenStorage->getToken()->getUser();
$vue_graphique = $vue_liste = null;
$parameters = [
'titre_page' => $translator->trans('Congés'),
'defaultLimit' => $this->ServiceTeaminfo::DEFAULT_LIMIT,
'vue_graphique' => $vue_graphique,
'add_js_files' => "conge_js",
];
return $this->render('conge/index_conges.html.twig', $parameters);
}
public function change_etat(Request $request)
{
$id = $request->get('id');
$etat = $request->get('etat');
$msg = "";
$user_conge = $this->getDoctrine()->getRepository(UserConges::class)->find($id);
if ($user_conge) {
$user_conge->setState($etat);
$entityManager = $this->getDoctrine()->getManager();
$entityManager->flush();
$msg = "ok";
}
return new Response($msg);
}
public function get_etat($etat, $id)
{
switch ($etat) {
case "accepte":
return '<div class="etat_icon resolu" data-id=' . $id . ' data-etat="refuse"><i id = "accepte" class="pe-7s-check check"></i></div>';
break;
case "refuse":
return '<div class="etat_icon n_resolu" data-id=' . $id . ' data-etat="accepte"><i id = "refuse" class="pe-7s-close-circle uncheck"></i></div>';
break;
default:
return '<div class="etat_icon null" data-id=' . $id . ' data-etat="accepte"><i id="null" class="pe-7s-info"></i></div>';
}
}
public function liste_conges_server_processing(Request $request, ServiceTeaminfo $ServiceTeaminfo)
{
$draw = intval($request->get('draw'));
$length = $request->get('length');
$start = $request->get('start');
$search = $request->get('search')['value'];
$orders = $request->get('order');
$order = $request->get('order')[0]['dir'];
$order_num = $request->get('order')[0]['column'];
$columns = $request->get('columns');
$deleted = false;
$currentFilter = json_decode($this->forward('App\Controller\UserFilterController::verify_cookie')->getContent());
if ($request->get('id_user') != null)
$id = $request->get('id_user');
else
$id = null;
$results = $this->UserCongesRepository->getAllConges($search, $order, $order_num, $length, $start, $deleted, $id, $currentFilter);
$listeconges = $results["results"];
$tot_data = $results["count"];
$conges = array();
foreach ($listeconges as $key => $value) {
$conge = array();
if ($value) {
$conge["nom"] = $value->getUser()->getNom() . " " . $value->getUser()->getPrenom();
$conge["date_debut"] = $value->getDateDebut()->format("d-m-Y");
$conge["date_fin"] = $value->getDateFin()->format("d-m-Y");
$conge["etat"] = $this->get_etat($value->getState(), $value->getId());
}
$conges[] = $conge;
}
$output = array(
"draw" => $draw,
"recordsTotal" => intval($tot_data),
"recordsFiltered" => intval($tot_data),
"data" => $conges
);
return new Response(json_encode($output), 200, ['Content-Type' => 'application/json']);
}
public function getCongeById(Request $request)
{
$conge = $this->getDoctrine()->getRepository(UserConges::class)->find($request->get("conge_id"));
if ($conge) {
$conge_object = array(
"id" => $conge->getId(),
"user_id" => $conge->getUser()->getId(),
"start" => $conge->getDateDebut()->format("Y-m-d"),
"end" => $conge->getDateFin()->format("Y-m-d"),
"path" => $this->generateUrl("conge_modify", array('id' => $conge->getId()))
);
return new Response(json_encode($conge_object));
}
return new Response('none');
}
public function getCongeByUserAndDate(Request $request)
{
$old_conge = $this->getDoctrine()->getRepository(UserConges::class)->find($request->get("conge_id"));
$user_id = $request->get("user_id");
$start_date = $request->get("start_date");
$end_date = $request->get("end_date");
$conges = $this->getDoctrine()->getRepository(UserConges::class)->getCongeByDate(["users" => [$user_id]], $start_date, $end_date, $request->get("conge_id"));
if ($conges)
return new Response(count($conges));
return new Response('none');
}
public function ExportVueGraphiqueConge(Request $request)
{
$start_date = new \Datetime($request->get("date_debut") . " 00:00:00");
$end_date = new \Datetime($request->get("date_fin") . " 23:59:59");
$Techniciens = array();
$id_user = $request->get("id_user");
$AllUsers = array();
$currentFilter = (array) json_decode($this->forward('App\Controller\UserFilterController::verify_cookie')->getContent(),true);
if (isset($currentFilter["users"])) {
foreach ($currentFilter["users"] as $user_id) {
$current_user = $this->getDoctrine()->getRepository(User::class)->find($user_id);
$AllUsers[] = $current_user;
}
} else {
$AllUsers = $this->getDoctrine()->getRepository(User::class)->findBy([], ['nom' => 'ASC', 'prenom' => 'ASC']);
}
if (in_array("ROLE_admin", $this->getUser()->getRoles())) {
if ($AllUsers){
foreach ($AllUsers as $key => $User) {
$Techniciens = $this->addUserToArray($User, $Techniciens);
}
}
} else
$Techniciens = $this->addUserToArray($this->getUser(), $Techniciens);
$conges_objects = $this->UserCongesRepository->getCongeByDate($currentFilter, $start_date->format("Y/m/d"), $end_date->format("Y/m/d"));
$conges = array();
$tabDaysOfWeek = array();
$tabDaysOfWeekHeader = array();
$current_date = clone $start_date;
while ($current_date <= $end_date) {
setlocale(LC_TIME, 'fr_FR.UTF-8');
$dayOfWeek = strftime("%A", $current_date->getTimestamp());
$dayOfMonth = $current_date->format("d");
$tabDaysOfWeekHeader[] = $dayOfWeek . " " . $dayOfMonth;
$tabDaysOfWeek[] = $current_date->format("Y-m-d");
$current_date->modify("+1 day");
}
foreach ($conges_objects as $CongeUser) {
$user_id = $CongeUser->getUser()->getId();
$conge_start_date = $CongeUser->getDateDebut();
$conge_end_date = $CongeUser->getDateFin();
$conge_end_date->modify("+1 day");
if (!isset($conges[$user_id])) {
$conges[$user_id] = array();
}
$interval = new \DateInterval('P1D');
$period = new \DatePeriod($conge_start_date, $interval, $conge_end_date);
foreach($period as $date){
$conges[$user_id][] = $date->format("Y-m-d");
}
}
$Users = $this->getDoctrine()->getRepository(User::class)->findBy(['deleted' => null, 'client' => null, 'isActive' => 1]);
$usersConge = array();
foreach ($Users as $user) {
$usersConge[] = array(
'id' => $user->getId(),
'nom' => $user->getNom() . " " . $user->getPrenom()
);
}
$titre = $start_date->format('d') . " - " . $end_date->format('d') . " " . $this->ServiceTeaminfo::MONTHS[intval($end_date->format('m'))]["libelle"];
$parameters = array(
'tabDaysOfWeek' => $tabDaysOfWeek,
'tabDaysOfWeekHeader' => $tabDaysOfWeekHeader,
'usersConge' => $Techniciens,
'conges' => $conges,
'titre' => $titre,
);
$html = $this->get('twig')->render('conge/ExportVueGraphiqueTemplateConge.html.twig', $parameters);
$url = $this->ServiceTeaminfo->generatePdf($html, "uploads", "VueGraphique");
return new Response($url);
}
}