generated from knso/webklar-preview-template
1 version
This commit is contained in:
1 parent
f1165b5404
commit
88c49e1b54
39 files changed
+9328
-52
No files matched your search
@@ -0,0 +1,89 @@
|
||||
/**
|
||||
* Dringlichkeits-Ampel — bewusst LOKAL berechnet, nicht von der KI:
|
||||
* deterministisch, kostenlos, und immer aktuell relativ zu "heute"
|
||||
* (ein archivierter Brief wird automatisch roter, je näher die Frist rückt).
|
||||
*
|
||||
* 🔴 Rot = Frist/Termin in < 7 Tagen (oder bereits abgelaufen)
|
||||
* 🟡 Gelb = Frist/Termin in 7-21 Tagen
|
||||
* 🟢 Grün = keine Frist / rein informativ
|
||||
*/
|
||||
import { BriefAnalyse, Dringlichkeit } from '../types';
|
||||
import { farben } from '../theme';
|
||||
|
||||
export interface AmpelStatus {
|
||||
stufe: Dringlichkeit;
|
||||
/** Kurztext für die UI, z. B. "Frist in 3 Tagen". */
|
||||
text: string;
|
||||
farbe: string;
|
||||
hintergrund: string;
|
||||
}
|
||||
|
||||
/** Ganze Tage von heute bis zum ISO-Datum (negativ = vergangen). */
|
||||
export function tageBis(datumIso: string): number {
|
||||
const heute = new Date();
|
||||
heute.setHours(0, 0, 0, 0);
|
||||
const ziel = new Date(`${datumIso}T00:00:00`);
|
||||
return Math.round((ziel.getTime() - heute.getTime()) / 86400000);
|
||||
}
|
||||
|
||||
export function berechneAmpel(analyse: BriefAnalyse): AmpelStatus {
|
||||
const daten: { tage: number; label: string }[] = [];
|
||||
if (analyse.frist) {
|
||||
daten.push({ tage: tageBis(analyse.frist.datum), label: 'Frist' });
|
||||
}
|
||||
if (analyse.termin) {
|
||||
daten.push({ tage: tageBis(analyse.termin.datum), label: 'Termin' });
|
||||
}
|
||||
|
||||
if (daten.length === 0) {
|
||||
return {
|
||||
stufe: 'gruen',
|
||||
text: 'Keine Frist — nur zur Information',
|
||||
farbe: farben.ampelGruen,
|
||||
hintergrund: farben.ampelGruenHintergrund,
|
||||
};
|
||||
}
|
||||
|
||||
// Das dringendste (kleinste) Datum bestimmt die Ampel
|
||||
const dringendstes = daten.reduce((a, b) => (a.tage <= b.tage ? a : b));
|
||||
const { tage, label } = dringendstes;
|
||||
|
||||
if (tage < 0) {
|
||||
return {
|
||||
stufe: 'rot',
|
||||
text: `${label} abgelaufen (vor ${Math.abs(tage)} Tag${Math.abs(tage) === 1 ? '' : 'en'})! Schnell handeln.`,
|
||||
farbe: farben.ampelRot,
|
||||
hintergrund: farben.ampelRotHintergrund,
|
||||
};
|
||||
}
|
||||
if (tage === 0) {
|
||||
return {
|
||||
stufe: 'rot',
|
||||
text: `${label} ist HEUTE!`,
|
||||
farbe: farben.ampelRot,
|
||||
hintergrund: farben.ampelRotHintergrund,
|
||||
};
|
||||
}
|
||||
if (tage < 7) {
|
||||
return {
|
||||
stufe: 'rot',
|
||||
text: `${label} in ${tage} Tag${tage === 1 ? '' : 'en'} — dringend!`,
|
||||
farbe: farben.ampelRot,
|
||||
hintergrund: farben.ampelRotHintergrund,
|
||||
};
|
||||
}
|
||||
if (tage <= 21) {
|
||||
return {
|
||||
stufe: 'gelb',
|
||||
text: `${label} in ${tage} Tagen — bald erledigen`,
|
||||
farbe: farben.ampelGelb,
|
||||
hintergrund: farben.ampelGelbHintergrund,
|
||||
};
|
||||
}
|
||||
return {
|
||||
stufe: 'gruen',
|
||||
text: `${label} in ${tage} Tagen — genug Zeit`,
|
||||
farbe: farben.ampelGruen,
|
||||
hintergrund: farben.ampelGruenHintergrund,
|
||||
};
|
||||
}
|
||||
Reference in new issue
Block a user