---
title: MZ4 Modul Projekte — Reverse-Engineering-Doku
date: 2026-06-30
status: aktiv
type: project
tags: [reverse-engineering, vsm, mz4, projekte]
---

# MZ4 Modul Projekte — Reverse-Engineering-Doku

Analysebasis: `raw/mz4_projects.html` (257 KB, 4276 Zeilen). Nur die Listenansicht (Projektübersicht) ist in diesem HTML gespeichert; Create-Form und Detail-Sub-Pages (overview/projectdata/kpi) sind separate Server-Responses, die hier nicht vorliegen.

---

## 1. Zweck & Layout

**Zweck:** Zentrales Verwaltungsverzeichnis aller Supplier-Development-Projekte des BMW MO-2-Teams. Zeigt alle Projekte eines gefilterten Zeitraums und Teams mit Schnellzugang zu den drei Detail-Tabs (Projektanlage, Projektdaten, Kennzahlen).

**Seitenstruktur:**
```
[Top-Navbar: Logo | Einsatzplanung | Projekte | Reporting▼ | Lieferanten | Einstellungen▼ | Suche | ⚙ | User | Logout]
[h1: Projektübersicht]                       [Neues Projekt anlegen ▶]
[Filter-Leiste: 5 Multi-Selects in .well]
[Anzahl Projekte: 160]
[Sortierbarer Table: 160 Projekt-Zeilen]
[Modal #baseModal für Settings-Popup]
[Div #DatenPopup: Maßnahmen-Eintrag-Popup (off-screen)]
[Div #seetings_box_sub: AJAX-Settings-Panel]
```

URL: `index.php?modul=mz4_projects&sessionkey=KEY`

---

## 2. Projekttabelle

```
| Nummer     | Status | Auftragstyp                      | Lieferant-Nr. | Lieferant          | Standort | [Aktionen] |
```

**Table-Attribute:** `class="table table-striped table-bordered margin_top_10 sortable"`, `id="sortable"`.

**Spalten-Details:**

| Spalte | Inhalt | Format | Anmerkung |
|---|---|---|---|
| Nummer | Projektnummer | `YYYY_NNN` | z.B. `2025_342`, `2026_026`; Jahr + lfd. Nr. |
| Status | Status-Code als Rohzahl | Integer | 10, 20, 40, 70, 80, 100 — kein Label in der Liste |
| Auftragstyp | Beauftragungstyp-Name | Text | Einer der 13 konfigurierten Typen |
| Lieferant-Nr. | BMW Lieferantennummer + Werk | `NNNNNN - NN` | z.B. `234997 - 10`; 6-stellige Nummer, Bindestrich, 2-stelliger Werkscode |
| Lieferant | Lieferantenname | Text (truncated) | Lange Namen per `<span title="...">` + Ellipse |
| Standort | Standort-/Ortsname | Text | Freitext; Stadt oder Ort |
| Aktionen | Drei Icon-Buttons | Links | Breite 150px; beschrieben in Abschnitt 5 |

**Hinweise:**
- Status wird in der Liste als Rohzahl (10/20/…) angezeigt, nicht als Label-Text.
- Sortierbar per Klick auf Spaltenheader (Bootstrap/jQuery-Sortable, client-seitig).
- Anzahl-Zeile: `Anzahl Projekte: <b>160</b>` — server-seitig gerendert nach Filteranwendung; Gesamtbestand im DB deutlich größer (Beispieldaten reichen bis 2014).
- Kein explizites Paginierungselement erkennbar. Alle gefilterten Projekte werden auf einer Seite gerendert.

---

## 3. Erstellen-/Bearbeitungsformular

**Einstieg:** Button "Neues Projekt anlegen" oben rechts → `index.php?modul=mz4_projects&aktion=create`

Das Create-Formular ist eine separate Server-Response; die hier analysierte HTML-Datei enthält nur die Listenansicht. Aus den JS-Validierungsstrings lassen sich folgende Pflichtfelder ableiten:

| Feld | Pflicht | Validierung / Hinweis |
|---|---|---|
| Lieferantennummer | Ja | Format `D12345 - 67` oder `123456 - 78` (inkl. Leerzeichen); JS-Fehlermeldung: `lang_fehleraufgetreten_dealercode` |
| Verantwortlicher | Ja | Dropdown-/Personenauswahl; Fehler: `lang_fehler_verantwortlich` |
| Enddatum | Ja | Datums-Feld mit Endvalidierung; Fehler: `lang_fehlerdatum` |
| Texteingabe(n) | Ja | Mind. ein Textfeld; Fehler: `lang_fehler_text` |
| Numerische Felder | Ja | Zahlenwert ohne Tausendertrennzeichen; Fehler: `lang_fehlervalue` |
| Drop-Down-Bewertungsfelder | Ja | Alle Drop-Downs müssen ausgefüllt sein; Fehler: `lang_fehlerwertauswaehlen` |

