Début de journée indépendant de l'ordre des créneaux types
ci-cd / build-backend (push) Successful in 33s
ci-cd / build-frontend (push) Successful in 19s
ci-cd / deploy (push) Successful in 13s

La « journée de festival » commence désormais au début du plus long creux
laissé par les créneaux types sur 24 h (l'heure où le dernier se termine),
et non plus au début de celui de plus petit `order` : un créneau type
d'ordre 0 déplacé à 21:00 faisait commencer chaque journée des grilles à
21:00, jusqu'à 03:00 le lendemain. Même règle côté backend
(validation.engine.day_boundary, réutilisée par la génération de créneaux)
et frontend (dayBoundaryFromDayParts).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
AdamThomas
2026-10-05 20:48:14 +02:00
co-authored by Claude Opus 5.5
parent ee1f6ed72e
commit f671bb85bf
6 changed files with 170 additions and 25 deletions
+43 -1
View File
@@ -18,7 +18,7 @@ import type { AccountRead } from '@/api/schema';
import { queryKeys } from '@/api/hooks';
import { AuthContext, AuthProvider, type AuthContextValue } from '@/auth/auth-context';
import { routes } from '@/app/router';
import { buildTimeGrid, placeInTimeGrid } from '@/lib/planning';
import { buildTimeGrid, dayBoundaryFromDayParts, placeInTimeGrid } from '@/lib/planning';
import { BadgesPage } from '@/pages/BadgesPage';
import { ConfigPage } from '@/pages/ConfigPage';
import { FormBuilderPage } from '@/pages/FormBuilderPage';
@@ -424,7 +424,49 @@ function renderPublic(path: string) {
}
}
// Début de journée indépendant de `order` (régression : un créneau type
// d'ordre 0 déplacé à 21:00 faisait commencer chaque journée à 21:00 dans les
// grilles, jusqu'à 03:00 le lendemain) — miroir de
// backend/tests/test_validation_engine.py (day_boundary).
function checkDayBoundary() {
const cases: Array<[Parameters<typeof dayBoundaryFromDayParts>[0], string]> = [
[[], '00:00'],
[
[
{ start_time: '08:00:00', end_time: '13:00:00', order: 0 },
{ start_time: '13:00:00', end_time: '19:00:00', order: 1 },
{ start_time: '19:00:00', end_time: '02:00:00', order: 2 },
],
'02:00',
],
[
[
{ start_time: '21:00:00', end_time: '03:00:00', order: 0 },
{ start_time: '10:00:00', end_time: '21:00:00', order: 1 },
],
'03:00',
],
[
[
{ start_time: '06:00:00', end_time: '19:00:00', order: 1 },
{ start_time: '19:00:00', end_time: '06:00:00', order: 0 },
],
'19:00',
],
];
for (const [parts, expected] of cases) {
const got = dayBoundaryFromDayParts(parts);
if (got !== expected) throw new Error(`attendu ${expected}, obtenu ${got}`);
}
console.log(`ok ${'dayBoundary'.padEnd(26)} ${cases.length} cas`);
}
// --------------------------------------------------------------------------- //
try {
checkDayBoundary();
} catch (err) {
fail('checkDayBoundary', err);
}
await checkAuth().catch((err) => fail('checkAuth', err));
await checkPublicForm().catch((err) => fail('checkPublicForm', err));
await checkPositionSheets().catch((err) => fail('checkPositionSheets', err));