# MXNBAU_MGT – Technisches Datenblatt

> Erstellt: März 2026  
> Zweck: Technische Grundlage für externe Bewertung  
> Bewerter führt eigene Analyse auf Basis dieser Daten durch

---

## 1. Projektübersicht

**Typ:** Branchenspezifische ERP-Webanwendung für Bauunternehmen (Deutschland)  
**Zielbranche:** Holzbau / allgemeines Baugewerbe  
**Sprache:** Benutzeroberfläche vollständig auf Deutsch; Code-Konventionen auf Englisch  
**Deployment:** On-Premise (Apache) oder Managed Hosting; Cloud-Storage-fähig (S3)  
**Mandantenfähigkeit:** Nein – Single-Tenant (eine Installation = ein Unternehmen)  
**Lizenz:** Proprietär, nicht open source  
**Entwicklungsstand:** Produktionsreife Kernmodule; einzelne erweiterte Features noch offen

---

## 2. Technischer Stack

| Schicht                     | Technologie                           | Version       |
| --------------------------- | ------------------------------------- | ------------- |
| Backend-Framework           | Laravel                               | 12.x          |
| Sprache                     | PHP                                   | ^8.2          |
| Datenbank                   | MySQL                                 | —             |
| Frontend-Framework          | Bootstrap                             | 5.1.3         |
| JavaScript-Framework        | Vue.js                                | 2.6.12        |
| Asset-Build-Tool            | Laravel Mix                           | 6.0.6         |
| HTTP-Client (Server-seitig) | Guzzle                                | ^7.2          |
| HTTP-Client (Client-seitig) | Axios                                 | ^1.6.8        |
| PDF-Erzeugung               | DomPDF (barryvdh)                     | ^3.1          |
| PDF-Erzeugung (komplex)     | Snappy / wkhtmltopdf                  | ^1.0 / 0.12.x |
| PDF-Erzeugung (alternativ)  | Spatie Laravel PDF                    | ^1.5          |
| Excel-Export/Import         | Maatwebsite Laravel Excel             | ^3.1          |
| Rollen & Berechtigungen     | Spatie Laravel Permission             | ^7.3          |
| Datei-Storage               | Lokal (modulgetrennt) + S3-kompatibel | —             |
| Adress-Autocomplete         | Geoapify Places API                   | —             |
| Geolokalisierung            | torann/geoip                          | ^3.0          |
| Testing                     | PHPUnit                               | ^10.0         |
| Headless Browser (PDF)      | Puppeteer                             | ^24.10.1      |

**Serverumgebung:** Apache, GitHub Actions CI/CD (SFTP-Deploy, nur geänderte Dateien)  
**Cache-Management:** Über internes Admin-Panel (`/system/server`) ausführbar

---

## 3. Code-Metriken

| Artefakt                                                  | Anzahl             |
| --------------------------------------------------------- | ------------------ |
| PHP-Model-Dateien (`app/Models/`)                         | 95                 |
| PHP-Controller-Dateien (`app/Http/Controllers/`)          | 58                 |
| Datenbank-Migrationen (`database/migrations/`)            | 64                 |
| Blade-Templates (`resources/views/`)                      | 153                |
| Web-Routen (`routes/web.php`)                             | ~538               |
| API-Routen (`routes/api.php`)                             | 19                 |
| **Routen gesamt**                                         | **~557**           |
| Datenbank-Tabellen (neu via Migrationen)                  | 19                 |
| Datenbank-Tabellen (Basis-System, aus Vor-Migrationszeit) | ~60–70 (geschätzt) |
| Standard-Servicepositionen (Stammdaten, eingespeist)      | 6.401              |

**Hinweis zu Migrationen:** Die 64 Migrationsdateien dokumentieren den Entwicklungsstand ab April 2026. Die Basis-Tabellen (CRM, HRM, ACC etc.) wurden aus einem Vorgängersystem übernommen und sind in der Datenbank vorhanden, aber nicht in allen Dateien neu erstellt.

---

## 4. Datenbankstruktur

### 4.1 Tabellengruppen nach Modul

