Reapply "V1_Fonctionnel_GTAV1_GTA"

This reverts commit 244db6bfb6.
This commit is contained in:
2025-12-02 18:04:52 +01:00
parent 6f75a66906
commit 89d74363f8
55 changed files with 7567 additions and 5819 deletions

View File

@@ -96,7 +96,7 @@ const CompteRenduActivites = () => {
setIsLoading(true);
try {
const response = await fetch(`http://localhost:3000/getCompteRenduActivites?user_id=${userId}&annee=${annee}&mois=${mois}`);
const response = await fetch(`/api/getCompteRenduActivites?user_id=${userId}&annee=${annee}&mois=${mois}`);
const data = await response.json();
if (data.success) {
@@ -106,7 +106,7 @@ const CompteRenduActivites = () => {
console.log('📊 Détail des jours:', data.jours);
}
const congesResponse = await fetch(`http://localhost:3000/getTeamLeaves?user_id=${userId}&role=${user.role}`);
const congesResponse = await fetch(`/api/getTeamLeaves?user_id=${userId}&role=${user.role}`);
const congesData = await congesResponse.json();
if (congesData.success) {
@@ -125,7 +125,7 @@ const CompteRenduActivites = () => {
if (!userId || !hasAccess()) return;
try {
const response = await fetch(`http://localhost:3000/getStatsAnnuelles?user_id=${userId}&annee=${annee}`);
const response = await fetch(`/api/getStatsAnnuelles?user_id=${userId}&annee=${annee}`);
const data = await response.json();
if (data.success) {
@@ -163,22 +163,38 @@ const CompteRenduActivites = () => {
return selectedYear === previousYear && selectedMonth === previousMonth;
};
// Générer les jours du mois (lundi-vendredi)
// Générer les jours du mois (lundi-samedi) avec décalage correct
const getDaysInMonth = () => {
const year = currentDate.getFullYear();
const month = currentDate.getMonth();
const firstDay = new Date(year, month, 1);
const lastDay = new Date(year, month + 1, 0);
const daysInMonth = lastDay.getDate();
// Jour de la semaine du 1er (0=dimanche, 1=lundi, ..., 6=samedi)
let firstDayOfWeek = firstDay.getDay();
// Convertir pour que lundi = 0, mardi = 1, ..., samedi = 5, dimanche = 6
firstDayOfWeek = firstDayOfWeek === 0 ? 6 : firstDayOfWeek - 1;
const days = [];
// Ajouter des cases vides pour le décalage initial
for (let i = 0; i < firstDayOfWeek; i++) {
days.push(null);
}
// Ajouter tous les jours du mois (lundi-samedi uniquement)
for (let day = 1; day <= daysInMonth; day++) {
const currentDay = new Date(year, month, day);
const dayOfWeek = currentDay.getDay();
if (dayOfWeek >= 1 && dayOfWeek <= 5) {
// Exclure les dimanches (0)
if (dayOfWeek !== 0) {
days.push(currentDay);
}
}
return days;
};
@@ -235,6 +251,8 @@ const CompteRenduActivites = () => {
// Ouvrir le modal de saisie
const handleJourClick = (date) => {
if (!date) return; // Ignorer les cases vides
if (!isMoisAutorise() && !isRH) {
showInfo('Vous ne pouvez saisir que pour le mois en cours ou le mois précédent', 'warning');
return;
@@ -284,7 +302,7 @@ const CompteRenduActivites = () => {
setIsSaving(true);
try {
const response = await fetch('http://localhost:3000/saveCompteRenduJour', {
const response = await fetch('/api/saveCompteRenduJour', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
@@ -327,7 +345,7 @@ const CompteRenduActivites = () => {
setIsSaving(true);
try {
const response = await fetch('http://localhost:3000/saveCompteRenduMasse', {
const response = await fetch('/api/saveCompteRenduMasse', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
@@ -487,14 +505,7 @@ const CompteRenduActivites = () => {
<p className="text-sm opacity-90">Jours travaillés</p>
<p className="text-3xl font-bold">{statsAnnuelles.totalJoursTravailles || 0}</p>
</div>
<div className="bg-white bg-opacity-20 rounded-lg p-4">
<p className="text-sm opacity-90">Non-respect repos quotidien</p>
<p className="text-3xl font-bold">{statsAnnuelles.totalNonRespectQuotidien || 0}</p>
</div>
<div className="bg-white bg-opacity-20 rounded-lg p-4">
<p className="text-sm opacity-90">Non-respect repos hebdo</p>
<p className="text-3xl font-bold">{statsAnnuelles.totalNonRespectHebdo || 0}</p>
</div>
</div>
</div>
)}
@@ -552,23 +563,30 @@ const CompteRenduActivites = () => {
<span className="hidden sm:inline">Saisie en masse</span>
</button>
</div>
</div>
</div>
{/* Calendrier */}
<div className="bg-white rounded-lg border overflow-hidden shadow-sm">
<div className="grid grid-cols-5 gap-2 p-4 bg-gray-50">
{['Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi'].map(day => (
<div className="grid grid-cols-6 gap-2 p-4 bg-gray-50">
{['Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi'].map(day => (
<div key={day} className="text-center font-semibold text-gray-700 text-sm">
{day}
</div>
))}
</div>
<div className="grid grid-cols-5 gap-2 p-4">
<div className="grid grid-cols-6 gap-2 p-4">
{days.map((date, index) => {
// Case vide pour le décalage
if (date === null) {
return (
<div key={`empty-${index}`} className="min-h-[100px] p-3"></div>
);
}
const jourData = getJourData(date);
const enConge = isJourEnConge(date);
const ferie = isHoliday(date);
@@ -707,17 +725,7 @@ const CompteRenduActivites = () => {
</h3>
<div className="space-y-4">
<div>
<label className="flex items-center gap-3 cursor-pointer">
<input
type="checkbox"
checked={selectedJour.jourTravaille}
onChange={(e) => setSelectedJour({ ...selectedJour, jourTravaille: e.target.checked })}
className="w-5 h-5 text-blue-600 rounded"
/>
<span className="text-gray-700 font-medium">Jour travaillé</span>
</label>
</div>
{selectedJour.jourTravaille && (
<>
@@ -815,7 +823,7 @@ const CompteRenduActivites = () => {
<SaisieMasseModal
mois={mois}
annee={annee}
days={days}
days={days.filter(d => d !== null)} // Filtrer les cases vides
congesData={congesData}
holidays={holidays}
onClose={() => setShowSaisieMasse(false)}
@@ -894,6 +902,30 @@ const SaisieMasseModal = ({ mois, annee, days, congesData, holidays, onClose, on
onSave(joursTravailles);
};
// Générer les jours avec décalage pour la saisie en masse aussi
const getDaysWithOffset = () => {
const year = annee;
const month = mois - 1;
const firstDay = new Date(year, month, 1);
let firstDayOfWeek = firstDay.getDay();
firstDayOfWeek = firstDayOfWeek === 0 ? 6 : firstDayOfWeek - 1;
const daysWithOffset = [];
// Ajouter des cases vides pour le décalage
for (let i = 0; i < firstDayOfWeek; i++) {
daysWithOffset.push(null);
}
// Ajouter les jours réels
daysWithOffset.push(...days);
return daysWithOffset;
};
const daysWithOffset = getDaysWithOffset();
return (
<div className="fixed inset-0 bg-black bg-opacity-50 z-50 flex items-center justify-center p-4">
<div className="bg-white rounded-xl shadow-xl max-w-4xl w-full p-6 max-h-[90vh] overflow-y-auto">
@@ -915,8 +947,15 @@ const SaisieMasseModal = ({ mois, annee, days, congesData, holidays, onClose, on
Sélectionner tous les jours ouvrés disponibles
</button>
<div className="grid grid-cols-5 gap-2 mb-6">
{days.map((date, index) => {
<div className="grid grid-cols-6 gap-2 p-4">
{daysWithOffset.map((date, index) => {
// Case vide
if (date === null) {
return (
<div key={`empty-${index}`} className="p-3"></div>
);
}
const dateStr = formatDateToString(date);
const enConge = isJourEnConge(date);
const ferie = isHoliday(date);