This commit is contained in:
Louis Mazin 2026-09-25 17:17:08 +02:00
parent 0fd446fc24
commit 030893089d
2 changed files with 28 additions and 31 deletions

View File

@ -1299,7 +1299,7 @@ const TimeClockPage = () => {
'Une sortie sans entrée existe',
confirmationMessage:
"Voulez-vous indiquer la date et l’heure de l’entrée manquante, puis enregistrer le nouveau pointage ?",
"Voulez-vous indiquer la date et l’heure de l’entrée manquante, puis enregistrer la sortie scannée ?",
timeLabel:
"Heure d'entrée",
@ -1347,12 +1347,16 @@ const TimeClockPage = () => {
}
if (!conflictDate || !conflictTime) {
setError('Indiquez la date et l’heure du pointage manquant.');
setError(config.timeLabel === 'Heure de sortie'
? 'Indiquez la date et l’heure de la sortie manquante.'
: 'Indiquez la date et l’heure de l’entrée manquante.');
return;
}
if (scanConflict.scanDate && conflictDate > scanConflict.scanDate) {
setError('Le pointage manquant ne peut pas être postérieur au scan.');
setError(config.timeLabel === 'Heure de sortie'
? 'La sortie renseignée ne peut pas être postérieure à l’entrée scannée.'
: 'L’entrée renseignée ne peut pas être postérieure à la sortie scannée.');
return;
}
@ -1378,12 +1382,12 @@ const TimeClockPage = () => {
scanConflict.scanTime;
}
const resolutionResponse = await timeApi.scanTimeEntry(scanConflict.code, options);
await timeApi.scanTimeEntry(scanConflict.code, options);
resolved = true;
// complete_missing_entry renseigne l'entrée et applique déjà la sortie scannée.
if (scanConflict.type === 'missing_entry') {
setScanMessage(resolutionResponse.message || 'Sortie enregistrée.');
setScanMessage('Entrée renseignée et sortie enregistrée.');
setScanConflict(null);
await loadTimeEntries();
return;
@ -1397,12 +1401,14 @@ const TimeClockPage = () => {
if (scanConflict.scanTime) {
scanOptions.scan_time = scanConflict.scanTime;
}
const response = await timeApi.scanTimeEntry(
await timeApi.scanTimeEntry(
scanConflict.code,
scanOptions,
);
setScanMessage(response.message || 'Pointage enregistré.');
setScanMessage(scanConflict.type === 'open_entry'
? 'Sortie renseignée et entrée enregistrée.'
: 'Entrée renseignée et sortie enregistrée.');
setScanConflict(null);
await loadTimeEntries();
} catch (
@ -1414,8 +1420,8 @@ const TimeClockPage = () => {
}
setError(
resolved
? `Le conflit a été résolu, mais le nouveau pointage n’a pas été enregistré : ${resolutionError.message}`
: resolutionError.message,
? `${scanConflict.type === 'open_entry' ? 'La sortie a été renseignée, mais la nouvelle entrée n’a pas été enregistrée' : 'L’entrée manquante a été renseignée, mais la sortie scannée n’a pas été enregistrée'} : ${resolutionError.message || 'erreur inconnue'}`
: `Impossible de ${scanConflict.type === 'open_entry' ? 'renseigner la sortie manquante' : 'renseigner l’entrée manquante et enregistrer la sortie'} : ${resolutionError.message || 'erreur inconnue'}`,
);
} finally {
setResolvingConflict(false);
@ -2415,17 +2421,6 @@ const TimeClockPage = () => {
</div>
{editingEntry.isGrouped && (
<p className="mb-4 text-xs text-muted-foreground">
Les dates d’un pointage
multi-jours sont liées au
groupe. Seules les heures
peuvent être modifiées ici.
</p>
)}
<div className="flex flex-col gap-2 sm:flex-row">
<Button type="submit">

View File

@ -744,23 +744,23 @@ const WeeklySummaryPage = ({ userId }) => {
*/
const getScheduleBounds = (
weekDays,
visibleDays,
) => {
const weekDateKeys =
const visibleDateKeys =
new Set(
weekDays.map(
visibleDays.map(
formatDateKey,
),
);
const weekAttendances =
const visibleAttendances =
getFilteredAttendances(
expandOvernightAttendances(
attendances,
),
).filter(
(attendance) =>
weekDateKeys.has(
visibleDateKeys.has(
String(
attendance.start_date,
).slice(0, 10),
@ -768,7 +768,7 @@ const WeeklySummaryPage = ({ userId }) => {
);
const times =
weekAttendances
visibleAttendances
.flatMap(
(attendance) => [
getMinutes(
@ -1027,7 +1027,7 @@ const WeeklySummaryPage = ({ userId }) => {
endHour,
} =
getScheduleBounds(
weekDays,
isMobile ? [weekDays[selectedDayIndex]] : weekDays,
);
const hourCount =
@ -1179,7 +1179,7 @@ const WeeklySummaryPage = ({ userId }) => {
variant="outline"
size="sm"
onClick={() => navigateWeek(-1)}
className="flex items-center gap-1"
className="flex shrink-0 items-center gap-1"
>
<ChevronLeft className="h-4 w-4" />
Précédente
@ -1187,7 +1187,7 @@ const WeeklySummaryPage = ({ userId }) => {
<Badge
variant="secondary"
className="text-sm"
className="h-7 w-56 shrink-0 justify-center whitespace-nowrap text-sm tabular-nums"
>
Du{' '}
{weekDays[0].toLocaleDateString('fr-FR', {
@ -1205,7 +1205,7 @@ const WeeklySummaryPage = ({ userId }) => {
variant="outline"
size="sm"
onClick={() => navigateWeek(1)}
className="flex items-center gap-1"
className="flex shrink-0 items-center gap-1"
>
Suivante
<ChevronRight className="h-4 w-4" />
@ -1219,13 +1219,14 @@ const WeeklySummaryPage = ({ userId }) => {
variant="outline"
size="sm"
onClick={() => navigateDay(-1)}
className="shrink-0"
>
<ChevronLeft className="h-4 w-4" />
</Button>
<Badge
variant="secondary"
className="text-sm"
className="h-7 w-48 shrink-0 justify-center whitespace-nowrap text-sm tabular-nums"
>
{weekDays[selectedDayIndex].toLocaleDateString(
'fr-FR',
@ -1241,6 +1242,7 @@ const WeeklySummaryPage = ({ userId }) => {
variant="outline"
size="sm"
onClick={() => navigateDay(1)}
className="shrink-0"
>
<ChevronRight className="h-4 w-4" />
</Button>