**ANNAHME:** Das Formular ist einstufig (kein Wizard). Der `givendealerid`-JS-Parameter legt nahe, dass Projekte auch direkt aus dem Lieferantenmodul (dealerselect) heraus angelegt werden können — der Lieferant wird dann vorbelegt.

**ANNAHME:** Das Projektnummer-Feld `YYYY_NNN` wird server-seitig automatisch generiert; der User trägt nur den Auftragstyp, Lieferant, Verantwortlichen und Daten ein.

---

## 4. Filter & Suche

### 4.1 Modul-interne Filter (5 Multi-Selects in `.well`)

Alle Filter sind Bootstrap-Multi-Selects mit `class='excelFilter'` und `data-toggle='excelFilter'`. Die `Mz4Project` JS-Klasse bindet sich via `registerHooks()` an Change-Events; **ANNAHME:** Änderungen triggern einen AJAX-Request zum Server (nicht rein client-seitig), weil Person und Responsible-Felder nicht als sichtbare Spalten im Table vorhanden sind und weil der Server die Anzahl rendert.

**Filter 1 — Projektverantwortung** (`departmentNavigation[]`, `data-type='Responsible'`)

| Wert | Label | Default |
|---|---|---|
| 6 | MC-14 | - |
| 7 | MN-14 | - |
| 11 | MN-90 | - |
| 1 | MO-2 | ✓ |
| 2 | MO-2 UK | - |
| 3 | MO-22 | - |
| 4 | MO-23 | ✓ |
| 13 | MO-24 | ✓ |

**Filter 2 — Status** (`statusNavigation[]`, `data-type='Status'`)

| Wert | Label | Default |
|---|---|---|
| 10 | Status 10 - Auftrag angenommen | ✓ |
| 20 | Status 20 - Auftrag storniert | ✓ |
| 40 | Status 40 - Besuch vereinbart | ✓ |
| 70 | Status 70 - Besuch erfolgt, Maßnahmen festgelegt | ✓ |
| 80 | Status 80 - Umsetzung erfolgt - abgeschlossen | ✓ |
| 100 | Status 100 - Auftrag kontrolliert und archiviert | - |

**Filter 3 — Person** (`personNavigation[]`, `data-type='Person'`): 42 Berater-Einträge. Default: alle außer Haro.Xavier (ID 1442). Vollständige Personenliste mit IDs: siehe Abschnitt 7.

**Filter 4 — Jahr** (`yearNavigation[]`, `data-type='Year'`)

| Jahr | Default |
|---|---|
| 2014-2019 | - |
| 2020-2026 | ✓ |

**Filter 5 — Beauftragungstyp** (`assignmenttypesNavigation[]`, `data-type='Assignmenttype'`): Default: kein Filter (filterText:[] = alle Typen). Auswahlwerte: 13 Typen — siehe Abschnitt 7.

### 4.2 Globale Schnellsuche (Top-Navbar)

Formular `#topsearch`: `GET index.php`, `modul=fastsearch`, Parameter `fs` (Freitext). JS-Handler: `dealerSearchControls(event)` bei onkeyup (Autocomplete-Dropdown in `#afautolist` / `#afDaten`).

---

## 5. Buttons & Aktionen

### 5.1 Seiten-Level-Aktion

| Button | Icon | URL | Beschreibung |
|---|---|---|---|
| Neues Projekt anlegen | fa-plus-square | `index.php?modul=mz4_projects&aktion=create` | Öffnet Create-Formular |

### 5.2 Zeilen-Aktionen (3 Buttons pro Projekt)

| Button | Icon | Title | projectaktion-Param | Beschreibung |
|---|---|---|---|---|
| Projektanlage | fa-eye | "Projektanlage" | `overview` | Übersichts-/Anlage-Tab des Projekts |
| Projektdaten | fa-dashcube | "Projektdaten" | `projectdata` | Daten-Tab |
| Kennzahlen | fa-database | "Kennzahlen" | `kpi` | KPI-Tab |

URL-Muster: `index.php?modul=mz4_projects&aktion=show&projectid=XXXX&projectaktion=[overview|projectdata|kpi]`