```
Präfix          Modul                   Inhalt (Auswahl)
─────────────────────────────────────────────────────────────────────────────
crm_*           Kundenverwaltung        customers, branches, employees,
                                        employee_positions, contact_history,
                                        categories

srm_*           Lieferantenverwaltung   suppliers, branches, employees,
                                        contact_history

pms_*           Projektmanagement       offers, offer_positions,
                                        offer_timelines, orders,
                                        order_positions, order_timelines,
                                        invoices, invoice_positions,
                                        nr_counter, status, project_types,
                                        project_categories, appointments,
                                        service_position_categories,
                                        service_positions, position_units,
                                        labor_types, equipment,
                                        external_services, misc_items,
                                        price_updates, price_update_items

material_*      Materialkatalog         material_catalog,
                                        material_catalog_categories

acc_*           Buchhaltung             outgoing_invoices,
                                        outgoing_invoice_payments,
                                        incoming_invoices,
                                        incoming_invoice_payments,
                                        cost_centers, cost_center_groups,
                                        datev_konto, datev_bu,
                                        payment_methods, payments,
                                        payment_parts, recipients,
                                        invoice_warnings, bank_accounts,
                                        invoice_priorities, request_origins

hr_*            Personalverwaltung      employees, employee_personal,
                                        contracts, contract_types,
                                        contract_days, salaries,
                                        salary_festbezuege,
                                        social_insurance, tax, vwl,
                                        time_recording, vacation_requests,
                                        sick_requests, holidays,
                                        work_time_accounts, work_locations,
                                        org_units, org_cost_centers,
                                        education, vocational_training,
                                        gender, marital_status,
                                        insurance_types, activity_keys,
                                        federal_states, previous_employers

fms_*           Fuhrpark                vehicles, sites, assignments,
                                        maintenance, repairs, deadlines,
                                        fuel_log, workshops

dms_*           Dokumentenmanagement    files, folders, file_links

einsatz_*       Einsatzplanung          entries

system/global   System & Querschnitt    users, employees (Stamm),
                                        company, departments,
                                        emp_dep_subscriptions,
                                        workflows, workflow_stations,
                                        terms_templates, service_phases,
                                        project_locations,
                                        notifications, news,
                                        reminders, todo_lists,
                                        todo_tasks, todo_steps,
                                        todo_list_employees,
                                        todo_task_subscribers,
                                        login_logs, error_logs,
                                        user_activities, app_settings,
                                        roles, permissions (Spatie RBAC)
```

### 4.2 Zentrale Fremdschlüssel-Relationen

```
crm_customers
  └──< pms_offers (fk_customer_id)
         └──< pms_offer_positions
         └──< pms_orders (aus Angebot erstellt)
                └──< pms_order_positions
                └──< pms_invoices
                       └──< pms_invoice_positions
                       └──> acc_outgoing_invoices (Buchungssatz)
                ──> acc_cost_centers (fk_cost_centre_id)
                ──> pms_workflows (fk_workflow_id)
                ──< dms_file_links (polymorphe Relation)

acc_outgoing_invoices
  └──> acc_outgoing_invoices (fk_storno_of_id) ← Storno-Kette

hr_employees
  └──< hr_time_recording
  └──< hr_vacation_requests
  └──< hr_sick_requests
  └──< einsatz_entries ──> pms_orders

dms_file_links (linkable_type / linkable_id)
  └──> beliebige Entität (polymorphe Relation)
  └──> dms_files
  └──> dms_folders
```

### 4.3 Datenbankkonventionen

| Konvention             | Umsetzung                                                                  |
| ---------------------- | -------------------------------------------------------------------------- |
| Soft Delete            | `is_deleted = 1` (manuell, kein Laravel SoftDeletes Trait)                 |
| Timestamps             | `created_at`, `updated_at` (Standard Laravel)                              |
| Fremdschlüssel-Spalten | Präfix `fk_` (z. B. `fk_customer_id`, `fk_cost_centre_id`)                 |
| Dokumentnummern        | Tabelle `pms_nr_counter`, Typ-Präfix: AN / AU / RE / ST                    |
| Storno-Felder          | `is_storno`, `fk_storno_of_id`, `storno_reason` in `acc_outgoing_invoices` |
| DATEV-Mapping          | Eigene Tabellen `datev_konto` + `datev_bu`                                 |
| Polymorphe Verknüpfung | `dms_file_links.linkable_type` / `linkable_id`                             |

### 4.4 Storage-Struktur (Disk-Konfiguration)

