nice
This commit is contained in:
parent
e2800c3d57
commit
30eab16473
@ -195,6 +195,9 @@ const TimeClockPage = () => {
|
|||||||
.slice(0, 5),
|
.slice(0, 5),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const [conflictDate, setConflictDate] = useState(getTodayValue());
|
||||||
|
const [resolvingConflict, setResolvingConflict] = useState(false);
|
||||||
|
|
||||||
const [
|
const [
|
||||||
error,
|
error,
|
||||||
setError,
|
setError,
|
||||||
@ -1212,6 +1215,10 @@ const TimeClockPage = () => {
|
|||||||
nowTime,
|
nowTime,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
setConflictDate(
|
||||||
|
scanError.scanDate || getTodayValue(),
|
||||||
|
);
|
||||||
|
|
||||||
setScanConflict({
|
setScanConflict({
|
||||||
code,
|
code,
|
||||||
type:
|
type:
|
||||||
@ -1254,7 +1261,7 @@ const TimeClockPage = () => {
|
|||||||
'Une entrée est déjà ouverte',
|
'Une entrée est déjà ouverte',
|
||||||
|
|
||||||
confirmationMessage:
|
confirmationMessage:
|
||||||
'Vous avez déjà pointer une entrée, voulez vous saisir son heure de sortie ?',
|
'Une entrée est déjà ouverte. Voulez-vous indiquer sa date et son heure de sortie, puis enregistrer la nouvelle entrée ?',
|
||||||
|
|
||||||
timeLabel:
|
timeLabel:
|
||||||
'Heure de sortie',
|
'Heure de sortie',
|
||||||
@ -1273,7 +1280,7 @@ const TimeClockPage = () => {
|
|||||||
'Aucune entrée ouverte',
|
'Aucune entrée ouverte',
|
||||||
|
|
||||||
confirmationMessage:
|
confirmationMessage:
|
||||||
'Vous n\avez pas pointer d\'entrée, voulez vous poursuivre et indiquer l\'heure d\'entrée ?',
|
'Aucune entrée ouverte. Voulez-vous indiquer la date et l’heure de l’entrée manquante, puis enregistrer cette sortie ?',
|
||||||
|
|
||||||
timeLabel:
|
timeLabel:
|
||||||
"Heure d'entrée",
|
"Heure d'entrée",
|
||||||
@ -1292,7 +1299,7 @@ const TimeClockPage = () => {
|
|||||||
'Une sortie sans entrée existe',
|
'Une sortie sans entrée existe',
|
||||||
|
|
||||||
confirmationMessage:
|
confirmationMessage:
|
||||||
"Voulez-vous renseigner l’heure d’entrée ?",
|
"Voulez-vous indiquer la date et l’heure de l’entrée manquante, puis enregistrer le nouveau pointage ?",
|
||||||
|
|
||||||
timeLabel:
|
timeLabel:
|
||||||
"Heure d'entrée",
|
"Heure d'entrée",
|
||||||
@ -1328,7 +1335,7 @@ const TimeClockPage = () => {
|
|||||||
|
|
||||||
const resolveScanConflict =
|
const resolveScanConflict =
|
||||||
async () => {
|
async () => {
|
||||||
if (!scanConflict) {
|
if (!scanConflict || resolvingConflict) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1339,14 +1346,28 @@ const TimeClockPage = () => {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!conflictDate || !conflictTime) {
|
||||||
|
setError('Indiquez la date et l’heure du pointage manquant.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (scanConflict.scanDate && conflictDate > scanConflict.scanDate) {
|
||||||
|
setError('Le pointage manquant ne peut pas être postérieur au scan.');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
setError('');
|
setError('');
|
||||||
|
|
||||||
|
setResolvingConflict(true);
|
||||||
|
|
||||||
|
let resolved = false;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const options = {
|
const options = {
|
||||||
resolution:
|
resolution:
|
||||||
config.resolution,
|
config.resolution,
|
||||||
time: conflictTime,
|
time: conflictTime,
|
||||||
scan_date: scanConflict.scanDate,
|
scan_date: conflictDate,
|
||||||
entry_id: scanConflict.entryId,
|
entry_id: scanConflict.entryId,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1357,25 +1378,39 @@ const TimeClockPage = () => {
|
|||||||
scanConflict.scanTime;
|
scanConflict.scanTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
const response =
|
await timeApi.scanTimeEntry(scanConflict.code, options);
|
||||||
await timeApi.scanTimeEntry(
|
resolved = true;
|
||||||
|
|
||||||
|
// La résolution ne rejoue pas le scan qui a déclenché le conflit.
|
||||||
|
const scanOptions = {};
|
||||||
|
if (scanConflict.scanDate) {
|
||||||
|
scanOptions.scan_date = scanConflict.scanDate;
|
||||||
|
}
|
||||||
|
if (scanConflict.scanTime) {
|
||||||
|
scanOptions.scan_time = scanConflict.scanTime;
|
||||||
|
}
|
||||||
|
const response = await timeApi.scanTimeEntry(
|
||||||
scanConflict.code,
|
scanConflict.code,
|
||||||
options,
|
scanOptions,
|
||||||
);
|
|
||||||
|
|
||||||
setScanMessage(
|
|
||||||
response.message,
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
setScanMessage(response.message || 'Pointage enregistré.');
|
||||||
setScanConflict(null);
|
setScanConflict(null);
|
||||||
|
|
||||||
await loadTimeEntries();
|
await loadTimeEntries();
|
||||||
} catch (
|
} catch (
|
||||||
resolutionError
|
resolutionError
|
||||||
) {
|
) {
|
||||||
|
if (resolved) {
|
||||||
|
setScanConflict(null);
|
||||||
|
await loadTimeEntries();
|
||||||
|
}
|
||||||
setError(
|
setError(
|
||||||
resolutionError.message,
|
resolved
|
||||||
|
? `Le conflit a été résolu, mais le nouveau pointage n’a pas été enregistré : ${resolutionError.message}`
|
||||||
|
: resolutionError.message,
|
||||||
);
|
);
|
||||||
|
} finally {
|
||||||
|
setResolvingConflict(false);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -1950,6 +1985,17 @@ const TimeClockPage = () => {
|
|||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div className="grid grid-cols-[140px_minmax(0,1fr)] items-center gap-3">
|
<div className="grid grid-cols-[140px_minmax(0,1fr)] items-center gap-3">
|
||||||
|
<Label>
|
||||||
|
{scanConflictConfig.timeLabel === 'Heure de sortie'
|
||||||
|
? 'Date de sortie'
|
||||||
|
: "Date d'entrée"}
|
||||||
|
</Label>
|
||||||
|
|
||||||
|
<DatePicker
|
||||||
|
value={conflictDate}
|
||||||
|
onChange={setConflictDate}
|
||||||
|
/>
|
||||||
|
|
||||||
<Label>
|
<Label>
|
||||||
{
|
{
|
||||||
scanConflictConfig.timeLabel
|
scanConflictConfig.timeLabel
|
||||||
@ -1973,6 +2019,7 @@ const TimeClockPage = () => {
|
|||||||
onClick={
|
onClick={
|
||||||
cancelScanConflict
|
cancelScanConflict
|
||||||
}
|
}
|
||||||
|
disabled={resolvingConflict}
|
||||||
>
|
>
|
||||||
Annuler
|
Annuler
|
||||||
</Button>
|
</Button>
|
||||||
@ -1982,8 +2029,9 @@ const TimeClockPage = () => {
|
|||||||
onClick={
|
onClick={
|
||||||
resolveScanConflict
|
resolveScanConflict
|
||||||
}
|
}
|
||||||
|
disabled={resolvingConflict}
|
||||||
>
|
>
|
||||||
Enregistrer
|
{resolvingConflict ? 'Enregistrement…' : 'Résoudre et pointer'}
|
||||||
</Button>
|
</Button>
|
||||||
</div>
|
</div>
|
||||||
</>
|
</>
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user