fix: calendar display nothing

This commit is contained in:
Nathan FONTEYNE 2026-07-08 16:26:23 +02:00
parent a09d16238b
commit 323ac4565c
3 changed files with 24 additions and 7 deletions

View file

@ -37,6 +37,8 @@ async function upsertPerson(client, name) {
async function ingestSlots(slots) {
const client = await pool.connect();
let availabilityRows = 0;
let availableTrueCount = 0;
let availableFalseCount = 0;
let slotsWithNoPeople = 0;
try {
await client.query('BEGIN');
@ -76,13 +78,16 @@ async function ingestSlots(slots) {
continue;
}
const personId = await upsertPerson(client, person.name);
const isAvailable = !!person.available;
if (isAvailable) availableTrueCount += 1;
else availableFalseCount += 1;
await client.query(
`INSERT INTO calendar_availability (slot_id, person_id, is_available, checked_at)
VALUES ($1, $2, $3, now())
ON CONFLICT (slot_id, person_id) DO UPDATE SET
is_available = excluded.is_available,
checked_at = excluded.checked_at`,
[slotId, personId, !!person.available]
[slotId, personId, isAvailable]
);
availabilityRows += 1;
}
@ -95,12 +100,18 @@ async function ingestSlots(slots) {
client.release();
}
const summary = { slotsProcessed: slots.length, availabilityRows, slotsWithNoPeople };
const summary = {
slotsProcessed: slots.length,
availabilityRows,
slotsWithNoPeople,
availableTrueCount,
availableFalseCount,
};
console.log('[calendar] ingest summary:', summary);
return summary;
}
async function getSlots({ minPeople = 1, personIds = null, weeks = 3 } = {}) {
async function getSlots({ minPeople = 0, personIds = null, weeks = 3 } = {}) {
const cappedWeeks = Math.min(weeks || 3, 3);
const now = new Date();
const end = new Date(now);

View file

@ -16,7 +16,10 @@ router.get(
router.get(
'/slots',
asyncHandler(async (req, res) => {
const minPeople = req.query.min_people !== undefined ? parseInt(req.query.min_people, 10) : 1;
// Default 0, not 1: with no filter the calendar should show every
// ingested slot (heat-colored by availability ratio on the frontend),
// not just slots where at least one person happens to be free.
const minPeople = req.query.min_people !== undefined ? parseInt(req.query.min_people, 10) : 0;
const weeks = req.query.weeks !== undefined ? parseInt(req.query.weeks, 10) : 3;
const personIds = req.query.person_ids
? req.query.person_ids.split(',').map(Number).filter((n) => !Number.isNaN(n))
@ -85,8 +88,9 @@ router.post('/refresh', (req, res) => {
const summary = await calendarRepo.ingestSlots(data.slots);
workflowState.setSuccess(
`${summary.slotsProcessed} créneaux reçus, ${summary.availabilityRows} disponibilités enregistrées` +
(summary.slotsWithNoPeople > 0 ? ` (${summary.slotsWithNoPeople} créneaux sans aucune personne — voir les logs serveur)` : '')
`${summary.slotsProcessed} créneaux reçus, ${summary.availabilityRows} disponibilités enregistrées ` +
`(${summary.availableTrueCount} dispo / ${summary.availableFalseCount} indispo)` +
(summary.slotsWithNoPeople > 0 ? `${summary.slotsWithNoPeople} créneaux sans aucune personne, voir les logs serveur` : '')
);
} catch (err) {
clearTimeout(watchdog);

View file

@ -23,7 +23,9 @@ router.post(
try {
const summary = await calendarRepo.ingestSlots(slots);
workflowState.setSuccess(
`${summary.slotsProcessed} créneaux reçus, ${summary.availabilityRows} disponibilités enregistrées`
`${summary.slotsProcessed} créneaux reçus, ${summary.availabilityRows} disponibilités enregistrées ` +
`(${summary.availableTrueCount} dispo / ${summary.availableFalseCount} indispo)` +
(summary.slotsWithNoPeople > 0 ? `${summary.slotsWithNoPeople} créneaux sans aucune personne, voir les logs serveur` : '')
);
res.json({ ok: true, ...summary });
} catch (err) {