```
storage/app/
├── dms/files/
│   ├── pms/     → Angebote, Aufträge, Rechnungen, Anhänge
│   ├── acc/     → Ausgangs-/Eingangsrechnungen, Mahnungen
│   ├── hrm/     → Mitarbeiterdokumente
│   ├── prm/     → Produkt-/Materialdokumente
│   └── srm/     → Lieferantendokumente
└── public/      → Öffentliche Assets
```

S3-kompatibles Storage konfigurierbar über `.env` (`AWS_*` Variablen).

---

## 5. Module und Funktionsumfang

### 5.1 CRM – Kundenverwaltung

-   Kundenstamm mit Niederlassungen, Kategorien, Ansprechpartnern und deren Positionen
-   Kontakthistorie (Anruf, E-Mail, Besuch) pro Kunde und Ansprechpartner
-   Adress-Autocomplete via Geoapify Places API

### 5.2 SRM – Lieferantenverwaltung

-   Lieferantenstamm mit Niederlassungen und Ansprechpartnern
-   Kontakthistorie

### 5.3 PMS – Projektmanagement (Kernmodul)

**Angebote (Präfix AN-YY/NNNN)**

-   Positionen mit Menge, Einheit, Einzel- und Gesamtpreis
-   Optionale Positionen (werden gesondert ausgewiesen)
-   Phasen-Einteilung (Leistungsphasen)
-   Workflow-basierter Status-Fortschritt (konfigurierbar)
-   AGB-Vorlagen (Texte auf PDF)
-   PDF-Erzeugung (DomPDF / Snappy)

**Aufträge (Präfix AU-YY/NNNN)**

-   Übernahme aus Angebot
-   Kostenstellen-Zuweisung
-   Farbmarkierung (Hex-Code) für Übersicht
-   Abteilungs-Zuweisung
-   Workflow-Status (eigene Konfiguration für Aufträge)

**Rechnungen (Präfix RE-YY/NNNN)**

-   Abschlagsrechnungen (nummeriert) und Schlussrechnung
-   Festschreibung (Status `festgeschrieben` → unveränderlich, GoBD)
-   Leistungszeitraum (Von/Bis-Datum)
-   Übergabe an `acc_outgoing_invoices`
-   PDF-Erzeugung

**Storno (Präfix ST-YY/NNNN)**

-   GoBD-konforme Gegenbuchung (Originaldokument bleibt unverändert)
-   Negative Beträge in `acc_outgoing_invoices`
-   `fk_storno_of_id` verweist auf Originalrechnung
-   Storno-Grund wird erfasst

**Leistungsverzeichnis**

-   6.401 vordefinierte Servicepositionen (Bau-Stammdaten)
-   Kategorisiert nach Gewerken
-   Einheitensystem (Stunde, m², m³, Stück, Pauschal etc.)

**Weitere Stammdaten**

-   Materialkatalog (kategorisiert, mit Preisen)
-   Lohnarten (Arbeitsleistung nach Typ)
-   Geräte (Maschineneinsatz)
-   Fremdleistungen (Nachunternehmer)
-   Sonstige Positionen

**Preissystem**

-   Preisänderungshistorie (Scopes: einzelne Position, Kategorie, global)
-   Einheiten-Normalisierung

### 5.4 ACC – Buchhaltung & Rechnungswesen

-   Ausgangsrechnungen: Erstellung, Zahlungserfassung, Zahlungsstatus
-   Eingangsrechnungen: Erfassung, Freigabe-Workflow, Zahlungsstatus
-   Mahnwesen: Mahnstufen, Mahnbriefe
-   Kostenstellen: Gruppen, Zuweisung zu Aufträgen
-   DATEV-Integration: Konten-Mapping (`datev_konto`), Buchungsschlüssel (`datev_bu`), CSV-Export
-   Zahlungsmethoden: Überweisung, EC, Lastschrift, Bar etc.
-   Bankkonten-Verwaltung (Firmenseite)
-   Empfänger-Verwaltung (für Rechnungsadressen)

### 5.5 HRM – Personalverwaltung

