calcul progression

This commit is contained in:
Tykayn 2025-07-05 10:29:53 +02:00 committed by tykayn
parent 2bbc7153c6
commit c81affd3e3
8 changed files with 275 additions and 50 deletions

View file

@ -101,28 +101,99 @@ if (canvas) {
// Affichage de la progression sur une semaine
function getDelta(data, days) {
if (!data.length) return null;
const now = new Date(data[data.length - 1].x);
const refDate = new Date(now.getTime() - days * 24 * 60 * 60 * 1000);
let ref = null;
const last = data[data.length - 1].y;
// Chercher la mesure exacte à la date de référence
let exactRef = null;
for (let i = data.length - 1; i >= 0; i--) {
const d = new Date(data[i].x);
if (d <= refDate) {
ref = data[i].y;
exactRef = data[i].y;
break;
}
}
const last = data[data.length - 1].y;
return ref !== null ? last - ref : null;
// Si on a trouvé une mesure exacte, l'utiliser
if (exactRef !== null) {
return last - exactRef;
}
// Sinon, chercher les deux mesures les plus proches pour faire une interpolation
let beforeRef = null;
let afterRef = null;
let beforeDate = null;
let afterDate = null;
// Chercher la mesure juste avant la date de référence
for (let i = data.length - 1; i >= 0; i--) {
const d = new Date(data[i].x);
if (d < refDate) {
beforeRef = data[i].y;
beforeDate = d;
break;
}
}
// Chercher la mesure juste après la date de référence
for (let i = 0; i < data.length; i++) {
const d = new Date(data[i].x);
if (d > refDate) {
afterRef = data[i].y;
afterDate = d;
break;
}
}
// Si on a les deux mesures, faire une interpolation linéaire
if (beforeRef !== null && afterRef !== null && beforeDate !== null && afterDate !== null) {
const timeDiff = afterDate.getTime() - beforeDate.getTime();
const refTimeDiff = refDate.getTime() - beforeDate.getTime();
const ratio = refTimeDiff / timeDiff;
const interpolatedRef = beforeRef + (afterRef - beforeRef) * ratio;
return last - interpolatedRef;
}
// Si on n'a qu'une mesure avant, l'utiliser
if (beforeRef !== null) {
return last - beforeRef;
}
// Si on n'a qu'une mesure après, l'utiliser
if (afterRef !== null) {
return last - afterRef;
}
// Si aucune mesure n'est disponible, retourner null
return null;
}
function formatDelta(val) {
if (val === null) return 'Pas de données';
if (val === 0) return '0';
return (val > 0 ? '+' : '') + val;
}
const delta7dCount = getDelta(countData, 7);
const delta7dCompletion = getDelta(completionData, 7);
const infoDiv = document.createElement('div');
infoDiv.className = 'mt-3 alert ' + (delta7dCount === null ? 'alert-secondary' : 'alert-info');
infoDiv.innerHTML = `<strong>Progression sur 7 jours :</strong> ${delta7dCount === null ? '<span title="Données insuffisantes pour calculer la progression">Aucune donnée</span>' : (delta7dCount > 0 ? '+' + delta7dCount : delta7dCount === 0 ? '0' : delta7dCount)}`;
let progressionText = '';
if (delta7dCount === null) {
progressionText = '<span title="Données insuffisantes pour calculer la progression">Aucune donnée</span>';
} else {
const countText = delta7dCount > 0 ? '+' + delta7dCount : delta7dCount === 0 ? '0' : delta7dCount;
const completionText = delta7dCompletion !== null ?
(delta7dCompletion > 0 ? '+' + delta7dCompletion.toFixed(1) : delta7dCompletion === 0 ? '0' : delta7dCompletion.toFixed(1)) + '%' :
'N/A';
progressionText = `${countText} objets, ${completionText} complétion`;
}
infoDiv.innerHTML = `<strong>Progression sur 7 jours :</strong> ${progressionText}`;
canvas.parentNode.appendChild(infoDiv);
</script>
{% endblock %}