calcul progression
This commit is contained in:
parent
2bbc7153c6
commit
c81affd3e3
8 changed files with 275 additions and 50 deletions
|
@ -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 %}
|
Loading…
Add table
Add a link
Reference in a new issue