-   Mitarbeiterstamm: Persönliche Daten, Qualifikationen, Ausbildung, Berufsausbildung
-   Vertragsmanagement: Vertragsarten, Arbeitszeitmodelle (Tage/Woche)
-   Zeiterfassung: Stempeluhr (API-fähig, RFID-Karte), Pause-Tracking, Auto-Stopp
-   Urlaubsverwaltung: Antrag, Genehmigung, Kontenverwaltung, Urlaubsübersicht
-   Krankmeldungen: Erfassung und Tracking
-   Arbeitszeitkonto: Soll/Ist-Vergleich
-   Lohn/Gehalt: Festbezüge, Sozialversicherung, Steuer, VWL
-   Organisations-Struktur: Abteilungen, Kostenstellen-Zuordnung
-   Feiertage: Bundesland-spezifisch konfigurierbar
-   Berichte: Monatsübersichten, Urlaubsübersichten
-   Vorherige Arbeitgeber: Erfassbar für Lohnunterlagen

### 5.6 FMS – Fuhrparkverwaltung

-   Fahrzeugstamm: Kennzeichen, Typ, Standort, Werkstatt-Zuweisung
-   Fristen: TÜV, Hauptuntersuchung, UVV mit Deadline-Tracking
-   Wartungsplan: Wartungseinträge, Fälligkeiten
-   Reparaturen: Schadensmeldungen und Reparaturprotokoll
-   Kraftstoff-Logbuch: Tankvorgänge, Verbrauchsberechnung
-   Fahrzeug-Zuweisung: Welches Fahrzeug, welcher Mitarbeiter, welche Baustelle, wann

### 5.7 DMS – Dokumentenmanagement

-   Hierarchische Ordnerstruktur (modular nach CRM/PMS/ACC/HRM/SRM/PRM getrennt)
-   Automatische Ordnererstellung beim Speichern von Dokumenten
-   Polymorphe Verlinkung: Jede Datei mit beliebigem Datensatz verknüpfbar
-   GoBD-konforme Ablage: Festgeschriebene Dokumente unveränderlich
-   Datei-Kategorien: `invoice_out`, `invoice_in`, `angebot`, `auftragsbestaetigung`, `storno_invoice`, `dunning`, `anhang`
-   S3-kompatibler Cloud-Storage konfigurierbar
-   Legacy-Migration-Kommando: `php artisan dms:migrate-legacy-acc`
-   GoBD-Purge-Kommando (Aufbewahrungspflicht): `php artisan dms:purge`

### 5.8 Einsatzplanung

-   Wochenplan: Mitarbeiter einem Projekt/Auftrag zuweisen
-   Übersicht: Wer ist in welcher Woche wo eingesetzt

### 5.9 Querschnittsfunktionen

-   **Workflows:** Konfigurierbare Status-Sequenzen (für Angebote und Aufträge separat definierbar)
-   **Rollensystem:** Spatie RBAC mit Rollen und Berechtigungen (`sysadmin`, `mgt`, `fms`, `dms`, `hrm`)
-   **AGB-Vorlagen:** Vorlagen für PDF-Dokumente
-   **To-Do-System:** Listen, Aufgaben, Teilschritte, Abonnenten, Benachrichtigungen
-   **Internes Newsfeed:** Firmeninterne Ankündigungen
-   **Erinnerungen:** Terminerinnerungen für Mitarbeiter
-   **Audit-Trail:** Login-Log, Benutzeraktivitäten
-   **Error-Log:** Technisches Fehlerprotokoll (nur Sysadmin)
-   **Adress-Autocomplete:** Geoapify für alle Adressfelder in der Anwendung
-   **Einsatzplanung:** Wöchentliche Ressourcenplanung (Mitarbeiter ↔ Projekt)

---

## 6. API-Endpunkte (routes/api.php)

