---
title: MZ4 Module KPI (Charts + Export) — Reverse-Engineering-Doku
date: 2026-06-30
status: aktiv
type: project
tags: [reverse-engineering, vsm, mz4, kpi-reporting]
---

# MZ4 KPI Reporting — Reverse-Engineering-Doku

Zwei Sub-Module unter Reporting > KPI Reporting:
- `mz4_kpi_charts` — interaktive Diagramm-Ansicht (26 KB HTML)
- `mz4_kpi_export` — Excel-Export + tägliche Backups (111 KB HTML, davon ~90 KB Backup-Tabelle)

---

## 1. KPI Charts Modul (`mz4_kpi_charts`)

### 1.1 Charting Library

**AnyChart.js** — eingebunden via `/js/anychart/anychart.min.js?20251024`.
Lizenzschlüssel im HTML: `interligent.de-5c4881cf-ae08e217`.
API-Stil: `anychart.onDocumentLoad(callback)`, `anychart.line()`, `.column()`, `anychart.data.set([...])`, `data.mapAs({x, value, fill})`.
Chart-Container: `<div id="CH{UUID}">` mit fixierter Höhe `700px`.

### 1.2 Zehn Analyse-Bereiche (KPIs)

Selektor `Analysebereich` (name=`chart`):

| Wert | Label | Typ (aus Chart-1-Daten erkennbar) |
|------|-------|----------------------------------|
| 1 | 1. MITARBEITEREINSATZQUOTE VOR ORT | Line + Column combo |
| 2 | 2. MITARBEITEREINSATZ BEIM KUNDEN NACH AUFTRAGSTYP | unbekannt (keine Daten sichtbar) |
| 3 | 3. ANZAHL AKTIVER AUFTRÄGE | unbekannt |
| 13 | 4. ÜBERSICHT ÜBER ABGESCHLOSSENE AUFTRÄGE | unbekannt (PDF-Export deaktiviert) |
| 4 | 5. ANZAHL ABGESCHLOSSENER AUFTRÄGE | unbekannt |
| 5 | 6. KUNDENZUFRIEDENHEIT | unbekannt |
| 6 | 7. OEE-VERBESSERUNG IN %-PUNKTEN / STEIGERUNG SCHICHTAUSBRINGUNG | unbekannt |
| 7 | 8. IDENTIFIZIERTE KOSTENPOTENZIALE | unbekannt |
| 8 | 9. INVESTVERMEIDUNG | unbekannt |
| 14 | 10. ZDSC Campus | unbekannt, nur KPI-Board MO-2 WSM verfügbar |

Hinweis: Nur Chart 1 ist im HTML vollständig gerendert (aktuell ausgewählter Analysebereich). Alle anderen Charts werden nach Filter-Submit server-seitig gerendert.

### 1.3 Filter / Eingaben

Alle drei Filter im selben `<form method="get">`, Submit via Button "Absenden".

#### Filter 1: Analysebereich
- Element: `<select>` id=`chartNavigation`, name=`chart`
- Trigger: `onchange="chartIdChanged(this.value)"` — steuert Sichtbarkeit im Abteilungs-Dropdown und PDF-Button
- Standardwert: `1` (MITARBEITEREINSATZQUOTE VOR ORT)
- Optionen: 10 Werte, siehe Tabelle oben

#### Filter 2: Jahr
- Element: `<select>` id=`yearNavigation`, name=`year`
- Optionen: 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026
- Standardwert: 2026 (aktuelles Jahr)
- Daten in Chart 1 reichen zurück bis 2021 (Jahresdurchschnitte) + monatliche Werte für lfd. Jahr

#### Filter 3: Abteilung (KPI-Board)
- Element: `<select>` id=`departmentNavigation`, name=`chart_kpiboard`
- Standardwert: `1` (MO-2 WSM)
- Verfügbare Optionen je nach gewähltem Analysebereich (gesteuert durch `chartIdChanged`):