**Hinweis:** Kein Delete-Button in der Listenansicht erkennbar. Delete ist entweder im Detail-Tab oder nicht vorhanden (Status 100 = Archivierung statt Löschung).

### 5.3 Navbar-Aktionen

| Element | Aktion |
|---|---|
| ⚙ (fa-gear, `#sn_settings`) | `settingsPopup()` → öffnet Bootstrap-Modal `#baseModal` mit AJAX-geladenem Inhalt |
| Logout (fa-off) | `logout.php` |

---

## 6. AJAX-Endpunkte & Parameter

| Endpunkt | Methode | Params (bekannt) | Zweck |
|---|---|---|---|
| `index.php?modul=mz4_projects` | GET | sessionkey, departmentNavigation[], statusNavigation[], personNavigation[], yearNavigation[], assignmenttypesNavigation[] | Gefilterte Projektliste laden |
| `index.php?modul=mz4_projects&aktion=create` | GET/POST | sessionkey | Create-Formular anzeigen / speichern |
| `index.php?modul=mz4_projects&aktion=show` | GET | sessionkey, projectid, projectaktion | Detail-Sub-Page laden |
| `index.php?modul=fastsearch` | GET | sessionkey, fs | Globale Schnellsuche |

**Bekannte JS-Libraries:** jQuery 3.1.1, Bootstrap (Modal/Navbar), Font Awesome, `ajax_infobox.js` (Infobox-Overlay).

**JS-Klasse `Mz4Project`:** Initialisiert via `new Mz4Project({mapElem, mapElemId, filters})`, dann `mz4.registerHooks()`. Bindet Filter-Change-Events, verwaltet initialen Filterstatus. Das `mapElem`-Argument (`document.getElementById("missingContainer")`) zeigt auf ein nicht vorhandenes DOM-Element — eine optionale Geo-Karten-Komponente, die in dieser Ansicht deaktiviert ist.

**ANNAHME:** `ajaxloader.php` und `excel_func.php`/`com/pdf.php` werden in den Detail-Sub-Pages (projectdata, kpi) verwendet. In der Listenansicht nicht referenziert.

---

## 7. Inferred Data Model

### Entität: Projekt

| Feld | Typ | Beispiel | Herkunft |
|---|---|---|---|
| `id` | int (PK) | 2734, 2895 | URL-Parameter `projectid` |
| `nummer` | string | `2025_342` | Spalte "Nummer"; Format YYYY_NNN |
| `status` | int (FK) | 10, 20, 40, 70, 80, 100 | Spalte "Status" |
| `auftragstyp_id` | int (FK) | 1–13 | Spalte "Auftragstyp" |
| `lieferant_id` | int (FK) | implizit in Lieferant-Nr. | Referenz auf Händler/Lieferant-Tabelle |
| `lieferant_nummer` | string | `234997 - 10` | Spalte "Lieferant-Nr."; Format NNNNNN - NN |
| `lieferant_name` | string | `Minth Automotive Europe d.o.o` | Spalte "Lieferant" |
| `standort` | string | `Loznica` | Spalte "Standort"; Freitext |
| `year` | int (derived) | 2025 | Aus `nummer`-Prefix oder separates Feld |
| `department_id` | int (FK) | 1=MO-2, 4=MO-23, … | Filter "Projektverantwortung" |
| `verantwortlich_id` | int (FK) | 765=Aseckzai.Kais, … | Filter "Person" |

### Entität: Auftragstyp (13 Werte)

| ID | Name |
|---|---|
| 1 | Sonderauftrag |
| 2 | Entwicklung Produktionssystem |
| 3 | Kapa-Workshop |
| 4 | Lieferantenanalyse - Fabrikanalyse |
| 5 | Lieferanteneskalation / Sonderprojektform nach SOP |
| 6 | Investplausibilisierung |
| 7 | Lieferantenanalyse - Projektanalyse |
| 8 | Euro-Workshop |
| 9 | Lieferanteneskalation / Sonderprojektform vor SOP |
| 10 | PräventionsTeam Leitung |
| 11 | PräventionsTeam Support |
| 12 | ZDSC Campus |
| 13 | 360° Workshop |

### Entität: Abteilung / Responsible

| ID | Name |
|---|---|
| 1 | MO-2 |
| 2 | MO-2 UK |
| 3 | MO-22 |
| 4 | MO-23 |
| 6 | MC-14 |
| 7 | MN-14 |
| 11 | MN-90 |
| 13 | MO-24 |