| Methode | URI                                            | Funktion                              |
| ------- | ---------------------------------------------- | ------------------------------------- |
| GET     | `/api/user`                                    | Eingeloggter Benutzer                 |
| GET     | `/api/app-version`                             | App-Versionsnummer                    |
| GET     | `/api/status`                                  | Health-Check                          |
| POST    | `/api/login-rfid`                              | Authentifizierung per RFID-Karte      |
| GET     | `/api/worktime`                                | Aktuelle Arbeitszeit des Mitarbeiters |
| GET     | `/api/worktime2`                               | Erweiterte Arbeitszeit-Abfrage        |
| POST    | `/api/workstart`                               | Arbeitsbeginn stempeln                |
| POST    | `/api/workstop`                                | Arbeitsende stempeln                  |
| POST    | `/api/breakstart`                              | Pause beginnen                        |
| POST    | `/api/breakstop`                               | Pause beenden                         |
| POST    | `/api/autoworkstop`                            | Auto-Stopp umschalten                 |
| GET     | `/api/vacation-info`                           | Urlaubs-Saldo abrufen                 |
| POST    | `/api/vacation-request`                        | Urlaubsantrag stellen                 |
| GET     | `/api/vacation-badge`                          | Offene Urlaubsanträge (Anzahl)        |
| GET     | `/api/datev-transfer/employee`                 | Mitarbeiterliste für DATEV            |
| GET     | `/api/datev-transfer/years`                    | Verfügbare Abrechnungsjahre           |
| GET     | `/api/datev-transfer/months/{year}`            | Monate eines Jahres                   |
| GET     | `/api/datev-transfer/employees/{year}/{month}` | Arbeitsdaten pro Monat                |
| GET     | `/api/datev-transfer/exportwork`               | DATEV-Export herunterladen            |

---

## 7. Entwicklungs-Zeitlinie

Alle Migrationen sind auf einen 16-tägigen Entwicklungszeitraum konzentriert:

| Zeitraum   | Schwerpunkt                                                                                             |
| ---------- | ------------------------------------------------------------------------------------------------------- |
| 15.04.2026 | Materialkatalog, optionale Positionen, Workflows, AGB-Vorlagen, Termine, DMS-Rechte                     |
| 16.04.2026 | Error-Log-System                                                                                        |
| 17.04.2026 | Einheiten, Servicepositionen (6.401 Einträge), Materialkatalog-Seeding                                  |
| 22.04.2026 | Server-Admin-Berechtigung                                                                               |
| 23.04.2026 | Einsatzplanung, Spatie RBAC-Migration (von Flags auf Rollen), Farben                                    |
| 24.04.2026 | Bankkonten, DMS-Erweiterung (File-Links, Ordner)                                                        |
| 27.04.2026 | DMS-Korrekturen, Preisänderungs-System, Materialkategorien                                              |
| 28.04.2026 | Ressourcentypen (Lohn/Gerät/Fremd/Sonst), Legacy-Tabellen entfernt, Modul-Präfix-Umbenennung, Workflows |
| 29.04.2026 | Optionale Auftragspositionen, PMS-Rechnungstabellen, Abschläge                                          |
| 30.04.2026 | Storno-Felder, Leistungsdaten, DATEV-Bereinigung, Kostenstellen, Workflows Rechnungsausgang             |

---

## 8. Offene Features / Bekannte Lücken

Die folgenden Funktionen sind in der aktuellen Version **nicht** implementiert:

### 8.1 Fachliche Lücken

| Feature                       | Modul   | Beschreibung                                                |
| ----------------------------- | ------- | ----------------------------------------------------------- |
| E-Mail-Versand                | Alle    | PDFs direkt per E-Mail aus der Anwendung versenden          |
| Kalkulation (EK/VK)           | PMS     | Deckungsbeitragsrechnung, Einkaufspreise vs. Verkaufspreise |
| Automatische Mahnläufe        | ACC     | Zeitgesteuerte Mahnstufen (benötigt Queue-System)           |
| Zahlungsabgleich / Bankimport | ACC     | SEPA-Kontoauszug-Import, automatischer Zahlungsabgleich     |
| Abschlagsplan                 | PMS/ACC | Geplante Teilrechnungen mit Fälligkeitsterminen             |
| GAEB-Import/Export            | PMS     | Branchenstandard für Ausschreibungen (VOB)                  |
| Nachträge                     | PMS     | Änderungsleistungen zum laufenden Auftrag                   |
| Aufmaß                        | PMS     | Mengenerfassung auf der Baustelle                           |
| Bestellwesen                  | SRM     | Purchase Orders an Lieferanten                              |
| Lagerverwaltung               | PMS     | Material-Lager, Zu- und Abgänge                             |
| Gewährleistungsverfolgung     | PMS     | Mängelmanagement nach Abnahme                               |
| Budgetkontrolle               | PMS/ACC | Soll/Ist-Kostenvergleich pro Auftrag                        |
| Rapportzettel / Tagesberichte | HRM/PMS | Mobile Baustellenberichte                                   |
| Dashboards & KPIs             | Alle    | Management-Cockpit mit Auswertungen und Charts              |
| Lohnabrechnung                | HRM     | Lohnzettel-Erzeugung (derzeit nur Datenverwaltung)          |
| Subunternehmer-Aufträge       | SRM/PMS | Vollständige Beauftragung von Nachunternehmern              |