| Wert | Label | Sichtbar bei Chart-IDs |
|------|-------|----------------------|
| 1 | MO-2 WSM | 1,2,3,4,5,6,7,8,13,14 (alle) |
| 9 | MO-20 | Default (kein Chart-Match) |
| 2 | MO-2 UK | 1,2,3,4,5,6,7,8,13 |
| 3 | MO-22 | 1,2,3,4,5,6,7,8,13 |
| 4 | MO-23 | 1,2,3,4,5,6,7,8,13 |
| 10 | MO-24 | 1,2,3,4,5,6,7,8,13 |
| 7 | nur MO-2 | Default (kein Chart-Match) |
| 5 | MN-14 | 1,2,3,4,5,6,7,8,13 |
| 6 | MC-14 | 1,2,3,4,5,6,7,8,13 |
| 8 | MN-90 | 1,2,3,4,5,6,7,8,13 |

KPI-Board-Mapping aus JS-Array `chartKpiBoardIds`:
- Charts 1,2,3,4,5,6,7,8,13 → erlaubte Board-IDs: [1,2,3,4,10,5,6,8]
- Chart 14 → nur Board-ID [1]
- Kein Eintrag (Default) → [1,9,2,3,4,10,7,5,6,8] (alle)

### 1.4 Buttons / Aktionen

| Button | Typ | Funktion |
|--------|-----|----------|
| Absenden | `<input type="submit">` | Lädt Seite neu mit gewählten Filterparametern |
| PDF (einzeln) | `<a>` mit `fa-file-pdf-o` Icon | Öffnet PDF für aktuellen Chart |
| PDF (alle) | `<a>` mit `fa-files-o` Icon | Öffnet PDF aller Charts des gewählten Jahres |

PDF-Export ausgeblendet bei Chart 13: `$('#ExportSingleChartPDFContainer').hide()`.

### 1.5 URL-Endpunkte

#### Seitenaufruf (GET-Form)
```
index.php?modul=mz4_kpi_charts
  &sessionkey={KEY}
  &chart={chart_id}
  &year={YYYY}
  &chart_kpiboard={board_id}
```

#### PDF-Export einzelner Chart
```
/pdf.php
  ?modul=mz4_kpi_charts
  &sessionkey={KEY}
  &sessionid={SESSION_ID}
  &chart={chart_id}
  &printType=single
  &pdfGeneration=true
  &year={YYYY}
  &pdfEngine=wkpdf
  &chart_kpiboard={board_id}
  &name=chart_{YYYYMMDD}
```

#### PDF-Export alle Charts
```
/pdf.php
  ?modul=mz4_kpi_charts
  &sessionkey={KEY}
  &sessionid={SESSION_ID}
  &chart={chart_id}
  &printType=single
  &multiChartPdf=true
  &year={YYYY}
  &pdfGeneration=true
  &pdfEngine=wkpdf
  &name=chart_{YYYYMMDD}
```
Kein `chart_kpiboard`-Parameter bei Mehrfach-PDF (ANNAHME: Server iteriert alle Boards).

### 1.6 Detail-Dokumentation Chart 1: MITARBEITEREINSATZQUOTE VOR ORT

#### Definition
- "Als 'vor Ort' zählt die Abwesenheitskategorie 1."
- "100% entspricht den Arbeitstagen aller Kategorien, ohne die Abwesenheitskategorien 4, 5."
- "Betrachtet werden alle Rollen."

Abwesenheitskategorien (aus Seiten-Panel):
1. Kundenauftrag Durchführung
2. Kundenauftrag Vor-/Nachbereitung
3. Methoden, Prozesse, Standards
4. Weiterbildung
5. Persönliche Abwesenheit

#### Formel (ANNAHME)
```
Einsatzquote % = (Tage Kategorie 1) / (Arbeitstage gesamt - Tage Kat. 4 - Tage Kat. 5) * 100
```

Zielbereich: 60% ± 5% (untere Grenze 55%, obere Grenze 65%).

#### Chart-Typ
AnyChart Line-Column-Kombination. Vier Serien:

| Serie | Visualisierung | Farbe | Legende-Label |
|-------|---------------|-------|---------------|
| data1 (column0) | Line | #f19100 (Orange) | Ø Mitarbeitereinsatzquote per Monat |
| data2 (column1) | Line gestrichelt | #92d050 (Hellgrün) | Ziel (60±5%) — obere Grenze |
| data3 (column2) | Line gestrichelt | #92d050 (Hellgrün) | (kein Label, untere Grenzlinie) |
| data4 (column3) | Column (Balken) | #2b3c55 (Dunkelblau) | Mitarbeitereinsatzquote pro Monat |

Spalten-Werte in Legende: Orange = Ø/Durchschnitt, Grün = Ziellinie, Dunkelblau = Monatswert.

#### Datenpunkte (Live-Daten aus 2026, Board MO-2 WSM)

X-Achse enthält zwei Kategorien-Typen in einem Datensatz:
1. Jahresdurchschnitte: 2021, 2022, 2023, 2024, 2025, 2026
2. Monatswerte: Jan, Feb, Mrz, Apr, Mai, Juni, Jul..Dez

Beispiel-Datentabelle (so wie im HTML vorhanden):

| X-Label | Ø/Monat (orange) | Ziel-oben (grün) | Ziel-unten (grün) | Monatswert (blau) |
|---------|-----------------|------------------|-------------------|-------------------|
| 2021 | null | 65 | 55 | 53 |
| 2022 | null | 65 | 55 | 68 |
| 2023 | null | 65 | 55 | 69 |
| 2024 | null | 65 | 55 | 71 |
| 2025 | null | 5 | -5 | null |
| 2026 | null | 5 | -5 | 76,07 |
| Jan | 70,77 | 65 | 55 | 70,77 |
| Feb | 76,64 | 65 | 55 | 82,51 |
| Mrz | 78,00 | 65 | 55 | 80,72 |
| Apr | 77,71 | 65 | 55 | 76,85 |
| Mai | 78,00 | 65 | 55 | 79,14 |
| Juni | 76,07 | 65 | 55 | 66,42 |
| Jul-Dez | null | 5 | -5 | null |

Hinweis: Zielwerte 5/-5 für Future-Months und noch nicht abgeschlossene Jahre = Platzhalterwerte, damit die Linie nicht über die bisher belegten X-Positionen hinaus gezeichnet wird (ANNAHME).

