Die Exportkarten nennen die ganze Auswahl, nicht nur den Status
Das Einschraenken der Downstream-Exporte gab es schon: exportHref reicht die ganze Adresszeile weiter, und ladeExportMitarbeiter wendet dieselben Kriterien an wie der Bericht daneben -- Eintritt ab, Austritt bis, Wochenstunden, Beschaeftigungsart und die uebrigen. Nur sah man es den Karten nicht an. Dort stand ausschliesslich der Status; alles andere steckt eingeklappt in "Weitere Kriterien" weiter oben. Damit sah eine Datei mit 40 Personen genauso aus wie eine mit 785. Fuer einen Bericht ist das aergerlich, fuer ein Load-File in ein Zielsystem ist es ein Datenstand, den dort niemand mehr hinterfragt: es fehlen Personen, und es sieht nicht nach einem Filter aus. Die drei Karten im Bestandsmodus zeigen jetzt Stichtag, Status, Einheit, Standort, jedes gesetzte Kriterium und die Zeilenzahl. beschreibeKriterien steht neben anzahlKriterien in derselben Datei und liest dieselben Listen -- ein neues Kriterium erscheint damit von selbst auch auf den Karten. Ein Test haelt beide gegeneinander, damit die Zahl am Aufklapper und der Text auf der Karte nicht auseinanderlaufen.
This commit is contained in:
@@ -13,6 +13,7 @@ import { fmtDate } from "@/lib/format";
|
||||
import {
|
||||
anzahlKriterien,
|
||||
AUSWAHL_KRITERIEN,
|
||||
beschreibeKriterien,
|
||||
JANEIN_KRITERIEN,
|
||||
kriterienParameter,
|
||||
ZEITRAUM_KRITERIEN,
|
||||
@@ -212,7 +213,8 @@ function KriterienBlock({
|
||||
</fieldset>
|
||||
|
||||
<p className="text-xs text-ink-muted">
|
||||
Alle Kriterien gelten für den Bericht <em>und</em> für beide Exporte.
|
||||
Alle Kriterien gelten für den Bericht <em>und</em> für jeden Export dieser Seite — auch für den
|
||||
Honestly- und den Cornerstone-Report. Was gerade eingestellt ist, steht auf der jeweiligen Karte.
|
||||
</p>
|
||||
</div>
|
||||
)}
|
||||
@@ -220,6 +222,27 @@ function KriterienBlock({
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Was gerade in die Datei geht — Stichtag, Status, Einheit, Standort und jedes
|
||||
* gesetzte Kriterium, dazu die Zeilenzahl.
|
||||
*
|
||||
* Auf den Karten stand nur der Status. Alles andere schränkt den Export
|
||||
* genauso ein, steht aber eingeklappt weiter oben: eine Datei mit 40 statt 785
|
||||
* Personen sah genauso aus wie eine vollständige. Für einen Bericht ist das
|
||||
* ärgerlich, für ein Load-File ins Zielsystem ist es ein Datenstand, den dort
|
||||
* niemand mehr hinterfragt.
|
||||
*/
|
||||
function AuswahlHinweis({ texte, anzahl }: { texte: string[]; anzahl: number }) {
|
||||
return (
|
||||
<div className="mb-2 rounded bg-surface px-2 py-1.5 text-xs text-ink-body">
|
||||
<span className="font-semibold">Auswahl:</span> {texte.join(" · ")}
|
||||
<span className="mt-0.5 block font-semibold">
|
||||
{anzahl} {anzahl === 1 ? "Person" : "Personen"}
|
||||
</span>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function formatValue(measure: Measure, value: number): string {
|
||||
if (measure === "headcount") return String(Math.round(value));
|
||||
if (measure === "fte") return value.toFixed(1);
|
||||
@@ -355,6 +378,20 @@ export function ReportsPageClient(props: ReportsPageClientProps) {
|
||||
const showWeekdayMultiCountNote = mode === "snapshot" && (props.group === "weekday" || props.split === "weekday");
|
||||
const selectedStatuses = mode === "snapshot" ? parseStatuses(props.filters.status) : [];
|
||||
const statusExportLabel = selectedStatuses.length === STATUS_OPTIONS.length ? "Alle" : selectedStatuses.join(", ");
|
||||
// Einheit und Standort stehen in der Adresszeile als Kennung; auf der Karte
|
||||
// hilft nur der Name.
|
||||
const einheitName = mode === "snapshot" ? units.find((u) => u.id === props.filters.division)?.name : undefined;
|
||||
const standortName = mode === "snapshot" ? locations.find((l) => l.id === props.filters.location)?.name : undefined;
|
||||
const auswahlTexte =
|
||||
mode === "snapshot"
|
||||
? [
|
||||
`Stichtag ${fmtDate(props.asOf || todayIso())}`,
|
||||
`Status ${statusExportLabel}`,
|
||||
...(einheitName ? [`Einheit ${einheitName}`] : []),
|
||||
...(standortName ? [`Standort ${standortName}`] : []),
|
||||
...beschreibeKriterien(props.criteria),
|
||||
]
|
||||
: [];
|
||||
const currentYear = new Date().getFullYear();
|
||||
const defaultEventFrom = `${currentYear}-01-01`;
|
||||
const defaultEventTo = `${currentYear}-12-31`;
|
||||
@@ -619,8 +656,8 @@ export function ReportsPageClient(props: ReportsPageClientProps) {
|
||||
<h3 className="mb-1 text-xs font-semibold uppercase tracking-wide text-ink-muted">Vollständiger Datenexport</h3>
|
||||
{mode === "snapshot" ? (
|
||||
<>
|
||||
<p className="mb-1 text-xs text-ink-muted">Alle Mitarbeiterdaten (nicht nur die Kennzahl){props.asOf ? ` zum Stichtag ${fmtDate(props.asOf)}` : ""}.</p>
|
||||
<p className="mb-2 rounded bg-surface px-2 py-1.5 text-xs font-semibold text-ink-body">Status im Export: {statusExportLabel}</p>
|
||||
<p className="mb-1 text-xs text-ink-muted">Alle Mitarbeiterdaten, nicht nur die Kennzahl.</p>
|
||||
<AuswahlHinweis texte={auswahlTexte} anzahl={recordCount} />
|
||||
</>
|
||||
) : (
|
||||
<p className="mb-2 text-xs text-ink-muted">Alle Ereignisse im gewählten Zeitraum als Rohdaten (eine Zeile pro Ereignis).</p>
|
||||
@@ -643,7 +680,7 @@ export function ReportsPageClient(props: ReportsPageClientProps) {
|
||||
{mode === "snapshot" && (
|
||||
<div className="rounded border border-border bg-white p-4">
|
||||
<h3 className="mb-1 text-xs font-semibold uppercase tracking-wide text-ink-muted">Honestly-Report</h3>
|
||||
<p className="mb-2 rounded bg-surface px-2 py-1.5 text-xs font-semibold text-ink-body">Status im Export: {statusExportLabel}</p>
|
||||
<AuswahlHinweis texte={auswahlTexte} anzahl={recordCount} />
|
||||
<div className="flex gap-2">
|
||||
<a href={exportHref("/api/export/honestly", "csv")} className={LINK_BUTTON_CLASS}>
|
||||
<FileText className="h-4 w-4" />
|
||||
@@ -665,7 +702,7 @@ export function ReportsPageClient(props: ReportsPageClientProps) {
|
||||
TT.MM.JJJJ, Systemwerte statt Anzeigenamen (Active, Working, Employee). Ohne Location ID und
|
||||
Position ID — dafür fehlen die Kennungen des Zielsystems.
|
||||
</p>
|
||||
<p className="mb-2 rounded bg-surface px-2 py-1.5 text-xs font-semibold text-ink-body">Status im Export: {statusExportLabel}</p>
|
||||
<AuswahlHinweis texte={auswahlTexte} anzahl={recordCount} />
|
||||
<div className="flex gap-2">
|
||||
<a href={exportHref("/api/export/cornerstone", "csv")} className={LINK_BUTTON_CLASS}>
|
||||
<FileText className="h-4 w-4" />
|
||||
|
||||
Reference in New Issue
Block a user