### 8.2 Technische Lücken

| Punkt                 | Beschreibung                                                |
| --------------------- | ----------------------------------------------------------- |
| Automatisierte Tests  | PHPUnit installiert, aber keine Test-Suites vorhanden       |
| Queue-System          | Kein Laravel Horizon / Redis – kein Hintergrundverarbeitung |
| Caching-Layer         | Kein Redis/Memcached für DB-Abfragen                        |
| E-Mail-Konfiguration  | Kein Mail-Treiber konfiguriert                              |
| API-Dokumentation     | Keine OpenAPI/Swagger-Spezifikation                         |
| Rate Limiting (API)   | Keine Absicherung der externen API-Endpunkte                |
| WebSocket / Real-time | Channels definiert, aber kein Broadcasting implementiert    |

---

## 9. Veraltete Technologiekomponenten

| Komponente  | Status                        | Anmerkung                      |
| ----------- | ----------------------------- | ------------------------------ |
| Vue.js 2.x  | End-of-Life (seit 31.12.2023) | Sicherheitsupdates eingestellt |
| Laravel Mix | Nicht mehr empfohlen          | Offiziell durch Vite ersetzt   |
| wkhtmltopdf | Nicht mehr aktiv gewartet     | Bekannte Rendering-Probleme    |

---

## 10. Mandantenfähigkeit / SaaS-Architektur

**Aktueller Stand:** Single-Tenant – eine Installation bedient exakt ein Unternehmen.

Es gibt keine Datenbanktrennung nach Mandanten, keine Tenant-Isolation, keine Self-Service-Registrierung und kein Billing-System.

**Technische Voraussetzungen für Multi-Tenant (als Information für Bewerter):**

| Ansatz                                | Beschreibung                                                         | Aufwand   |
| ------------------------------------- | -------------------------------------------------------------------- | --------- |
| Managed Hosting (je Installation)     | Jeder Kunde = eigene DB + eigene Subdomain, Deployment automatisiert | Mittel    |
| Datenbank-Präfix-Strategie            | Eine DB, Tabellen mit Tenant-Präfix                                  | Hoch      |
| Separate Datenbanken (stancl/tenancy) | Vollständige Tenant-Isolation über Laravel-Package                   | Sehr hoch |

---

## 11. Externe Abhängigkeiten / Integrationen

| Service             | Zweck                     | Konfiguration                     |
| ------------------- | ------------------------- | --------------------------------- |
| Geoapify Places API | Adress-Autocomplete       | `.env`: `GEOAPIFY_API_KEY`        |
| DATEV               | Buchführungs-Export (CSV) | Konfigurierbar über Admin-Bereich |
| RFID-Hardware       | Zeiterfassung per Karte   | Über `/api/login-rfid`            |
| AWS S3 (optional)   | Cloud-Dokumentenspeicher  | `.env`: `AWS_*` Variablen         |
| GitHub Actions      | CI/CD Deploy (SFTP)       | `.github/workflows/deploy.yml`    |

---

## 12. Artisan-Kommandos (projektspezifisch)

```bash
php artisan dms:migrate-legacy-acc              # Legacy-Dateien in DMS migrieren
php artisan dms:migrate-legacy-acc --dry-run    # Vorschau ohne Schreiben
php artisan dms:migrate-legacy-acc --type=ausgang|eingang|all
php artisan dms:purge                           # GoBD-Purge (Aufbewahrungsfrist prüfen)
```

---

## 13. Begleit-App – Android Zeiterfassungs-App (SPMMGT)

Das ERP-System wird durch eine native Android-App ergänzt, die ausschließlich für die mobile Zeiterfassung per RFID-Karte entwickelt wurde.

### 13.1 Technischer Stack