Range Marker: grauer Hintergrund (#e1ded7 mit 0,5 Opacity) von "2021" bis "2026" auf X-Achse.

Y-Achse: Minimum 0, Ticks in 5%-Schritten, Format "X%".
X-Achse: Beschriftungen aktiviert.

#### Infobox (Seiten-Panel)
- "Per Wert: Durchschnittliche Mitarbeitereinsatzquote per Monat: 76,07%" (laufender Jahreswert)
- Liste der 5 Abwesenheitskategorien

### 1.7 AJAX / Seitenübergabe

Kein AJAX-Aufruf im Charts-Modul erkennbar. Die Seite wird per GET-Formular vollständig neu geladen. Die Chart-Daten sind im server-gerenderten HTML-Script-Block enthalten (kein separater JSON-Endpunkt sichtbar). Das bedeutet: Chart-Daten werden serverseitig in PHP aufgebaut und als AnyChart-JavaScript inline ausgegeben.

---

## 2. KPI Export Modul (`mz4_kpi_export`)

### 2.1 Übersicht

Reine Download-Seite ohne Filterformular. Kein eigener Charting-Stack.
Drei Sektionen:
1. Export Funktion (direkte Exports)
2. Reporting-Backups (letzte 45 Tage)
3. Reporting-Backups Ältere (über 45 Tage)

Seitentext: "Dieses Modul lässt einen Export zu Excel der Projektdatenbank zu. Es ist immer ein tagesaktueller Abgleich der Datenbank. Die Generierung der Excel-Dateien kann ca. eine Minute Zeit in Anspruch nehmen."

### 2.2 Export-Typen (aktiv)

| Button-Label | Endpoint | Params | Beschreibung | Status |
|-------------|----------|--------|-------------|--------|
| Total Export | `/excel_func.php` | `modul=mz4_export_total` | Vollständige Projektdatenbank | aktiv |
| Export abgeschlossene Aufträge | `/excel_func.php` | `modul=mz4_export_closed` | Abgeschlossene Aufträge nach KPI-Board | ausgeblendet (HTML-Kommentar) |
| Export Terminkalender | `/excel_func.php` | `modul=mz4_export_calendar` | Alle Termineinträge inkl. zusätzliche Infos | aktiv |

Der dritte Export-Typ (`mz4_export_closed`) ist im Quellcode als HTML-Kommentar eingeschlossen — existiert aber noch als Endpunkt (ANNAHME: abgeschaltet, nicht gelöscht).

### 2.3 Reporting-Backup-Download

Tägliche Backups, 45 Tage rollierend + Archiv älterer Backups.

Dateinamen-Format: `YYYY_MM_DD_{lang}.zip`  
Zwei Sprach-Varianten je Tag:
- `_de` — deutschsprachig
- `_en` — englischsprachig

Endpoint:
```
/excel_func.php?modul=mz4_kpi_export_backups&backup={YYYY_MM_DD_lang}
```

Backup-Tabellen-Spalten:
1. Download-Link (Dateiname mit `fa-download` Icon)
2. Datum (DD.MM.YYYY, rechtsbündig)
3. Dateigröße in KB (rechtsbündig, ca. 4.340–4.370 KB)

Beispieldaten: 30.06.2026 → `2026_06_30_en.zip` (4369 KB), `2026_06_30_de.zip` (4364 KB).

### 2.4 Export-Format

Alle drei aktiven Exports liefern `.xlsx`-Dateien (Excel) via `excel_func.php`. Die Backups sind `.zip`-Archive (enthalten vermutlich mehrere Excel-Sheets / Tabellen-Exporte gebündelt, da ~4,3 MB pro Tag).

Kein PDF-Export in diesem Modul.

---

## 3. Endpunkt-Katalog (gesamt KPI-Module)

| Endpunkt | Methode | Params | Funktion |
|---------|---------|--------|----------|
| `index.php` | GET | `modul=mz4_kpi_charts`, `chart`, `year`, `chart_kpiboard`, `sessionkey` | Charts-Seite mit Filterparametern laden |
| `/pdf.php` | GET | `modul=mz4_kpi_charts`, `sessionkey`, `sessionid`, `chart`, `printType=single`, `pdfGeneration=true`, `year`, `pdfEngine=wkpdf`, `chart_kpiboard`, `name` | PDF einzelner Chart |
| `/pdf.php` | GET | + `multiChartPdf=true` | PDF aller Charts (ohne chart_kpiboard) |
| `/excel_func.php` | GET | `modul=mz4_export_total` | Excel-Export Gesamtdatenbank |
| `/excel_func.php` | GET | `modul=mz4_export_calendar` | Excel-Export Terminkalender |
| `/excel_func.php` | GET | `modul=mz4_export_closed` | Excel-Export abgeschlossene Aufträge (deaktiviert) |
| `/excel_func.php` | GET | `modul=mz4_kpi_export_backups`, `backup={YYYY_MM_DD_lang}` | Backup-ZIP herunterladen |
| `index.php` | GET | `modul=mz4_kpi_export`, `sessionkey` | Export-Seite laden |

---

## 4. Abgeleitetes Datenmodell

### 4.1 Dimensionen (aus Filtern und Chart-Daten)

| Dimension | Beschreibung | Beispielwerte |
|-----------|-------------|--------------|
| chart_id | KPI-Analysebereich | 1–14 (nicht sequenziell) |
| year | Betrachtungsjahr | 2017–2026 |
| chart_kpiboard (board_id) | Abteilung/KPI-Board | 1=MO-2 WSM, 2=MO-2 UK, 3=MO-22, 4=MO-23, 5=MN-14, 6=MC-14, 8=MN-90, 9=MO-20, 10=MO-24 |
| period | Monat oder Jahr-Aggregat | Jan–Dez / 2021–2026 |

### 4.2 KPI-Metriken (aus Chart 1 vollständig, Rest ANNAHME)

| KPI | Einheit | Aggregation | Quelle-Dimension |
|-----|---------|-------------|-----------------|
| Mitarbeitereinsatzquote (Monat) | % | Arbeitstage Kat.1 / (Gesamttage - Kat.4 - Kat.5) | Terminkalender-Einträge je Mitarbeiter |
| Ø Mitarbeitereinsatzquote (Jahr) | % | Durchschnitt der Monatswerte | Berechnet |
| Zielwert oben | % | Statisch: 65 | Konfiguration |
| Zielwert unten | % | Statisch: 55 | Konfiguration |
| Anzahl aktiver Aufträge | Stück | Zählung laufender Projekte | Projektdatenbank |
| Anzahl abgeschlossener Aufträge | Stück | Zählung abgeschlossener Projekte | Projektdatenbank |
| Kundenzufriedenheit | (ANNAHME: Score 1–5 oder %) | Survey/manuell | Projektdatenbank |
| OEE-Verbesserung | %-Punkte | Differenz vor/nach Einsatz | Projektdatenbank |
| Identifizierte Kostenpotenziale | EUR oder Klassen | Summe | Projektdatenbank |
| Investvermeidung | EUR oder Klassen | Summe | Projektdatenbank |
| ZDSC Campus | unbekannt | unbekannt | Sonderauswertung, nur MO-2 WSM |

### 4.3 Verknüpfte Entitäten (aus KPI-Logik abgeleitet, ANNAHME)

```
mitarbeiter (employee)
  ↓ hat viele
termin_eintrag (calendar entry)
  - abwesenheitskategorie: 1..5
  - datum
  - mitarbeiter_id
  - projekt_id (optional)

projekt (project / auftrag)
  - status: aktiv | abgeschlossen
  - kpi_board_id → kpi_board.id
  - auftragstyp
  - kundenzufriedenheit (score)
  - oee_verbesserung
  - kostenpotenzial
  - investvermeidung

kpi_board (abteilung)
  - id: 1..10
  - name: z.B. "MO-2 WSM"
```

---

## 5. UI-Komponenten

### Charts-Modul

| Komponente | Framework | Details |
|-----------|-----------|---------|
| Top-Navigation | Bootstrap Navbar + Custom CSS | Modul-Links per GET, Sub-Dropdowns |
| Filter-Leiste | Bootstrap form-inline | 3 Selects + Submit-Button, col-sm-9 |
| Export-Button-Gruppe | Bootstrap Buttons + Font Awesome Icons | col-sm-3, rechts neben Filter |
| Chart-Container | AnyChart in `<div id="CH{UUID}">` | 700px Höhe, 100% Breite |
| Legende | Bootstrap Panel | Farbpunkte + Labels, col-sm-3 neben Chart |
| Info-Panel (Ø-Wert) | Bootstrap Panel | Textzeile mit aktuellem Durchschnittswert |
| Abwesenheitskategorien-Panel | Bootstrap Panel + ul-Liste | Erklärung der 5 Kategorien |
| Loading-Overlay | Custom `#loadstopperover` | weißes GIF-Overlay während Ladezeit |
| Global-Modal | Bootstrap Modal `#baseModal` | für Einstellungs-Popup |
| Fastsuche | Bootstrap Input-Group | GET `modul=fastsearch` |

### Export-Modul

| Komponente | Framework | Details |
|-----------|-----------|---------|
| Export-Buttons | Bootstrap ajaxboxbutton + Font Awesome Icons | fa-clipboard (Total), fa-calendar (Kalender) |
| Backup-Tabelle (aktuell) | Bootstrap `table-bordered table-striped` | 3 Spalten: Link, Datum, Größe |
| Backup-Tabelle (älter) | Gleiche Struktur | Zweite Sektion "Reporting-Backups (Ältere)" |

---

## 6. Technologiestack KPI-Module

| Schicht | Technologie |
|---------|------------|
| Backend | PHP (server-rendered HTML, session via PHPSESSID + sessionkey-URL-Token) |
| Routing | `index.php?modul=X` |
| Charts | AnyChart.js (Lizenziert, nicht Open Source, CDN lokal `/js/anychart/`) |
| PDF-Generierung | wkpdf (wkhtmltopdf, serverseitig via `pdf.php`) |
| Excel-Generierung | excel_func.php (serverseitig, Format: .xlsx oder .zip) |
| Frontend-Framework | jQuery 3.1.1 + Bootstrap 3 + Font Awesome |
| UI-Utilities | jquery-ui, custom App.js, Filter.js, ajaxbase.js |
| Styling | mz4ChartScreen.css (Charts-spezifisch) + base.css + header.css |

---

## 7. Verhalten und Besonderheiten

- **Keine AJAX-Chart-Updates**: Charts werden durch vollständigen Seitenneuladen aktualisiert (GET-Form). Kein Live-Datenabruf via AJAX.
- **chartIdChanged()**: JavaScript-Funktion steuert clientseitig, welche Abteilungs-Optionen sichtbar sind — ohne Server-Roundtrip.
- **Datenmischung auf X-Achse**: Chart 1 mischt Jahresdurchschnitte und Monatswerte auf derselben Achse. Zukunfts-Monate erhalten Platzhalter-Zielwerte (5/-5 statt 65/55), um keine irreführenden Ziellinien für nicht-existente Daten zu zeigen (ANNAHME).
- **Backup-Größe**: ~4,35 MB pro Tag/Sprache deutet auf umfangreiche Datenmenge hin (Gesamtdatenbank-Snapshot, nicht nur KPI-Aggregat).
- **Backup-Sprache**: Zwei Varianten (_de/_en) lassen auf zweisprachige Spaltenköpfe in den Excel-Sheets schließen.
- **mz4_export_closed auskommentiert**: Der Export abgeschlossener Aufträge ist im HTML als HTML-Kommentar deaktiviert, der PHP-Endpunkt (`mz4_export_closed`) existiert aber noch im Code (ANNAHME: temporär deaktiviert oder in Überarbeitung).
- **PDF-Engine**: `pdfEngine=wkpdf` (wkhtmltopdf-Wrapper). Kein `chart_kpiboard` im Multi-PDF-Call → Server generiert alle verfügbaren Boards oder nutzt einen Default.
- **sessionid vs. sessionkey**: Charts-PDF-Links enthalten sowohl `sessionkey` (URL-CSRF-Token) als auch `sessionid` (PHP-Session-ID in anderer Form). Export-Seite verwendet nur `sessionkey`.

---

## 8. Offene Fragen

1. Welche Chart-Typen verwenden die KPIs 2–9 und 14? (Nur KPI 1 ist sichtbar gerendert — Line+Column-Combo. Die anderen könnten reine Bar-Charts, Tortendiagramme oder Tachometer sein.)
2. Wie werden die 10 KPI-Analysebereich-IDs in der Datenbank abgebildet? (IDs 1–14 nicht sequenziell: 9, 11, 12 fehlen → gelöscht oder noch nicht vergeben?)
3. Was enthält KPI 14 "ZDSC Campus" genau? (Nur für MO-2 WSM verfügbar, könnte eine spezielle Trainings- oder Campus-Auswertung sein.)
4. Wie viele Sheets enthält ein Backup-ZIP und welche Tabellen sind darin enthalten?
5. Gibt es einen AJAX-Endpunkt für Auto-Refresh oder Drill-Down innerhalb eines Charts? (`ajaxloader.php` ist im globalen JS-Stack vorhanden, aber im KPI-Charts-Modul nicht direkt aufgerufen.)
6. Ist `mz4_export_closed` nur UI-deaktiviert oder auch backend-deaktiviert?
7. Welche Spalten enthält der Total-Export (`mz4_export_total`)? Entspricht er dem vollständigen Projekt-Schema inkl. KPI-Felder?
8. Gibt es eine Druckansicht / `printType`-Variante außer `single`?
9. Wer/Was löst die täglichen Backup-Generierungen aus? (Cron-Job, Systemd-Timer oder manuell?)
10. Wie wird `Ø Mitarbeitereinsatzquote per Monat` (orange Linie) berechnet — ist das der gleitende Durchschnitt aller bisherigen Monate im Jahr oder ein anderer Aggregationsmodus? (In Chart-1-Daten: Januar zeigt 70,77 und Monatswert auch 70,77 → im ersten Monat identisch; ab Februar divergieren sie minimal → ANNAHME: laufender Jahres-Durchschnitt kumuliert.)
