285 lines
14 KiB
HTML
285 lines
14 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="fr">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>Suivi des Paiements des Professeurs</title>
|
|
<link rel="stylesheet" href="https://www.w3schools.com/w3css/4/w3.css">
|
|
<link rel="stylesheet" href="../../css/CHEF/chef_departement.css">
|
|
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
|
|
<style>
|
|
.container {
|
|
margin: 20px;
|
|
}
|
|
.filter-input {
|
|
width: 300px;
|
|
margin-bottom: 20px;
|
|
}
|
|
.pagination {
|
|
margin-top: 20px;
|
|
display: flex;
|
|
justify-content: center;
|
|
}
|
|
.pagination button {
|
|
margin: 0 5px;
|
|
}
|
|
|
|
.filter-container {
|
|
display: flex; /* Utilise flexbox pour aligner les filtres */
|
|
gap: 10px; /* Espace entre les filtres */
|
|
}
|
|
|
|
.w3-select {
|
|
width: 250px; /* Largeur fixe pour les sélecteurs */
|
|
padding: 8px; /* Espacement intérieur pour rendre le texte lisible */
|
|
}
|
|
|
|
/* Optionnel : ajuster le style des bordures et fonds */
|
|
.w3-border {
|
|
border-color: #ccc; /* Couleur de la bordure */
|
|
}
|
|
</style>
|
|
</head>
|
|
|
|
<body class="w3-light-grey">
|
|
|
|
<div class="header w3-bar w3-card-4 w3-dark-blue">
|
|
<!-- Logo pour retourner à l'accueil -->
|
|
<div class="logo-container w3-bar-item">
|
|
<img src="../../media/img/logoWhite.png" alt="Logo Accueil" class="w3-image" style="width:150px; height:40px;">
|
|
</div>
|
|
|
|
<!-- Bouton burger pour petit écran -->
|
|
<a href="javascript:void(0)" class="w3-bar-item w3-button w3-hide-large w3-right w3-padding-16" onclick="toggleMenu()">☰</a>
|
|
|
|
<!-- Catégories dans le header -->
|
|
<div id="menu" class="categories w3-hide-small w3-hide-medium w3-bar-item">
|
|
<a href="./chef_departement.html" class="w3-bar-item w3-button">Accueil</a>
|
|
<a href="./gestion-heures-professeur.html" class="w3-bar-item w3-button">Professeurs</a>
|
|
<a href="./vacataire.html" class="w3-bar-item w3-button">Vacation</a>
|
|
<a href="./gestion-heures-formation.html" class="w3-bar-item w3-button">Formations</a>
|
|
<a href="./paiement.html" class="w3-bar-item w3-button">Paiements</a>
|
|
<a href="./budget.html" class="w3-bar-item w3-button">Budget</a>
|
|
<a href="./mes-informations.html" class="w3-bar-item w3-button">Mes informations</a>
|
|
</div>
|
|
|
|
<!-- Section utilisateur avec déconnexion -->
|
|
<div class="user-section w3-right w3-hide-small w3-hide-medium">
|
|
<div class="user-name">
|
|
Florent MADELAINE
|
|
</div>
|
|
<div class="logout-container w3-bar-item">
|
|
<a href="./notifications.html" title="Notifications">
|
|
<img src="../../media/img/notifs.png" alt="Logo notification" style="width:24px; height:24px;">
|
|
</a>
|
|
<a href="./settings.html" title="Paramètres">
|
|
<img src="../../media/img/settings.png" alt="Logo paramètres" style="width:24px; height:24px;">
|
|
</a>
|
|
<a href="../../index.html" title="Se déconnecter">
|
|
<img src="../../media/img/LogOutWhite.png" alt="Logo Déconnexion" style="width:24px; height:24px;">
|
|
</a>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Menu mobile caché au départ -->
|
|
<div id="mobileMenu" class="w3-bar-block w3-hide w3-hide-large w3-dark-blue">
|
|
<a href="./chef_departement.html" class="w3-bar-item w3-button">Accueil</a>
|
|
<a href="./gestion-heures-professeur.html" class="w3-bar-item w3-button">Professeurs</a>
|
|
<a href="./vacataire.html" class="w3-bar-item w3-button">Vacation</a>
|
|
<a href="./gestion-heures-formation.html" class="w3-bar-item w3-button">Formations</a>
|
|
<a href="./paiement.html" class="w3-bar-item w3-button">Paiements</a>
|
|
<a href="./budget.html" class="w3-bar-item w3-button">Budget</a>
|
|
<a href="./mes-informations.html" class="w3-bar-item w3-button">Mes informations</a>
|
|
|
|
<!-- Section utilisateur pour mobile -->
|
|
<div class="w3-bar-item w3-border-top w3-margin-top">
|
|
<div class="user-name">Florent MADELAINE</div>
|
|
<a href="./notifications.html" title="Notifications">
|
|
<img src="../../media/img/notifs.png" alt="Logo notification" style="width:24px; height:24px;">
|
|
</a>
|
|
<a href="./settings.html" title="Paramètres">
|
|
<img src="../../media/img/settings.png" alt="Logo paramètres" style="width:24px; height:24px;">
|
|
</a>
|
|
<a href="../../index.html" title="Se déconnecter">
|
|
<img src="../../media/img/LogOutWhite.png" alt="Logo Déconnexion" style="width:24px; height:24px;">
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="container w3-card w3-white w3-padding">
|
|
<h2>Suivi des Paiements des Professeurs</h2>
|
|
|
|
<select id="contractTypeFilter" class="w3-select w3-border" onchange="filterTable()">
|
|
<option value="">Tous les contrats</option>
|
|
<option value="Permanent">Permanents</option>
|
|
<option value="Vacataire">Vacataires</option>
|
|
</select>
|
|
|
|
<select id="paymentStatusFilter" class="w3-select w3-border" onchange="filterTable()">
|
|
<option value="">Tous les statuts de paiement</option>
|
|
<option value="En attente">En attente</option>
|
|
<option value="Validé">Validé</option>
|
|
<option value="Refusé">Refusé</option>
|
|
</select>
|
|
|
|
<input type="text" id="searchInput" style="margin-top: 10px;" class="filter-input w3-input w3-border" placeholder="Rechercher par nom de professeur..." oninput="filterTable()">
|
|
|
|
<div class="w3-responsive">
|
|
<table class="w3-table w3-bordered w3-striped w3-white">
|
|
<thead>
|
|
<tr class="w3-light-grey">
|
|
<th>Nom Professeur</th>
|
|
<th>Statut</th>
|
|
<th>Période</th>
|
|
<th>Heures Payées</th>
|
|
<th>Type Heure</th>
|
|
<th>Montant Brut (€)</th>
|
|
<th>Montant Net (€)</th>
|
|
<th>Date de Paiement</th>
|
|
<th>Statut de Paiement</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody id="paymentTableBody">
|
|
<!-- Les paiements seront ajoutés ici dynamiquement -->
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
|
|
<div class="pagination">
|
|
<button class="w3-button w3-green w3-round" id="prevBtn" onclick="changePage(-1)">Précédent</button>
|
|
<span id="pageInfo"></span>
|
|
<button class="w3-button w3-green w3-round" id="nextBtn" onclick="changePage(1)">Suivant</button>
|
|
</div>
|
|
|
|
<h3>Graphique des Paiements</h3>
|
|
<canvas id="paymentsChart" width="300" height="150"></canvas>
|
|
</div>
|
|
|
|
<script>
|
|
const rowsPerPage = 7;
|
|
let currentPage = 1;
|
|
|
|
const payments = [
|
|
{ name: 'Denis MONNERAT', status: 'Permanent', period: 'Janvier 2024', hoursPaid: 40, hourType: 'TD/TP', grossAmount: 3000, netAmount: 2400, paymentDate: '2024-01-31', paymentStatus: 'Validé' },
|
|
{ name: 'Denis MONNERAT', status: 'Permanent', period: 'Février 2024', hoursPaid: 35, hourType: 'CM/TD', grossAmount: 2750, netAmount: 2200, paymentDate: '2024-02-29', paymentStatus: 'En attente' },
|
|
{ name: 'Denis MONNERAT', status: 'Permanent', period: 'Mars 2024', hoursPaid: 38, hourType: 'CM/TD/TP', grossAmount: 2900, netAmount: 2320, paymentDate: '2024-03-31', paymentStatus: 'Validé' },
|
|
{ name: 'Maxime MENAULT', status: 'Vacataire', period: 'Janvier 2024', hoursPaid: 20, hourType: 'TP', grossAmount: 1000, netAmount: 800, paymentDate: '2024-01-31', paymentStatus: 'Validé' },
|
|
{ name: 'Maxime MENAULT', status: 'Vacataire', period: 'Février 2024', hoursPaid: 18, hourType: 'TP', grossAmount: 900, netAmount: 720, paymentDate: '2024-02-29', paymentStatus: 'Refusé' },
|
|
{ name: 'Maxime MENAULT', status: 'Vacataire', period: 'Mars 2024', hoursPaid: 22, hourType: 'TP', grossAmount: 1100, netAmount: 880, paymentDate: '2024-03-31', paymentStatus: 'Validé' },
|
|
{ name: 'Luc Hernandez', status: 'Permanent', period: 'Janvier 2024', hoursPaid: 45, hourType: 'CM/TD/Suivi', grossAmount: 3250, netAmount: 2600, paymentDate: '2024-01-31', paymentStatus: 'En attente' },
|
|
{ name: 'Luc Hernandez', status: 'Permanent', period: 'Février 2024', hoursPaid: 40, hourType: 'CM/TP', grossAmount: 3000, netAmount: 2400, paymentDate: '2024-02-29', paymentStatus: 'Validé' },
|
|
{ name: 'Luc Hernandez', status: 'Permanent', period: 'Mars 2024', hoursPaid: 42, hourType: 'TD/TP/Suivi', grossAmount: 3100, netAmount: 2480, paymentDate: '2024-03-31', paymentStatus: 'Refusé' },
|
|
{ name: 'Chloé Lefebvre', status: 'Vacataire', period: 'Janvier 2024', hoursPaid: 25, hourType: 'CM', grossAmount: 1200, netAmount: 960, paymentDate: '2024-01-31', paymentStatus: 'Validé' },
|
|
{ name: 'Chloé Lefebvre', status: 'Vacataire', period: 'Février 2024', hoursPaid: 20, hourType: 'CM', grossAmount: 1000, netAmount: 800, paymentDate: '2024-02-29', paymentStatus: 'En attente' },
|
|
{ name: 'Chloé Lefebvre', status: 'Vacataire', period: 'Mars 2024', hoursPaid: 30, hourType: 'CM', grossAmount: 1500, netAmount: 1200, paymentDate: '2024-03-31', paymentStatus: 'Validé' },
|
|
];
|
|
|
|
function renderTable() {
|
|
const tableBody = document.getElementById('paymentTableBody');
|
|
tableBody.innerHTML = '';
|
|
const filteredPayments = filterPayments();
|
|
const startIndex = (currentPage - 1) * rowsPerPage;
|
|
const endIndex = startIndex + rowsPerPage;
|
|
const currentPayments = filteredPayments.slice(startIndex, endIndex);
|
|
|
|
currentPayments.forEach(payment => {
|
|
const row = document.createElement('tr');
|
|
row.innerHTML = `
|
|
<td>${payment.name}</td>
|
|
<td>${payment.status}</td>
|
|
<td>${payment.period}</td>
|
|
<td>${payment.hoursPaid}</td>
|
|
<td>${payment.hourType}</td>
|
|
<td>${payment.grossAmount}</td>
|
|
<td>${payment.netAmount}</td>
|
|
<td>${payment.paymentDate}</td>
|
|
<td>${payment.paymentStatus}</td>
|
|
`;
|
|
tableBody.appendChild(row);
|
|
});
|
|
|
|
updatePagination(filteredPayments.length);
|
|
updateChart(filteredPayments);
|
|
}
|
|
|
|
function filterPayments() {
|
|
const contractType = document.getElementById('contractTypeFilter').value;
|
|
const paymentStatus = document.getElementById('paymentStatusFilter').value;
|
|
const searchValue = document.getElementById('searchInput').value.toLowerCase();
|
|
|
|
return payments.filter(payment => {
|
|
const matchesContract = !contractType || payment.status === contractType;
|
|
const matchesStatus = !paymentStatus || payment.paymentStatus === paymentStatus;
|
|
const matchesSearch = payment.name.toLowerCase().includes(searchValue);
|
|
return matchesContract && matchesStatus && matchesSearch;
|
|
});
|
|
}
|
|
|
|
function updatePagination(totalFiltered) {
|
|
const pageInfo = document.getElementById('pageInfo');
|
|
const totalPages = Math.ceil(totalFiltered / rowsPerPage);
|
|
pageInfo.innerText = `Page ${currentPage} sur ${totalPages}`;
|
|
document.getElementById('prevBtn').disabled = currentPage === 1;
|
|
document.getElementById('nextBtn').disabled = currentPage === totalPages;
|
|
}
|
|
|
|
function changePage(direction) {
|
|
currentPage += direction;
|
|
renderTable();
|
|
}
|
|
|
|
function updateChart(filteredPayments) {
|
|
const permanentPayments = filteredPayments.filter(p => p.status === 'Permanent');
|
|
const temporaryPayments = filteredPayments.filter(p => p.status === 'Vacataire');
|
|
|
|
const permanentTotal = permanentPayments.reduce((sum, p) => sum + p.netAmount, 0);
|
|
const temporaryTotal = temporaryPayments.reduce((sum, p) => sum + p.netAmount, 0);
|
|
|
|
const ctx = document.getElementById('paymentsChart').getContext('2d');
|
|
const chart = new Chart(ctx, {
|
|
type: 'bar',
|
|
data: {
|
|
labels: ['Permanents', 'Vacataires'],
|
|
datasets: [{
|
|
label: 'Montant Net (€)',
|
|
data: [permanentTotal, temporaryTotal],
|
|
backgroundColor: ['rgba(54, 162, 235, 0.6)', 'rgba(255, 99, 132, 0.6)']
|
|
}]
|
|
},
|
|
options: {
|
|
responsive: true,
|
|
scales: {
|
|
y: {
|
|
beginAtZero: true,
|
|
title: {
|
|
display: true,
|
|
text: 'Montant Net (€)'
|
|
}
|
|
}
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
function filterTable() {
|
|
currentPage = 1; // Reset to the first page on filter change
|
|
renderTable();
|
|
}
|
|
|
|
// Initial render
|
|
renderTable();
|
|
</script>
|
|
<script>
|
|
function toggleMenu() {
|
|
var x = document.getElementById("mobileMenu");
|
|
if (x.className.indexOf("w3-show") == -1) {
|
|
x.className += " w3-show";
|
|
} else {
|
|
x.className = x.className.replace(" w3-show", "");
|
|
}
|
|
}
|
|
</script>
|
|
</body>
|
|
</html>
|