| Komponente             | Technologie                | Version             |
| ---------------------- | -------------------------- | ------------------- |
| Plattform              | Android (Java)             | —                   |
| Sprache                | Java                       | Java 11             |
| compileSdk / targetSdk | Android                    | API 34              |
| minSdk                 | Android                    | API 31 (Android 12) |
| App-Version            | —                          | 1.1 (versionCode 2) |
| HTTP-Client            | Retrofit 2 + GSON          | 2.9.0               |
| RFID-Schnittstelle     | usb-serial-for-android     | 3.8.1               |
| UI-Framework           | AndroidX + Material Design | 1.12.0              |
| Build-System           | Android Gradle Plugin      | 9.1.0               |
| View Binding           | aktiviert                  | —                   |

**Package-Name:** `com.example.spm_mgt`  
**Ausrichtung:** Nur Querformat (Landscape) – optimiert für fest montierte Terminals

### 13.2 Quellcode-Struktur

```
app/src/main/java/com/example/spm_mgt/
├── IntroActivity.java          – Startbildschirm: Server-Erreichbarkeit prüfen, Konfiguration
├── LoginActivity.java          – RFID-Login: Karte scannen → Benutzer authentifizieren
├── MainActivity.java           – Haupt-Dashboard: Zeiterfassung, Stempeln, Projekte
├── VacationActivity.java       – Urlaubsverwaltung: Antrag stellen, Saldo ansehen
├── SettingActivity.java        – Einstellungen: Server-URL, USB-Gerät konfigurieren
├── UsbPermissionReceiver.java  – USB-Berechtigungs-Handler
├── ApiService.java             – Retrofit-Interface (alle API-Endpunkte)
├── RetrofitClient.java         – HTTP-Client-Konfiguration (dynamische Base-URL)
└── models/                     – 19 Datenklassen (User, Worktime, Project, Vacation etc.)
    ├── User.java
    ├── Worktime.java / WorktimeResponse.java
    ├── Project.java / CostCenter.java / BV.java
    ├── LoginResponse.java
    ├── WorkStartResponse.java / WorkStopResponse.java
    ├── BreakStartResponse.java / BreakStopResponse.java
    ├── AutoWorkStopRequest.java / AutoWorkStopResponse.java
    ├── VacationBadge.java / VacationInfo.java / VacationItem.java
    ├── VacationRequestResponse.java
    ├── AppVersion.java
    └── ServerResponse.java
```

### 13.3 RFID-Integration

**Hardware:** Elatec TWN4 RFID-Lesegerät (USB-Anschluss)  
**Betriebsmodus:** Keyboard-Emulation – das Lesegerät simuliert Tastatureingaben

**Ablauf:**

1. Mitarbeiter hält RFID-Karte an USB-Lesegerät
2. Lesegerät übermittelt 8-stellige Karten-ID als Tastatureingabe in ein verstecktes Textfeld
3. `TextWatcher` erkennt vollständige 8-Zeichen-Eingabe
4. App sendet `POST /api/login-rfid` mit der Karten-ID an den Server
5. Server antwortet mit Benutzerdaten (`user_id`, `first_name`, `last_name`)
6. App speichert Session in SharedPreferences
7. Weiterleitung zum Haupt-Dashboard

**Alternativ-Implementierung (im Code vorhanden, auskommentiert):** Direkte USB-Serial-Kommunikation (9600 Baud, Vendor-ID 13372), für andere Lesegerät-Modi.

**RFID-Format:** 8 Zeichen (alphanumerisch)  
**NFC:** Nicht implementiert

### 13.4 API-Verbindung zum Backend

Die App kommuniziert ausschließlich über REST-API mit dem Laravel-Backend. Die Server-URL ist frei konfigurierbar (kein Hardcoding).

