affichage_liste_contrat_employer #41

Open
fatima wants to merge 3 commits from affichage_liste_contrat_employer into main
9 changed files with 153 additions and 7 deletions

View File

@@ -260,4 +260,77 @@ const listeContratExpirant = new Tabulator("#listeContratExpirant", {
}, },
], ],
ajaxURL: $("boutonContratExpirants").dataset.urlexpirants, ajaxURL: $("boutonContratExpirants").dataset.urlexpirants,
}) })
let tabContrats = null;
document.getElementById("modalContratsEmploye")
.addEventListener("show.bs.modal", function () {
const employeId = document.getElementById("detail-id").value;
console.log("Employe ID :", employeId);
if (!employeId) {
alert("Aucun employé sélectionné");
return;
}
fetch(`/employé/employe/${employeId}/contrats/`)
.then(response => {
if (!response.ok) {
throw new Error("Erreur HTTP " + response.status);
}
return response.json();
})
.then(data => {
document.getElementById("nom-employe-contrat").innerText =
data.employe;
if (tabContrats) {
tabContrats.destroy();
}
tabContrats = new Tabulator(
"#table-contrats-tabulator",
{
data: data.contrats,
layout: "fitColumns",
placeholder: "Aucun contrat",
columns: [
{ title: "Numéro", field: "numero_contrat" },
{ title: "Type", field: "type_contrat" },
{ title: "Date début", field: "date_debut" },
{ title: "Date fin", field: "date_fin" },
{ title: "Salaire", field: "salaire_mensuel" },
{ title: "Statut", field: "statut" },
{
title: "Contrat",
field: "fichier",
formatter: function(cell) {
const url = cell.getValue();
if (!url) {
return "<span class='text-danger'>Aucun fichier</span>";
}
return `<a href="${url}" target="_blank" class="btn btn-sm btn-primary">
<i class="bi bi-file-earmark-pdf"></i> Ouvrir
</a>`;
}
}
]
}
);
})
.catch(error => {
console.error("Erreur :", error);
});
});

View File

