Files
ferrovia-panel/api/cron-attribution-h40.js
mathis d95924753c RELEASE V.4.0.0 : VERSION LONG SUPPORT (LTS)
--> Imports de ligne via fichier GTFS
--> Extrapolation possible des données
--> Générateur de fiches horaires
2026-09-30 21:29:11 +02:00

67 lines
3.3 KiB
JavaScript

import { createClient } from '@supabase/supabase-js';
import { buildMovements, executeAllocationAlgorithm } from '../src/utils/algorithmeQuais.js';
const supabaseUrl = process.env.NEXT_PUBLIC_SUPABASE_URL || process.env.SUPABASE_URL || "https://supabase-ferrovia.mrpatator.fr";
const supabaseKey = process.env.NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY || process.env.SUPABASE_ANON_KEY || "sb_publishable_6dB95QNDKiHcFD81TJETqq_3Mu5rWWU";
const supabase = createClient(supabaseUrl, supabaseKey);
export default async function handler(req, res) {
if (req.headers.authorization !== `Bearer ${process.env.CRON_SECRET}`) {
return res.status(401).end('Unauthorized');
}
try {
const today = new Date().toISOString().split('T')[0];
const { data: gares } = await supabase.from('gares').select('*');
if (!gares) return res.status(200).json({ message: "Aucune gare" });
const { data: horaires } = await supabase.from('horaires').select(`
*,
materiel_roulant ( id, nom ),
ligne_id
`).contains('jours_circulation', `[{"date": "${today}", "type": "jour"}]`);
const { data: perturbations } = await supabase.from('perturbations').select('*').contains('jours_perturbation', `[{"date": "${today}", "type": "jour"}]`);
const { data: regles } = await supabase.from('regles_quais').select('*');
for (const gare of gares) {
const reglesGare = (regles || []).filter(r => r.gare_id === gare.id);
const quaisLibres = (gare.gare_quais || []).filter(q => q.nom !== 'CG');
const movements = buildMovements(horaires || [], gare, perturbations || []);
// On filtre les mouvements pour ne garder que ceux qui se passent dans les prochaines heures ou pour revérification
// Pour simplifier et garantir la cohérence (chainage matériel), on repasse tout,
// mais on ne va appliquer les changements en BDD que pour les trains concernés (proche H-40)
const { blockUpdates, perturbationsToCreate } = executeAllocationAlgorithm(movements, quaisLibres, reglesGare);
for (const update of blockUpdates) {
const { data: currentHoraire } = await supabase.from('horaires').select('gares_desservies').eq('id', update.horaireId).single();
if (currentHoraire && currentHoraire.gares_desservies) {
const newDesservies = currentHoraire.gares_desservies.map(arret => {
if (String(arret.gare_id) === String(gare.id) || arret.gare_nom === gare.nom) {
return { ...arret, quai_reel: update.payload.depart || update.payload.arrivee || update.payload[arret.ordre] || arret.quai_reel };
}
return arret;
});
await supabase.from('horaires').update({ gares_desservies: newDesservies }).eq('id', update.horaireId);
}
}
for (const pert of perturbationsToCreate) {
const exists = perturbations.find(p => p.horaire_id === pert.horaire_id && p.cause === pert.cause);
if (!exists) {
await supabase.from('perturbations').insert([pert]);
}
}
}
return res.status(200).json({ success: true, message: "Vérification H-40 terminée." });
} catch (err) {
console.error(err);
return res.status(500).json({ error: err.message });
}
}