| App-Endpoint          | HTTP | Backend-Route           | Funktion                     |
| --------------------- | ---- | ----------------------- | ---------------------------- |
| `status`              | GET  | `/api/status`           | Server-Erreichbarkeit prüfen |
| `login-rfid`          | POST | `/api/login-rfid`       | RFID-Authentifizierung       |
| `worktime?uid=`       | GET  | `/api/worktime`         | Arbeitszeitdaten laden       |
| `workstart`           | POST | `/api/workstart`        | Arbeit beginnen              |
| `workstop`            | POST | `/api/workstop`         | Arbeit beenden               |
| `breakstart`          | POST | `/api/breakstart`       | Pause beginnen               |
| `breakstop`           | POST | `/api/breakstop`        | Pause beenden                |
| `autoworkstop`        | POST | `/api/autoworkstop`     | Auto-Stopp umschalten        |
| `allprojects`         | GET  | (intern)                | Projektliste laden           |
| `api/bv`              | GET  | (intern)                | Baustellenliste laden        |
| `vacation-info?uid=`  | GET  | `/api/vacation-info`    | Urlaubssaldo abrufen         |
| `vacation-badge?uid=` | GET  | `/api/vacation-badge`   | Offene Anträge (Badge)       |
| `vacation-request`    | POST | `/api/vacation-request` | Urlaubsantrag stellen        |
| `api/app-version`     | GET  | `/api/app-version`      | App-Version prüfen           |

**Datenaustausch-Format:** JSON (GSON)  
**Base-URL:** Dynamisch – konfigurierbar über Einstellungsbildschirm, gespeichert in SharedPreferences und `config.xml`

### 13.5 Funktionsumfang

| Funktion                          | Beschreibung                                           |
| --------------------------------- | ------------------------------------------------------ |
| **RFID-Login**                    | Karte scannen → sofortige Anmeldung, kein Passwort     |
| **Arbeit starten/stoppen**        | Schaltflächen auf Haupt-Dashboard                      |
| **Pause starten/stoppen**         | Separate Pause-Steuerung                               |
| **Echtzeit-Timer**                | Arbeitszeit- und Pausen-Uhr (Sekunden-genau, HH:mm:ss) |
| **Projekt-/Kostenstellenauswahl** | Dropdown: Projekt/Auftrag beim Stempeln auswählen      |
| **Notizfeld**                     | Freitext-Notiz pro Arbeitseinheit                      |
| **Session-Verlauf**               | Tabellarische Anzeige heutiger Buchungen               |
| **Urlaubsantrag**                 | Datum wählen, Tage eingeben, Antrag absenden           |
| **Urlaubssaldo**                  | Verbleibende Urlaubstage anzeigen                      |
| **Auto-Abmeldung**                | 60 Sekunden Inaktivität → automatischer Logout         |
| **Auto-Arbeit-Stopp**             | Toggle: Arbeit bei Schichtende automatisch stoppen     |
| **App-Update**                    | APK-Download vom Server + automatische Installation    |
| **Server-Konfiguration**          | URL über Einstellungsbildschirm änderbar               |

### 13.6 Berechtigungen (AndroidManifest)

| Berechtigung               | Zweck                                       |
| -------------------------- | ------------------------------------------- |
| `INTERNET`                 | API-Kommunikation mit Backend               |
| `REQUEST_INSTALL_PACKAGES` | Automatisches App-Update (APK-Installation) |
| `WRITE_EXTERNAL_STORAGE`   | APK-Download (bis Android 9)                |

### 13.7 Datenhaltung auf dem Gerät

| Speicher                         | Inhalt                                                                   |
| -------------------------------- | ------------------------------------------------------------------------ |
| SharedPreferences `AppPrefs`     | `user_id`, `first_name`, `last_name`, `rfid`, `SERVER_URL`, `firstLogin` |
| SharedPreferences `UserSession`  | Backup der Session-Daten                                                 |
| `config.xml` (interner Speicher) | `server_address`, `usb_chip_reader` (persistiert über App-Updates)       |

### 13.8 Einschränkungen & offene Punkte

| Punkt                        | Beschreibung                                          |
| ---------------------------- | ----------------------------------------------------- |
| Kein Offline-Modus           | Alle Aktionen erfordern aktive Serververbindung       |
| Nur Landscape                | Für Terminal-Betrieb ausgelegt, nicht für Smartphones |
| Java (kein Kotlin)           | Keine Kotlin-Migration durchgeführt                   |
| minSdk 31                    | Nur Android 12 und neuer unterstützt                  |
| Kein automatisiertes Testing | Keine Espresso- oder Unit-Tests vorhanden             |
| Package-Name                 | Noch `com.example.*` – nicht produktionsreif benannt  |
| Update-Mechanismus           | APK-Selbst-Installation (keine Play-Store-Verteilung) |

---

_Ende des technischen Datenblatts_
