ajout page validation des timer et option heure supplémentaires
This commit is contained in:
@@ -347,6 +347,23 @@ app_validationholiday_activeholiday:
|
|||||||
path: /validator/validateholiday/activeholiday
|
path: /validator/validateholiday/activeholiday
|
||||||
defaults: { _controller: App\Controller\ValidationController:activeholiday }
|
defaults: { _controller: App\Controller\ValidationController:activeholiday }
|
||||||
|
|
||||||
|
#== Validationtimer ====================================================================================================
|
||||||
|
app_validationtimer:
|
||||||
|
path: /validator/validationtimer
|
||||||
|
defaults: { _controller: App\Controller\ValidationController:validationtimer }
|
||||||
|
|
||||||
|
app_validationtimer_validate:
|
||||||
|
path: /validator/validatetimer
|
||||||
|
defaults: { _controller: App\Controller\ValidationController:validatetimer }
|
||||||
|
|
||||||
|
app_validationtimer_devalidate:
|
||||||
|
path: /validator/devalidatetimer
|
||||||
|
defaults: { _controller: App\Controller\ValidationController:devalidatetimer }
|
||||||
|
|
||||||
|
app_validationtimer_activetimer:
|
||||||
|
path: /validator/validateholiday/activetimer
|
||||||
|
defaults: { _controller: App\Controller\ValidationController:activetimer }
|
||||||
|
|
||||||
#== Timer ====================================================================================================
|
#== Timer ====================================================================================================
|
||||||
app_timer:
|
app_timer:
|
||||||
path: /timer
|
path: /timer
|
||||||
|
@@ -217,7 +217,8 @@ class TimerController extends AbstractController
|
|||||||
$tbtimers = [];
|
$tbtimers = [];
|
||||||
foreach ($timers as $timer) {
|
foreach ($timers as $timer) {
|
||||||
$isactive = $timer->getActivePenalty();
|
$isactive = $timer->getActivePenalty();
|
||||||
if ($isactive) {
|
$isadditional = $timer->getAdditionalHour();
|
||||||
|
if ($isactive || $isadditional) {
|
||||||
$tbtimer["id"] = $timer->getId();
|
$tbtimer["id"] = $timer->getId();
|
||||||
$tbtimer["taskname"] = $timer->getTask()->getDisplayname();
|
$tbtimer["taskname"] = $timer->getTask()->getDisplayname();
|
||||||
$tbtimer["user"] = $timer->getUser()->getUsername();
|
$tbtimer["user"] = $timer->getUser()->getUsername();
|
||||||
@@ -225,6 +226,7 @@ class TimerController extends AbstractController
|
|||||||
$tbtimer["end"] = $timer->getId();
|
$tbtimer["end"] = $timer->getId();
|
||||||
$tbtimer["duration"] = $timer->getDuration();
|
$tbtimer["duration"] = $timer->getDuration();
|
||||||
$tbtimer["activepenalty"] = $timer->getActivePenalty();
|
$tbtimer["activepenalty"] = $timer->getActivePenalty();
|
||||||
|
$tbtimer["additionalhour"] = $timer->getAdditionalHour();
|
||||||
$tbtimer["description"] = $timer->getDescription();
|
$tbtimer["description"] = $timer->getDescription();
|
||||||
array_push($tbtimers, $tbtimer);
|
array_push($tbtimers, $tbtimer);
|
||||||
}
|
}
|
||||||
|
@@ -550,4 +550,136 @@ class ValidationController extends AbstractController
|
|||||||
return $this->redirectToRoute("app_validationholiday");
|
return $this->redirectToRoute("app_validationholiday");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function validationtimer(Request $request)
|
||||||
|
{
|
||||||
|
$em = $this->getDoctrine()->getManager();
|
||||||
|
|
||||||
|
$iduser=$this->get("session")->get("iduser");
|
||||||
|
|
||||||
|
if($iduser=="all") {
|
||||||
|
$users=$em->getRepository("App:User")->findAll();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$users=$em->getRepository("App:User")->findBy(["id"=>$iduser]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$tbtimers=[];
|
||||||
|
foreach($users as $user) {
|
||||||
|
if(in_array("ROLE_USER",$user->getRoles())) {
|
||||||
|
// Filtre par Service
|
||||||
|
if($this->get('session')->get('idservice')!="all") {
|
||||||
|
if($user->getService()->getId()!=$this->get('session')->get('idservice'))
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$tmp=[
|
||||||
|
"id" => $user->getId(),
|
||||||
|
"user" => $user,
|
||||||
|
"timers" => [],
|
||||||
|
"timerstodevalidate" => [],
|
||||||
|
];
|
||||||
|
|
||||||
|
// Timers à valider ou à dévalider
|
||||||
|
$timers = $em
|
||||||
|
->createQueryBuilder('timer')
|
||||||
|
->select('timer')
|
||||||
|
->from('App:Timer','timer')
|
||||||
|
->from('App:Task','task')
|
||||||
|
->Where('timer.user=:user')
|
||||||
|
->andWhere('timer.validate=:validate')
|
||||||
|
->andWhere('task=timer.task')
|
||||||
|
->setParameter('user',$user->getId())
|
||||||
|
->setParameter('validate',!($this->get("session")->get("activetimer")))
|
||||||
|
->getQuery()->getResult();
|
||||||
|
foreach($timers as $timer) {
|
||||||
|
|
||||||
|
$tbtimer["id"] = $timer->getId();
|
||||||
|
$tbtimer["taskname"] = $timer->getTask()->getDisplayname();
|
||||||
|
$tbtimer["user"] = $timer->getUser()->getUsername();
|
||||||
|
$tbtimer["start"] = $timer->getId();
|
||||||
|
$tbtimer["end"] = $timer->getId();
|
||||||
|
$tbtimer["duration"] = $timer->getDuration();
|
||||||
|
$tbtimer["activepenalty"] = $timer->getActivePenalty();
|
||||||
|
$tbtimer["additionalhour"] = $timer->getAdditionalHour();
|
||||||
|
$tbtimer["description"] = $timer->getDescription();
|
||||||
|
|
||||||
|
$tbtimer = [
|
||||||
|
"id"=>$timer->getId(),
|
||||||
|
"taskname"=>$timer->getTask()->getDisplayname(),
|
||||||
|
"user"=>$timer->getUser()->getUsername(),
|
||||||
|
"start"=>$timer->getId(),
|
||||||
|
"end"=>$timer->getId(),
|
||||||
|
"duration"=>$timer->getDuration(),
|
||||||
|
"activepenalty"=>$timer->getActivePenalty(),
|
||||||
|
"additionalhour"=>$timer->getAdditionalHour(),
|
||||||
|
"description"=>$timer->getDescription(),
|
||||||
|
"validate"=>$timer->getValidate(),
|
||||||
|
];
|
||||||
|
|
||||||
|
array_push($tmp["timers"],$tbtimer);
|
||||||
|
}
|
||||||
|
array_push($tbtimers,$tmp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if($request->query->get('fgprint')) {
|
||||||
|
$render = $this->renderView('Validation/validationtimer.html.twig',[
|
||||||
|
"useheader" => true,
|
||||||
|
"usesidebar" => ($this->getUser()),
|
||||||
|
"users" => $tbtimers,
|
||||||
|
"fgprint" => $request->query->get('fgprint'),
|
||||||
|
]);
|
||||||
|
|
||||||
|
return new PdfResponse(
|
||||||
|
$this->knpSnappy->getOutputFromHtml($render),
|
||||||
|
'validationhoraires.pdf'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return $this->render('Validation/validationtimer.html.twig',[
|
||||||
|
"useheader" => true,
|
||||||
|
"usesidebar" => ($this->getUser()),
|
||||||
|
"users" => $tbtimers
|
||||||
|
]);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function validatetimer(Request $request){
|
||||||
|
$em = $this->getDoctrine()->getManager();
|
||||||
|
|
||||||
|
// Récupération des variables envoyées en post
|
||||||
|
$id = $request->request->get('id');
|
||||||
|
$timer=$em->getRepository("App:Timer")->find($id);
|
||||||
|
if($timer) {
|
||||||
|
$timer->setValidate(true);
|
||||||
|
$em->persist($timer);
|
||||||
|
$em->flush();
|
||||||
|
$iduser=$this->get("session")->get("iduser");
|
||||||
|
$idtimer=$timer->getId();
|
||||||
|
}
|
||||||
|
|
||||||
|
$output=[];
|
||||||
|
return new Response(json_encode($output));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function devalidatetimer(Request $request){
|
||||||
|
$em = $this->getDoctrine()->getManager();
|
||||||
|
|
||||||
|
// Récupération des variables envoyées en post
|
||||||
|
$id = $request->request->get('id');
|
||||||
|
$timer=$em->getRepository("App:Timer")->find($id);
|
||||||
|
if($timer) {
|
||||||
|
$timer->setValidate(false);
|
||||||
|
$em->persist($timer);
|
||||||
|
$em->flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
$output=[];
|
||||||
|
return new Response(json_encode($output));
|
||||||
|
}
|
||||||
|
public function activetimer() {
|
||||||
|
$this->get('session')->set('activetimer',!$this->get('session')->get('activetimer'));
|
||||||
|
|
||||||
|
return $this->redirectToRoute("app_validationtimer");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -55,17 +55,30 @@ class Timer
|
|||||||
*/
|
*/
|
||||||
private $task;
|
private $task;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ORM\Column(name="activepenalty", type="boolean")
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private $activepenalty;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ORM\Column(name="additionalhour", type="boolean")
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private $additionalhour;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\Column(name="activepenalty", type="boolean")
|
* @ORM\Column(name="validate", type="boolean")
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
private $activepenalty;
|
private $validate;
|
||||||
|
|
||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
$this->start = new \DateTime();
|
$this->start = new \DateTime();
|
||||||
$this->end = new \DateTime();
|
$this->end = new \DateTime();
|
||||||
$this->duration = new \DateTime();
|
$this->duration = new \DateTime();
|
||||||
|
$this->validate = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getId(): ?int
|
public function getId(): ?int
|
||||||
@@ -157,4 +170,28 @@ class Timer
|
|||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getAdditionalHour(): ?bool
|
||||||
|
{
|
||||||
|
return $this->additionalhour;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setAdditionalHour(bool $additionalhour): self
|
||||||
|
{
|
||||||
|
$this->additionalhour = $additionalhour;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getValidate(): ?bool
|
||||||
|
{
|
||||||
|
return $this->validate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setValidate(bool $validate): self
|
||||||
|
{
|
||||||
|
$this->validate = $validate;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@@ -65,6 +65,12 @@ class TimerType extends AbstractType
|
|||||||
"choices" => ["Non"=>false, "Oui"=>true]
|
"choices" => ["Non"=>false, "Oui"=>true]
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
|
$builder->add("additionalhour",
|
||||||
|
ChoiceType::class,[
|
||||||
|
"label" => "Heures supplémentaires",
|
||||||
|
"choices" => ["Non"=>false, "Oui"=>true]
|
||||||
|
]
|
||||||
|
);
|
||||||
|
|
||||||
$builder->add('start',
|
$builder->add('start',
|
||||||
DateTimeType::class, [
|
DateTimeType::class, [
|
||||||
|
@@ -59,6 +59,7 @@
|
|||||||
{{ form_row(form.task) }}
|
{{ form_row(form.task) }}
|
||||||
{{ form_row(form.description) }}
|
{{ form_row(form.description) }}
|
||||||
{{ form_row(form.activepenalty) }}
|
{{ form_row(form.activepenalty) }}
|
||||||
|
{{ form_row(form.additionalhour) }}
|
||||||
{{ form_row(form.start) }}
|
{{ form_row(form.start) }}
|
||||||
{{ form_row(form.end) }}
|
{{ form_row(form.end) }}
|
||||||
{{ form_row(form.duration) }}
|
{{ form_row(form.duration) }}
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
{% block body %}
|
{% block body %}
|
||||||
Astreintes Actives
|
Astreintes Actives
|
||||||
Tâche;Active;Utilisateur;Début;Fin;Durée;Description;
|
Tâche;Astr.Act;H.Supp;Utilisateur;Début;Fin;Durée;Description;
|
||||||
{% for timer in timers %}
|
{% for timer in timers %}
|
||||||
{{timer.taskname}};{{timer.activepenalty}};{{timer.user}};{{timer.start|date("d/m/Y H:i")}};{{timer.end|date("d/m/Y H:i")}};{{timer.duration|date("H:i")}};{{timer.description}};
|
{{timer.taskname}};{{timer.activepenalty}};{{timer.additionalhour}};{{timer.user}};{{timer.start|date("d/m/Y H:i")}};{{timer.end|date("d/m/Y H:i")}};{{timer.duration|date("H:i")}};{{timer.description}};
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% endblock %}
|
{% endblock %}
|
@@ -37,7 +37,7 @@ SUIVI HORAIRE
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<a class="btn btn-success" href={{ path('app_timer_view') }}>Voir le calendrier</a>
|
<a class="btn btn-success" href={{ path('app_timer_view') }}>Voir le calendrier</a>
|
||||||
<a class="btn btn-success" href={{ path('app_timer_view') }}>Exporter Astreintes actives</a>
|
<a class="btn btn-success" href={{ path('app_timer_export_activepenalty') }}>Exporter Astreintes actives et heures supplémentaires</a>
|
||||||
<p></p>
|
<p></p>
|
||||||
<div class="dataTable_wrapper">
|
<div class="dataTable_wrapper">
|
||||||
<table class="table table-striped table-bordered table-hover small" id="dataTables" style="width:100%">
|
<table class="table table-striped table-bordered table-hover small" id="dataTables" style="width:100%">
|
||||||
@@ -57,6 +57,7 @@ SUIVI HORAIRE
|
|||||||
<td>{{ timer.task.displayname }}</td>
|
<td>{{ timer.task.displayname }}</td>
|
||||||
<td>
|
<td>
|
||||||
<span class="font-weight-bold">{{ timer.activepenalty ? "Astreinte active" : "" }}</span>
|
<span class="font-weight-bold">{{ timer.activepenalty ? "Astreinte active" : "" }}</span>
|
||||||
|
<span class="font-weight-bold">{{ timer.additionalhour ? "Heures supplémentaires" : "" }}</span>
|
||||||
<p>{{ timer.description }}</p>
|
<p>{{ timer.description }}</p>
|
||||||
</td>
|
</td>
|
||||||
<td>{{ timer.start|date("d/m/Y H:i") }}</td>
|
<td>{{ timer.start|date("d/m/Y H:i") }}</td>
|
||||||
|
159
src/schedule-2.0/templates/Validation/validationtimer.html.twig
Normal file
159
src/schedule-2.0/templates/Validation/validationtimer.html.twig
Normal file
@@ -0,0 +1,159 @@
|
|||||||
|
{% extends "base.html.twig" %}
|
||||||
|
|
||||||
|
{% block localstyle %}
|
||||||
|
{% if fgprint is defined and fgprint %}
|
||||||
|
table { font-size:10px;}
|
||||||
|
th,td {
|
||||||
|
border: 1px solid #37474F;
|
||||||
|
}
|
||||||
|
thead {
|
||||||
|
display: table-header-group;
|
||||||
|
}
|
||||||
|
tr { page-break-inside: avoid; }
|
||||||
|
.homecard {width: 100% }
|
||||||
|
{%endif%}
|
||||||
|
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block body %}
|
||||||
|
<h1 class="page-header">
|
||||||
|
VALIDATION HORAIRES
|
||||||
|
</h1>
|
||||||
|
|
||||||
|
<div class="custom-control custom-switch float-right">
|
||||||
|
<input type="checkbox" class="custom-control-input" id="switchactive" {% if app.session.get('activetimer') %} checked {% endif %}>
|
||||||
|
<label class="custom-control-label" for="switchactive">Horaires à Valider</label>
|
||||||
|
</div>
|
||||||
|
<div style="height:30px;">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="card homecard">
|
||||||
|
<div class="card-header">
|
||||||
|
{% if not app.session.get('activetimer') %}
|
||||||
|
Horaires à Dévalider
|
||||||
|
{% else %}
|
||||||
|
Horaires à Valider
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="card-body">
|
||||||
|
<div class="dataTable_wrapper">
|
||||||
|
<table class="table table-striped table-bordered table-hover small" id="dataTables" style="width:100%">
|
||||||
|
<thead>
|
||||||
|
<th class="no-print"></th>
|
||||||
|
<th width="150px">Utilisateur</th>
|
||||||
|
<th>Tâche</th>
|
||||||
|
<th>Description</th>
|
||||||
|
<th>Début</th>
|
||||||
|
<th>Fin</th>
|
||||||
|
<th>Durée</th>
|
||||||
|
</thead>
|
||||||
|
|
||||||
|
{% for user in users %}
|
||||||
|
{% for timer in user.timers %}
|
||||||
|
<tr id="row-{{timer.id}}">
|
||||||
|
<td class="no-print" style="vertical-align:middle">
|
||||||
|
{% if timer.validate %}
|
||||||
|
<i class="fa fa-thumbs-down validate-{{user.user.id}}" onClick="devalidate({{timer.id}})" style="cursor:pointer; color:red;"></i>
|
||||||
|
{% else %}
|
||||||
|
<i class="fa fa-thumbs-up validate-{{user.user.id}}" onClick="validate({{timer.id}})" style="cursor:pointer; color:green;"></i>
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
|
||||||
|
<td>
|
||||||
|
{{ user.user.displayname }}
|
||||||
|
</td>
|
||||||
|
|
||||||
|
<td>
|
||||||
|
{{ timer.taskname }}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<span class="font-weight-bold">{{ timer.activepenalty ? "Astreinte active" : "" }}</span>
|
||||||
|
<span class="font-weight-bold">{{ timer.additionalhour ? "Heures supplémentaires" : "" }}</span>
|
||||||
|
<p>{{ timer.description }}</p>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
{{ timer.start|date("d/m/Y H:i") }}
|
||||||
|
</td>
|
||||||
|
|
||||||
|
<td>
|
||||||
|
{{ timer.end|date("d/m/Y H:i") }}
|
||||||
|
</td>
|
||||||
|
|
||||||
|
<td>
|
||||||
|
{{ timer.duration|date("H:i") }}
|
||||||
|
</td>
|
||||||
|
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
{% endfor %}
|
||||||
|
{% endfor %}
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block localjavascript %}
|
||||||
|
$(document).ready(function() {
|
||||||
|
{% if not fgprint is defined or not fgprint %}
|
||||||
|
$('.table ').DataTable({
|
||||||
|
columnDefs: [ { "targets": "no-sort", "orderable": false }, { "targets": "no-string", "type" : "num" } ],
|
||||||
|
responsive: true,
|
||||||
|
iDisplayLength: 100,
|
||||||
|
order: [[ 1, "asc" ]]
|
||||||
|
});
|
||||||
|
{%else%}
|
||||||
|
$('#dataTables').removeClass("table table-striped table-bordered table-hover small dataTable no-footer");
|
||||||
|
{% endif %}
|
||||||
|
});
|
||||||
|
|
||||||
|
function myprint() {
|
||||||
|
href=document.location.href;
|
||||||
|
document.location.href=href+"?fgprint=true";
|
||||||
|
}
|
||||||
|
|
||||||
|
function validate(id) {
|
||||||
|
$.ajax({
|
||||||
|
type: "POST",
|
||||||
|
data: {
|
||||||
|
id: id,
|
||||||
|
},
|
||||||
|
url: "{{ path('app_validationtimer_validate') }}",
|
||||||
|
success: function (response) {
|
||||||
|
response=JSON.parse(response);
|
||||||
|
if(response.return=="KO") {
|
||||||
|
alert(response.error);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$("#row-"+id).remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function devalidate(id) {
|
||||||
|
$.ajax({
|
||||||
|
type: "POST",
|
||||||
|
data: {
|
||||||
|
id: id,
|
||||||
|
},
|
||||||
|
url: "{{ path('app_validationtimer_devalidate') }}",
|
||||||
|
success: function (response) {
|
||||||
|
response=JSON.parse(response);
|
||||||
|
if(response.return=="KO") {
|
||||||
|
alert(response.error);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$("#row-"+id).remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
$('#switchactive').change(function() {
|
||||||
|
window.location="{{ path('app_validationtimer_activetimer' )}}";
|
||||||
|
});
|
||||||
|
|
||||||
|
{% endblock %}
|
@@ -367,7 +367,7 @@
|
|||||||
|
|
||||||
<li class="last">
|
<li class="last">
|
||||||
<a href="{{path("app_holiday")}}">
|
<a href="{{path("app_holiday")}}">
|
||||||
<i class="fa fa-cocktail"></i>Mes Congés
|
<i class="fa fa-umbrella-beach"></i>Mes Congés
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
@@ -378,13 +378,19 @@
|
|||||||
|
|
||||||
<li>
|
<li>
|
||||||
<a href="{{path("app_validation")}}">
|
<a href="{{path("app_validation")}}">
|
||||||
<i class="fa fa-user"></i>Validation
|
<i class="fa fa-user-check"></i>Validation Calendrier
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li>
|
||||||
|
<a href="{{path("app_validationholiday")}}">
|
||||||
|
<i class="fa fa-user-tag"></i>Validation Congés
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li class="last">
|
<li class="last">
|
||||||
<a href="{{path("app_validationholiday")}}">
|
<a href="{{path("app_validationtimer")}}">
|
||||||
<i class="fa fa-suitcase"></i>Validation Congés
|
<i class="fa fa-user-clock"></i>Validation Horaires
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user