@@ -24,7 +24,6 @@ enregistrerProfil.addEventListener("click", (e) => {
const csrftoken = document.querySelector("[name='csrfmiddlewaretoken']").value; const csrftoken = document.querySelector("[name='csrfmiddlewaretoken']").value;
const formData = new FormData(); const formData = new FormData();
formData.append("nom", $("nom").value); formData.append("nom", $("nom").value);
formData.append("prenom", $("prenom").value); formData.append("prenom", $("prenom").value);
formData.append("email", $("email").value); formData.append("email", $("email").value);
@@ -32,6 +31,10 @@ enregistrerProfil.addEventListener("click", (e) => {
formData.append("adresse", $("adresse").value); formData.append("adresse", $("adresse").value);
formData.append("sexe", $("sexe").value); formData.append("sexe", $("sexe").value);
formData.append("date_naissance", $("date_naissance").value); formData.append("date_naissance", $("date_naissance").value);
const photoInput = $("photo");
if (photoInput.files.length > 0) {
formData.append("photo", photoInput.files[0]);
}
fetch(url, { fetch(url, {
method: "POST", method: "POST",

View File

@@ -58,6 +58,7 @@
{% block 'modal' %} {% block 'modal' %}
{% include "gestion_employe/parts/modalDetailEmploye.html" %} {% include "gestion_employe/parts/modalDetailEmploye.html" %}
{% include "gestion_employe/parts/modalCreationContrat.html" %} {% include "gestion_employe/parts/modalCreationContrat.html" %}
{% include "gestion_employe/parts/modalContratsEmploye.html" %}
{% include "gestion_employe/parts/modalAffectationProjet.html" %} {% include "gestion_employe/parts/modalAffectationProjet.html" %}
{% include "gestion_employe/parts/modalDocument.html" %} {% include "gestion_employe/parts/modalDocument.html" %}
{% include "gestion_employe/parts/modalListeContratExpirants.html" %} {% include "gestion_employe/parts/modalListeContratExpirants.html" %}

View File

@@ -0,0 +1,21 @@
<div class="modal fade" id="modalContratsEmploye" tabindex="-1">
<div class="modal-dialog modal-xl">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">
Contrats de <span id="nom-employe-contrat"></span>
</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
</div>
<div class="modal-body">
<div id="table-contrats-tabulator"></div>
</div>
</div>
</div>
</div>

View File

@@ -93,8 +93,8 @@
</h5> </h5>
{% if user|has_group:"ressource_humaine" %} {% if user|has_group:"ressource_humaine" %}
<div> <div>
<button class="btn btn-secondary" disabled> <button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#modalContratsEmploye">
<i class="bi bi-file-earmark-lock"></i> Contrat actif Liste contrat
</button> </button>
<button type="button" class="btn btn-success" data-bs-toggle="modal" data-bs-target="#modalContrat{{ item.employe.id }}"> <button type="button" class="btn btn-success" data-bs-toggle="modal" data-bs-target="#modalContrat{{ item.employe.id }}">
<i class="bi bi-file-earmark-text"></i> Créer contrat <i class="bi bi-file-earmark-text"></i> Créer contrat

View File

@@ -29,11 +29,17 @@ urlpatterns = [
views.creation_contrat, views.creation_contrat,
name='creation-contrat' name='creation-contrat'
), ),
path(
'employe/<int:employe_id>/contrats/'
, views.contrats_employe,
name="contrats-employe"
),
path( path(
'contrat/supprimer/', 'contrat/supprimer/',
views.suppression_contrat, views.suppression_contrat,
name='supprimer-contrat' name='supprimer-contrat'
), ),
path( path(
'Affectation/affectation/', 'Affectation/affectation/',
views.affecter_employe_projet, views.affecter_employe_projet,

View File

@@ -191,7 +191,7 @@ def modifier_employer(request):
except Employe.DoesNotExist: except Employe.DoesNotExist:
return JsonResponse({"message": "Employé non trouvé."}) return JsonResponse({"message": "Employé non trouvé."})
if request.method == "POST": if request.method == "POST":
data = json.loads(request.body) data = request.POST
user = User.objects.get(username=request.user) user = User.objects.get(username=request.user)
user.last_name = data['nom'] user.last_name = data['nom']
user.first_name = data['prenom'] user.first_name = data['prenom']
@@ -289,6 +289,45 @@ def creation_contrat(request):
'contrat_form': form 'contrat_form': form
}) })
@login_required
def contrats_employe(request, employe_id):
try:
employe = Employe.objects.get(id=employe_id)
except Employe.DoesNotExist:
return JsonResponse(
{"error": "Employé non trouvé"},
status=404
)
contrats = Contrat.objects.filter(
employe=employe
).order_by("-date_debut")
data = [
{
"id": contrat.id,
"numero_contrat": contrat.numero_contrat,
"type_contrat": dict(Contrat.TYPE_CONTRAT).get(
contrat.type_contrat
),
"date_debut": contrat.date_debut.strftime("%Y-%m-%d"),
"date_fin": contrat.date_fin.strftime("%Y-%m-%d") if contrat.date_fin else "",
"salaire_mensuel": contrat.salaire_mensuel,
"statut": dict(Contrat.STATUT_CONTRAT).get(
contrat.statut
),
"fichier": contrat.fichier_contrat.url if contrat.fichier_contrat else "",
}
for contrat in contrats
]
return JsonResponse({
"employe": employe.user.get_full_name(),
"contrats": data
})
@login_required @login_required
def enregistrer_detail_employe(request): def enregistrer_detail_employe(request):
"""Vue pour permettre à un utilisateur de modifier les détails d'un employé via une requête AJAX""" """Vue pour permettre à un utilisateur de modifier les détails d'un employé via une requête AJAX"""
@@ -307,6 +346,7 @@ def enregistrer_detail_employe(request):
else: else:
return JsonResponse({"message": "Méthode non autorisée."}, status=405) return JsonResponse({"message": "Méthode non autorisée."}, status=405)
@login_required @login_required
def liste_employe(request): def liste_employe(request):
""" Vue pour retourner la liste de tous les employés """ """ Vue pour retourner la liste de tous les employés """

View File

@@ -21,7 +21,8 @@ const calendrier = Schedule(document.getElementById('planning-reservation'), {
$("employe").value=data.employe; $("employe").value=data.employe;
$("salle").value=data.salle; $("salle").value=data.salle;
$("statut-reservation").innerHTML=data.statut; $("statut-reservation").innerHTML=data.statut;
$("date_evenement").value=data.date_evenement; $("date_debut").value=data.date_debut;
$("date_fin").value=data.date_fin;
$("heure_debut").value=data.heure_debut; $("heure_debut").value=data.heure_debut;
$("heure_fin").value=data.heure_fin; $("heure_fin").value=data.heure_fin;
$("motif_reservation").value=data.motif_reservation; $("motif_reservation").value=data.motif_reservation;

View File

@@ -153,7 +153,8 @@ def detail_reservation(request:HttpRequest, reservation_id:int):
'employe': f"{employe.first_name} {employe.last_name}", 'employe': f"{employe.first_name} {employe.last_name}",
'salle': reservation.salle, 'salle': reservation.salle,
'statut': dict(Reservation.STATUT).get(reservation.statut), 'statut': dict(Reservation.STATUT).get(reservation.statut),
'date_evenement': reservation.date_debut.strftime('%Y-%m-%d'), 'date_debut': reservation.date_debut.strftime('%Y-%m-%d'),
'date_fin': reservation.date_fin.strftime('%Y-%m-%d'),
'heure_debut': reservation.heure_debut.strftime('%H:%M'), 'heure_debut': reservation.heure_debut.strftime('%H:%M'),
'heure_fin': reservation.heure_fin.strftime('%H:%M'), 'heure_fin': reservation.heure_fin.strftime('%H:%M'),
'motif_reservation': reservation.motif_reservation, 'motif_reservation': reservation.motif_reservation,