### Entität: Berater / Person (bekannte IDs aus Filter)

| ID | Name |
|---|---|
| 570 | Klockenhoff, Armin |
| 571 | Knopf, Detlef |
| 580 | Althammer, Reinhard |
| 592 | Dickens, William |
| 594 | Gilch, Johann |
| 595 | Kurzmiller, Jürgen |
| 597 | Weigand, Klaus |
| 598 | Xue, Ping |
| 602 | Duncan, Staci |
| 604 | Lavrin, Alex |
| 634 | Rogers, Sloan |
| 711 | May (Vorname unbekannt) |
| 717 | Hernandez, Veronica |
| 742 | Leon, Li |
| 743 | Schlirf, Hans |
| 747 | Li (Vorname unbekannt) |
| 765 | Aseckzai, Kais |
| 788 | Gruber, Tomislav |
| 872 | Löffler, Jürgen |
| 878 | Fred, Liu |
| 883 | Xu, James |
| 886 | Zelin, Li |
| 903 | Arce, Alejandro |
| 951 | Barker, Trevor |
| 958 | Fekete, Balázs |
| 961 | Storch, Sebastian |
| 1001 | Fischer, Klaus |
| 1007 | Rossi, Carson |
| 1087 | Zich, Christopher |
| 1126 | Cooper, Matthew |
| 1128 | Miller, Richard |
| 1151 | Hagen, Felix |
| 1152 | Fanderl, Jakob |
| 1154 | (weiterer Berater, nicht gematcht) |
| 1161 | Shanshan, Liu |
| 1210 | Broker, Jason |
| 1271 | Azano, Yumiko |
| 1272 | Tian, Shawn |
| 1274 | Schlotterbeck, Gerald |
| 1310 | Rack, Pascal |
| 1318 | Nguyen, Duc-Hong |
| 1333 | Sertpoyraz, Berk |
| 1337 | Iberri, Paulina |
| 1442 | Haro, Xavier (nicht Default-selektiert) |

### Verknüpfte Sub-Entitäten (aus Detail-Tabs, ANNAHME)

- **Projektanlage (overview-Tab):** Kernfelder der Projekterfassung — Verantwortlicher, Beauftragungstyp, Lieferant, Termin-/Datumfelder, Statuswechsel.
- **Projektdaten (projectdata-Tab):** Weiterführende Projektfelder — vermutlich Maßnahmen, Notizen, Anhänge, Eskalationsstufe.
- **Kennzahlen (kpi-Tab):** Numerische KPI-Einträge — mit Drop-Down-Bewertungen (laut `lang_fehlerwertauswaehlen`) und Datumswerten. Zugehöriges DOM-Element `#DatenPopup` (class `massnahmeneintrag`) dient als Inline-Eintrag-Popup.

---

## 8. UI-Komponenten

| Komponente | Identifier | Beschreibung |
|---|---|---|
| Bootstrap-Modal | `#baseModal` | Settings-Popup; Header mit Close-Button, leerer Body (AJAX-befüllt), Footer mit "Close"-Button |
| AJAX-Box Settings | `#seetings_box_sub` / `#seetings_box_sub_kontent` | Alternatives Settings-Panel (ajaxbox-Klasse, off-canvas) |
| Maßnahmen-Popup | `#DatenPopup` (class `massnahmeneintrag`) | Absolut positioniertes Formular (400px breit), off-screen (top:-1500px), für KPI-Einträge |
| Alert-Container | `#alertmessagecontainer` / `#alertmessages` | Bootstrap-Alert-Bereich unterhalb Navbar |
| Infobox | `#DatenInfoBox` | Overlay-Infobox (via ajax_infobox.js), click-to-close |
| Top-Infobox | `#topinfobox` | Kleiner Infoanzeiger in Navbar |
| Greyout | `#greyout` | Modal-Overlay-Abdunkelung |
| Filter-Leiste | `.well > .row > .filterInput` | 5 Spalten à col-xs-12 col-sm-2; je Label + Multi-Select |
| Geo-Karte | `#missingContainer` (nicht im DOM) | Optionale Kartenansicht; im HTML nicht vorhanden, im JS referenziert |
| Sortierbare Tabelle | `#sortable` (class `sortable`) | Client-seitige Spalten-Sortierung |

---

## 9. Business-Regeln, Status-Workflow, Edge-Cases

### Status-Workflow

```
10 (Auftrag angenommen)
  ├─→ 20 (Auftrag storniert)          [Abbruch]
  └─→ 40 (Besuch vereinbart)
        └─→ 70 (Besuch erfolgt, Maßnahmen festgelegt)
              └─→ 80 (Umsetzung erfolgt - abgeschlossen)
                    └─→ 100 (Auftrag kontrolliert und archiviert)
```

- Status 100 (Archiviert) ist in der Default-Filteransicht **ausgeblendet**; muss explizit zugeschaltet werden.
- Status 20 (Storniert) ist in der Default-Ansicht **sichtbar**.

### Projektnummer-Format

- Schema: `YYYY_NNN` (Jahr + laufende Nummer, dreistellig padded, z.B. `2026_026`)
- ANNAHME: Nummer wird server-seitig beim Anlegen vergeben, kein manueller Eintrag.

### Lieferantennummer-Format

- Pflichtformat bei Erfassung: `D12345 - 67` (mit D-Prefix) oder `123456 - 78` (rein numerisch), inkl. Leerzeichen um den Bindestrich.
- JS-Validierung: `lang_fehleraufgetreten_dealercode`

### Kontext-Anlage aus Lieferantenmodul

- `var givendealerid = ''` auf der Listenseite leer; bei Anlage aus `dealerselect`/`haendlerportal` wird dieser Wert vorbelegt → Lieferant im Create-Form vorausgefüllt.

### Filter-Default

- Zeigt Projekte der Departments MO-2, MO-23, MO-24 für Jahre 2020–2026 und Statuse 10–80 an.
- Neue Mitarbeiter (z.B. Haro.Xavier, ID 1442) sind initial nicht im Person-Filter — **ANNAHME**: werden nachträglich zur Default-Selektion hinzugefügt.
- Beauftragungstyp-Filter: Default "alle" (keine Einschränkung).

### Keine sichtbare Delete-Funktion in der Liste

- ANNAHME: Projekte werden nicht gelöscht, sondern auf Status 100 archiviert. Delete-Option ggf. nur in Detail-Tab oder admin-only.

### Sortierung

- Client-seitig via table class `sortable`; kein Server-Round-Trip für Sortierungsänderung.
- ANNAHME: Bei Filterwechsel wird die Seite per AJAX oder Reload aktualisiert (nicht rein client-seitig), weil Person/Responsible-Felder nicht als sichtbare `data-*`-Attribute in Tabellenzeilen kodiert sind.

---

## 10. Offene Fragen (OPEN QUESTIONS)

1. **Create-Formular**: Welche Felder hat das Create-Formular genau (aktion=create)? Mehrstufig oder einstufig? Ist der Projektnummer-Prefix (Jahr) wählbar oder automatisch?
2. **Detail-Tabs**: Was zeigen die drei Sub-Pages (overview, projectdata, kpi) jeweils vollständig? Besonders: Welche Felder sind editierbar, welche AJAX-Endpunkte (ajaxloader.php?) werden genutzt?
3. **Filter-Mechanik**: Ist der Filter client-seitig (rein JS, alle 160 Rows vorhanden) oder AJAX-basiert (Server-Request bei Änderung)? Die fehlenden `data-*`-Attribute in Tabellenzeilen sprechen gegen rein client-seitige Filterung für Person/Responsible.
4. **Mz4Project JS-Klasse**: Wo ist die Quelldatei? Welche Methoden außer `registerHooks()` existieren? Wie ist die mapElem-Geo-Karte implementiert?
5. **Rollen/Rechte**: Gibt es unterschiedliche Berechtigungen pro User? Sehen Berater nur ihre eigenen Projekte? Hat Kais als Superuser vollen Zugriff?
6. **Maßnahmen-Eintrag**: `#DatenPopup` (class `massnahmeneintrag`) — in welchem Tab/Workflow öffnet sich dieses Popup? Welche Felder hat es?
7. **Lieferant-Nr. Werkscode**: Was bedeutet der Suffix-Teil (z.B. `-10`, `-12`, `-14`)? BMW-intern: Werksschlüssel?
8. **KPI-Bewertungsfelder**: `lang_fehlerwertauswaehlen` nennt Drop-Down-Bewertungen — welche Kategorien/Skalen werden bewertet?
9. **Excel/PDF-Export**: Gibt es eine Export-Funktion für die Projektliste? `excel_func.php` und `com/pdf.php` sind in anderen Modulen genutzt, in diesem HTML nicht referenziert.
10. **ajaxloader.php-Calls**: Welche Actions sind für dieses Modul verfügbar?
