Files
rentman-clone/.a0/requirements.md
T

1093 lines
48 KiB
Markdown
Raw Normal View History

# Funktionaler Anforderungskatalog Rentman.io Klon
> **Version:** 1.0
> **Datum:** 2026-05-31
> **Projekt:** Rentman.io-Nachbau mit ≥90% Funktionsumfang
> **Autor:** Requirements Analyst (A0 Software Orchestrator)
---
## Inhaltsverzeichnis
1. [Projektübersicht & Vision](#1-projektübersicht--vision)
2. [Systemkontext & Benutzerrollen](#2-systemkontext--benutzerrollen)
3. [Datenmodell Kernentitäten & Beziehungen](#3-datenmodell--kernentitäten--beziehungen)
4. [Funktionale Anforderungen User Stories](#4-funktionale-anforderungen--user-stories)
- [4.1 Projektmanagement](#41-projektmanagement)
- [4.2 Equipment-Management](#42-equipment-management)
- [4.3 Crew & Personal](#43-crew--personal)
- [4.4 Fahrzeuge & Transport](#44-fahrzeuge--transport)
- [4.5 Kunden & Kontakte](#45-kunden--kontakte)
- [4.6 Finanzen](#46-finanzen)
- [4.7 Projektanfragen](#47-projektanfragen)
- [4.8 Scheduling & Zeitplanung](#48-scheduling--zeitplanung)
- [4.9 Dokumenten-Management](#49-dokumenten-management)
- [4.10 Benutzer & Rollen](#410-benutzer--rollen)
- [4.11 Reporting & Analytik](#411-reporting--analytik)
- [4.12 Mobile App](#412-mobile-app)
- [4.13 Integrationen](#413-integrationen)
5. [UI-Komponenten-Matrix](#5-ui-komponenten-matrix)
6. [Nicht-funktionale Anforderungen](#6-nicht-funktionale-anforderungen)
7. [Annahmen](#7-annahmen)
8. [Nicht-Ziele (Out of Scope)](#8-nicht-ziele-out-of-scope)
9. [Offene Fragen](#9-offene-fragen)
---
## 1. Projektübersicht & Vision
**Rentman.io** ist eine projektzentrische SaaS-Plattform für die Vermietungs- und Event-Branche (AV, Licht, Ton, Bühne). Die Kernphilosophie: **Alles gehört zu einem Projekt.**
### Vision für den Klon
Ein eigenständiger, voll funktionsfähiger Nachbau mit:
- Webanwendung (Desktop + Tablet)
- Mobile App (PWA oder nativ)
- REST API
- Multi-Tenant-Fähigkeit (mehrere Firmen/Accounts)
- ≥90% Funktionsumfang des Originals
### Zielgruppe
- AV- und Event-Technik-Verleiher
- Event-Agenturen mit eigenem Equipment-Pool
- Messebau-Firmen
- Klein- bis Mittelständische Betriebe sowie größere Verleihhäuser
---
## 2. Systemkontext & Benutzerrollen
### System-Kontext-Diagramm (textuell)
```
┌──────────────────────────────────────────────────────────┐
│ Rentman-Klon │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌─────────┐ │
│ │ Projekte │ │Equipment │ │ Crew │ │Fahrzeuge│ │
│ └────┬─────┘ └────┬─────┘ └────┬─────┘ └────┬────┘ │
│ └──────────────┴────────────┴──────────────┘ │
│ │ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Finanzen │ │Kontakte │ │Dokumente │ │
│ └──────────┘ └──────────┘ └──────────┘ │
│ │
│ ┌──────────────────────────────────────────────────┐ │
│ │ REST API / Webhooks │ │
│ └──────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────┘
│ │ │
┌────┴────┐ ┌────┴────┐ ┌─────┴──────┐
│ Web UI │ │Mobile App│ │ Externe │
│(Desktop)│ │(PWA) │ │ Systeme │
└─────────┘ └─────────┘ └────────────┘
```
### Benutzerrollen
| Rolle | Beschreibung | Zentrale Berechtigungen |
|-------|-------------|------------------------|
| **Admin** | Vollzugriff auf alle Module und Einstellungen | Benutzerverwaltung, Systemkonfiguration, Abrechnung |
| **Projektleiter** | Verwaltet eigene Projekte, Crew und Equipment | Projekte CRUD, Crew-Zuweisung, Finanzübersicht |
| **Lagerist** | Equipment-Tracking, Packlisten, Status-Updates | Equipment-Scanning, Status-Änderung, Lagerort |
| **Freelancer** | Eingeschränkter Datenzugriff, Anwesenheit melden | Projekt-Details (read-only), eigene Verfügbarkeit, Aufgaben |
| **Kunde (Gast)** | Projektanfragen stellen, Angebote einsehen | Projektanfrage-Portal, Angebots-Download |
---
## 3. Datenmodell Kernentitäten & Beziehungen
### Entitäten-Diagramm (textuell)
```
Account (Tenant)
├─ User (Benutzer)
│ └─ Role (Rolle)
├─ Contact (Kontakt: Firma/Person)
├─ Project (Projekt)
│ ├─ Subproject (Subprojekt)
│ ├─ ProjectFunctionGroup (Funktionsgruppe)
│ │ └─ ProjectFunction (Funktion: Crew/Equipment)
│ │ └─ ProjectCrew (Crew-Zuweisung)
│ │ └─ Rate (Preis/Kosten)
│ ├─ ProjectEquipmentGroup (Equipment-Gruppe im Projekt)
│ │ └─ ProjectEquipment (Equipment-Position)
│ ├─ Quote (Angebot)
│ ├─ Invoice (Rechnung)
│ └─ ProjectRequest (Projektanfrage)
│ └─ ProjectRequestEquipment (Equipment in Anfrage)
├─ Equipment (Equipment-Katalog)
│ ├─ EquipmentGroup (Bundle/Set)
│ ├─ StockLocation (Lagerort)
│ └─ EquipmentStatusLog (Tracking-Log)
├─ Crew (Crew-Mitglied)
│ └─ CrewAvailability (Verfügbarkeit)
├─ Vehicle (Fahrzeug)
│ └─ VehicleAssignment (Fahrzeug-Zuweisung)
├─ Document (Dokument/Datei)
└─ Tag (Schlagwörter/Farben)
```
### Felddefinitionen pro Entität
#### Project
| Feld | Typ | Beschreibung | Pflicht |
|------|-----|-------------|---------|
| id | UUID | Eindeutige ID | Auto |
| name | String(255) | Projektname | ✅ |
| reference | String(50) | Externe Referenz (z.B. Auftragsnummer) | |
| number | String(50) | Interne Projektnummer (auto-inkrement) | Auto |
| displayname | String | Anzeigename | Auto |
| customer | FK→Contact | Auftraggeber (Firma oder Person) | |
| contact_person | FK→Contact | Ansprechpartner beim Kunden | |
| account_manager | FK→User | Verantwortlicher Projektleiter | |
| project_type | Enum | Projekttyp (z.B. Vermietung, Dienstleistung, Verkauf) | |
| planperiod_start | DateTime | Planungsbeginn (Logistik) | ✅ |
| planperiod_end | DateTime | Planungsende (Logistik) | ✅ |
| usageperiod_start | DateTime | Nutzungsbeginn (vor Ort) | ✅ |
| usageperiod_end | DateTime | Nutzungsende (vor Ort) | ✅ |
| status | Enum | Status (Anfrage, Geplant, Bestätigt, Aktiv, Abgeschlossen, Storniert) | |
| location_name | String(255) | Veranstaltungsort | |
| location_street | String(255) | Straße | |
| location_city | String(100) | Stadt | |
| location_postalcode | String(20) | PLZ | |
| location_country | String(100) | Land | |
| remark | Text | Interne Bemerkung | |
| price | Decimal | Gesamtpreis (kalkuliert) | Readonly |
| cost | Decimal | Gesamtkosten (kalkuliert) | Readonly |
| created_at | DateTime | Erstellungsdatum | Auto |
| updated_at | DateTime | Letzte Änderung | Auto |
| archived | Boolean | Archiviert | |
#### Subproject
| Feld | Typ | Beschreibung | Pflicht |
|------|-----|-------------|---------|
| id | UUID | Eindeutige ID | Auto |
| project | FK→Project | Übergeordnetes Projekt | ✅ |
| name | String(255) | Subprojekt-Name | ✅ |
| custom | JSON | Benutzerdefinierte Felder | |
#### ProjectFunctionGroup
| Feld | Typ | Beschreibung | Pflicht |
|------|-----|-------------|---------|
| id | UUID | Eindeutige ID | Auto |
| project | FK→Project | Zugehöriges Projekt | ✅ |
| subproject | FK→Subproject | Zugehöriges Subprojekt (optional) | |
| name | String(255) | Name (z.B. "Ton", "Licht") | ✅ |
| usageperiod_start | DateTime | Nutzungsbeginn (überschreibt Projekt) | |
| usageperiod_end | DateTime | Nutzungsende (überschreibt Projekt) | |
| planperiod_start | DateTime | Planungsbeginn (überschreibt Projekt) | |
| planperiod_end | DateTime | Planungsende (überschreibt Projekt) | |
| remark | Text | Bemerkung | |
#### ProjectFunction
| Feld | Typ | Beschreibung | Pflicht |
|------|-----|-------------|---------|
| id | UUID | Eindeutige ID | Auto |
| project | FK→Project | Zugehöriges Projekt | ✅ |
| subproject | FK→Subproject | Subprojekt (optional) | |
| group | FK→ProjectFunctionGroup | Funktionsgruppe (optional) | |
| name | String(255) | Funktionsname (z.B. "Tontechniker", "PA-Anlage") | ✅ |
| type | Enum | crew_function / equipment_function / transport_function | ✅ |
| amount | Integer | Anzahl | |
| usageperiod_start | DateTime | Individueller Nutzungsbeginn | |
| usageperiod_end | DateTime | Individuelles Nutzungsende | |
| planperiod_start | DateTime | Individueller Planungsbeginn | |
| planperiod_end | DateTime | Individuelles Planungsende | |
| cost_rate | Decimal | Interner Kostensatz | |
| price_rate | Decimal | Verkaufspreissatz | |
| remark | Text | Bemerkung | |
#### ProjectEquipmentGroup
| Feld | Typ | Beschreibung | Pflicht |
|------|-----|-------------|---------|
| id | UUID | Eindeutige ID | Auto |
| project | FK→Project | Zugehöriges Projekt | ✅ |
| subproject | FK→Subproject | Subprojekt (optional) | |
| name | String(255) | Gruppenname (z.B. "Audio") | ✅ |
| usageperiod_start | DateTime | Nutzungsbeginn | |
| usageperiod_end | DateTime | Nutzungsende | |
| planperiod_start | DateTime | Planungsbeginn | |
| planperiod_end | DateTime | Planungsende | |
| in_price_calculation | Boolean | In Preiskalkulation einbeziehen | |
| remark | Text | Bemerkung | |
#### ProjectEquipment
| Feld | Typ | Beschreibung | Pflicht |
|------|-----|-------------|---------|
| id | UUID | Eindeutige ID | Auto |
| equipment_group | FK→ProjectEquipmentGroup | Zugehörige Equipment-Gruppe | ✅ |
| equipment | FK→Equipment | Verknüpfter Equipment-Artikel | |
| name | String(255) | Freitext-Name (wenn kein Equipment verknüpft) | ✅ |
| quantity | Integer | Geplante Menge | ✅ |
| quantity_total | Integer | Verfügbare Gesamtmenge | |
| unit_price | Decimal | Einzelpreis | |
| discount | Decimal | Rabatt in % | |
| external_remark | Text | Externe Bemerkung (für Kunden sichtbar) | |
| internal_remark | Text | Interne Bemerkung | |
#### Equipment (Katalog)
| Feld | Typ | Beschreibung | Pflicht |
|------|-----|-------------|---------|
| id | UUID | Eindeutige ID | Auto |
| name | String(255) | Artikelname | ✅ |
| category | String(100) | Kategorie (Licht, Ton, Video, Rigging...) | |
| brand | String(100) | Hersteller/Marke | |
| model | String(100) | Modellbezeichnung | |
| serial_number | String(100) | Seriennummer | |
| barcode | String(100) | Barcode/QR-Code | Unique |
| qr_code | String(100) | QR-Code (alternativ zum Barcode) | Unique |
| stock_location | FK→StockLocation | Standard-Lagerort | |
| status | Enum | Verfügbar, In Wartung, Defekt, Ausgemustert | |
| purchase_price | Decimal | Einkaufspreis | |
| current_value | Decimal | Aktueller Wert (mit Abschreibung) | |
| weight_kg | Decimal | Gewicht in kg | |
| dimensions_cm | String(50) | Maße (L×B×H) | |
| power_watt | Integer | Leistungsaufnahme in Watt | |
| custom_fields | JSON | Benutzerdefinierte Felder | |
| notes | Text | Notizen | |
| image_url | URL | Bild-URL | |
#### StockLocation
| Feld | Typ | Beschreibung | Pflicht |
|------|-----|-------------|---------|
| id | UUID | Eindeutige ID | Auto |
| name | String(100) | Bezeichnung (z.B. "Regal A3", "Halle 2") | ✅ |
| address | String(255) | Adresse (falls externes Lager) | |
| is_default | Boolean | Standardlager | |
#### Crew
| Feld | Typ | Beschreibung | Pflicht |
|------|-----|-------------|---------|
| id | UUID | Eindeutige ID | Auto |
| first_name | String(100) | Vorname | ✅ |
| last_name | String(100) | Nachname | ✅ |
| email | Email | E-Mail | |
| phone | String(50) | Telefon | |
| type | Enum | internal / freelancer | ✅ |
| user | FK→User | Verknüpfter Benutzeraccount (optional) | |
| hourly_rate | Decimal | Stundensatz | |
| daily_rate | Decimal | Tagessatz | |
| skills | JSON | Fähigkeiten/Tags (z.B. ["Ton", "Licht"]) | |
| is_active | Boolean | Aktiv/Inaktiv | |
| note | Text | Interne Notiz | |
#### CrewAvailability
| Feld | Typ | Beschreibung | Pflicht |
|------|-----|-------------|---------|
| id | UUID | Eindeutige ID | Auto |
| crew | FK→Crew | Crew-Mitglied | ✅ |
| start | DateTime | Beginn der Unverfügbarkeit / Verfügbarkeit | ✅ |
| end | DateTime | Ende | ✅ |
| type | Enum | available / unavailable / tentative | |
| reason | String(255) | Grund (Urlaub, gebucht, Krank...) | |
#### Vehicle
| Feld | Typ | Beschreibung | Pflicht |
|------|-----|-------------|---------|
| id | UUID | Eindeutige ID | Auto |
| name | String(100) | Fahrzeugname | ✅ |
| license_plate | String(20) | Kennzeichen | |
| type | String(50) | Typ (LKW, Sprinter, PKW) | |
| payload_kg | Integer | Zuladung in kg | |
| volume_m3 | Decimal | Ladevolumen in m³ | |
| is_active | Boolean | Aktiv | |
#### VehicleAssignment
| Feld | Typ | Beschreibung | Pflicht |
|------|-----|-------------|---------|
| id | UUID | Eindeutige ID | Auto |
| vehicle | FK→Vehicle | Fahrzeug | ✅ |
| project | FK→Project | Projekt | ✅ |
| start | DateTime | Beginn | ✅ |
| end | DateTime | Ende | ✅ |
| driver | FK→Crew | Fahrer (optional) | |
#### Contact
| Feld | Typ | Beschreibung | Pflicht |
|------|-----|-------------|---------|
| id | UUID | Eindeutige ID | Auto |
| type | Enum | company / person | ✅ |
| company_name | String(255) | Firmenname (wenn type=company) | * |
| first_name | String(100) | Vorname | * |
| last_name | String(100) | Nachname | * |
| email | Email | E-Mail | |
| phone | String(50) | Telefon | |
| mobile | String(50) | Mobil | |
| street | String(255) | Straße | |
| number | String(20) | Hausnummer | |
| postalcode | String(20) | PLZ | |
| city | String(100) | Stadt | |
| country | String(100) | Land | |
| tax_number | String(50) | USt-ID / Steuernummer | |
| note | Text | Notiz | |
#### ProjectRequest (Projektanfrage)
| Feld | Typ | Beschreibung | Pflicht |
|------|-----|-------------|---------|
| id | UUID | Eindeutige ID | Auto |
| name | String(255) | Anfragename/Eventname | ✅ |
| contact_name | String(255) | Name des Anfragenden | |
| contact_person_first_name | String(100) | Vorname Ansprechpartner | |
| contact_person_lastname | String(100) | Nachname Ansprechpartner | |
| contact_person_email | Email | E-Mail Ansprechpartner | |
| location_name | String(255) | Veranstaltungsort | |
| location_mailing_street | String(255) | Straße | |
| location_mailing_number | String(20) | Hausnummer | |
| location_mailing_postalcode | String(20) | PLZ | |
| location_mailing_city | String(100) | Stadt | |
| location_mailing_country | String(100) | Land | |
| planperiod_start | DateTime | Planungsbeginn | |
| planperiod_end | DateTime | Planungsende | |
| usageperiod_start | DateTime | Nutzungsbeginn | |
| usageperiod_end | DateTime | Nutzungsende | |
| status | Enum | Neu, In Bearbeitung, Konvertiert, Abgelehnt | Auto |
| remark | Text | Bemerkung | |
#### ProjectRequestEquipment
| Feld | Typ | Beschreibung | Pflicht |
|------|-----|-------------|---------|
| id | UUID | Eindeutige ID | Auto |
| project_request | FK→ProjectRequest | Zugehörige Anfrage | ✅ |
| name | String(255) | Equipment-Name | ✅ |
| quantity | Integer | Menge | ✅ |
| quantity_total | Integer | Gesamtmenge | |
| unit_price | Decimal | Einzelpreis | |
| linked_equipment | FK→Equipment | Verknüpftes Equipment (optional) | |
#### Quote (Angebot)
| Feld | Typ | Beschreibung | Pflicht |
|------|-----|-------------|---------|
| id | UUID | Eindeutige ID | Auto |
| project | FK→Project | Zugehöriges Projekt | ✅ |
| number | String(50) | Angebotsnummer | Auto |
| status | Enum | Draft, Versendet, Angenommen, Abgelehnt | |
| valid_until | Date | Gültig bis | |
| template | String(50) | Template-Name | |
| content_html | Text | Generierter Inhalt | Readonly |
| total_net | Decimal | Netto-Gesamt | Readonly |
| total_gross | Decimal | Brutto-Gesamt | Readonly |
| created_at | DateTime | Erstellungsdatum | Auto |
#### Invoice (Rechnung)
| Feld | Typ | Beschreibung | Pflicht |
|------|-----|-------------|---------|
| id | UUID | Eindeutige ID | Auto |
| project | FK→Project | Zugehöriges Projekt | ✅ |
| number | String(50) | Rechnungsnummer | Auto |
| status | Enum | Draft, Versendet, Bezahlt, Überfällig, Storniert | |
| due_date | Date | Fälligkeitsdatum | |
| total_net | Decimal | Netto-Gesamt | Readonly |
| total_gross | Decimal | Brutto-Gesamt | Readonly |
| created_at | DateTime | Erstellungsdatum | Auto |
---
## 4. Funktionale Anforderungen User Stories
### 4.1 Projektmanagement
#### PM-01: Projekt anlegen
**Als** Projektleiter **möchte ich** ein neues Projekt mit grundlegenden Informationen anlegen, **damit** es als zentraler Container für alle Planungen dient.
**Akzeptanzkriterien:**
- [ ] Formular mit Feldern: Name*, Referenz, Nummer, Kunde, Projekttyp, Planungszeitraum*, Nutzungszeitraum*, Ort, Bemerkung
- [ ] Pflichtfelder werden validiert (clientseitig + serverseitig)
- [ ] Bei erfolgreicher Erstellung: Redirect auf Projekt-Detailseite
- [ ] Automatische Nummerngenerierung (konfigurierbares Präfix + laufende Nummer)
- [ ] Planungszeitraum und Nutzungszeitraum können unabhängig gesetzt werden
#### PM-02: Projekt bearbeiten
**Als** Projektleiter **möchte ich** ein bestehendes Projekt bearbeiten können, **damit** ich Änderungen nachtragen kann.
**Akzeptanzkriterien:**
- [ ] Alle Felder editierbar (außer systemgenerierte)
- [ ] Änderungen werden sofort persistiert
- [ ] Bei Datumsänderung: Warnung, falls Equipment/Crew bereits zugewiesen ist
#### PM-03: Projekt löschen/archivieren
**Als** Admin **möchte ich** Projekte löschen oder archivieren können, **damit** inaktive Projekte nicht die Übersicht stören.
**Akzeptanzkriterien:**
- [ ] Löschen: Nur möglich, wenn keine Rechnungen verknüpft sind → Soft-Delete
- [ ] Archivieren: Projekt in "Archiv" verschieben, alle Verknüpfungen bleiben erhalten
- [ ] Bestätigungsdialog vor Löschung
#### PM-04: Projektliste mit Filtern
**Als** Projektleiter **möchte ich** eine filterbare, sortierbare Projektliste sehen, **damit** ich schnell relevante Projekte finde.
**Akzeptanzkriterien:**
- [ ] Spalten: Name, Nummer, Kunde, Status, Zeitraum, Preis
- [ ] Filter: Status, Kunde, Projekttyp, Datum (von/bis), Suchtext
- [ ] Sortierung: Klick auf Spaltenkopf (auf-/absteigend)
- [ ] Paginierung (25/50/100 pro Seite)
- [ ] Gesamtzahl der Projekte wird angezeigt
#### PM-05: Subprojekte verwalten
**Als** Projektleiter **möchte ich** innerhalb eines Projekts Subprojekte anlegen, **damit** ich große Events in logische Einheiten unterteilen kann.
**Akzeptanzkriterien:**
- [ ] Subprojekt anlegen mit Name
- [ ] Subprojekt löschen (leer oder inkl. Inhalt)
- [ ] Subprojekte in Baumstruktur unter dem Hauptprojekt
- [ ] Anzahl Subprojekte unbegrenzt
#### PM-06: Projekt-Funktionsgruppen und Funktionen
**Als** Projektleiter **möchte ich** Funktionsgruppen (z.B. "Ton", "Licht") und darin Funktionen (z.B. "Tontechniker", "PA-Anlage") definieren, **damit** ich den Personal- und Equipment-Bedarf strukturiere.
**Akzeptanzkriterien:**
- [ ] Funktionsgruppe anlegen: Name, Subprojekt, eigene Zeiträume, Bemerkung
- [ ] Funktion anlegen: Name, Typ (crew/equipment/transport), Anzahl, Zeiträume, Kosten-/Preissatz
- [ ] Drag-and-Drop von Funktionen zwischen Gruppen
- [ ] Zeiträume von Gruppen auf Funktionen vererbt (überschreibbar)
- [ ] Summierung der Funktionen pro Gruppe und gesamt
#### PM-07: Projekt-Status-Workflow
**Als** Projektleiter **möchte ich** den Projektstatus ändern können, **damit** der Projektfortschritt nachvollziehbar ist.
**Akzeptanzkriterien:**
- [ ] Status-Übergänge: Anfrage → Geplant → Bestätigt → Aktiv → Abgeschlossen
- [ ] Storniert als eigener Status (keine weitere Bearbeitung)
- [ ] Status-Historie protokolliert (wer, wann, alter Status → neuer Status)
- [ ] Status-Änderung löst optionale Benachrichtigung aus
#### PM-08: Projekt-Vorlagen
**Als** Projektleiter **möchte ich** ein Projekt als Vorlage speichern und daraus neue Projekte erstellen, **damit** ich wiederkehrende Events schnell anlegen kann.
**Akzeptanzkriterien:**
- [ ] "Als Vorlage speichern" kopiert Projekt-Struktur (Funktionen, Gruppen, Equipment ohne konkrete Zuweisung)
- [ ] Neues Projekt aus Vorlage: Name und Zeiträume werden gesetzt, Rest übernommen
- [ ] Vorlagen-Liste mit Durchsuchen/Filtern
---
### 4.2 Equipment-Management
#### EQ-01: Equipment-Katalog pflegen
**Als** Lagerist **möchte ich** Equipment-Artikel im Katalog anlegen, bearbeiten und löschen, **damit** der Bestand aktuell bleibt.
**Akzeptanzkriterien:**
- [ ] CRUD für Equipment mit allen Feldern gemäß Datenmodell
- [ ] Barcode/QR-Code automatisch generierbar und manuell setzbar
- [ ] Massen-Import via CSV/Excel
- [ ] Massen-Export in CSV/Excel
- [ ] Bilder-Upload pro Artikel
#### EQ-02: Equipment-Kategorisierung & Suche
**Als** Lagerist **möchte ich** Equipment nach Kategorien filtern und durchsuchen, **damit** ich schnell finde, was ich brauche.
**Akzeptanzkriterien:**
- [ ] Freitextsuche über Name, Marke, Modell, Seriennummer, Barcode
- [ ] Filter: Kategorie, Status, Lagerort
- [ ] Kategorie-Baum (hierarchisch, z.B. Ton → Mikrofone → Funkmikrofone)
- [ ] Anzeige: Kachel-Ansicht + Tabellen-Ansicht
#### EQ-03: Equipment-Gruppen (Bundles)
**Als** Projektleiter **möchte ich** Equipment-Gruppen (Bundles/Sets) definieren, **damit** ich häufig zusammen verliehene Artikel als Einheit planen kann.
**Akzeptanzkriterien:**
- [ ] Bundle anlegen: Name + Liste von Equipment-Artikeln mit Menge
- [ ] Bundle im Projekt wie Einzelartikel planbar
- [ ] Auflösung des Bundles in Einzelartikel bei Verfügbarkeitsprüfung
#### EQ-04: Equipment zum Projekt hinzufügen
**Als** Projektleiter **möchte ich** Equipment direkt aus dem Katalog in eine Equipment-Gruppe des Projekts ziehen, **damit** die Planung schnell erfolgt.
**Akzeptanzkriterien:**
- [ ] Equipment-Gruppe im Projekt anlegen
- [ ] Equipment-Position hinzufügen: Artikel auswählen (Such-Autocomplete), Menge, Preis
- [ ] Optional: Freitext-Position ohne Katalog-Verknüpfung
- [ ] Rabatt pro Position setzbar
- [ ] Drag-and-Drop aus Katalog in Projekt (optional, MVP: Formular)
#### EQ-05: Equipment-Verfügbarkeit prüfen
**Als** Projektleiter **möchte ich** für jedes Equipment sehen, ob es im gewünschten Zeitraum verfügbar ist, **damit** ich Konflikte vermeide.
**Akzeptanzkriterien:**
- [ ] Timeline-Ansicht pro Artikel: Belegungsblöcke
- [ ] Konflikt-Indikator in Equipment-Position (rot/grün/gelb)
- [ ] Massen-Verfügbarkeits-Check für ganze Projekte
- [ ] Alternative vorschlagen (gleiche Kategorie, verfügbar)
#### EQ-06: Equipment-Status-Tracking (Logistik)
**Als** Lagerist **möchte ich** den Status jedes Artikels im Projekt ändern, **damit** ich den Logistik-Fortschritt tracken kann.
**Akzeptanzkriterien:**
- [ ] Status: Geplant → (Gepackt) → Vor Ort → (Zurück) → Eingelagert
- [ ] Zusätzliche Stati: Verspätet, Fehlend, Beschädigt
- [ ] Status-Änderung via Web-UI (Klick) oder Barcode-Scan (Mobile App)
- [ ] Status-Historie pro Artikel und Projekt
#### EQ-07: QR/Barcode-Generierung und Scan
**Als** Lagerist **möchte ich** Barcodes/QR-Codes für Equipment drucken und scannen, **damit** das Tracking effizient ist.
**Akzeptanzkriterien:**
- [ ] Barcode/QR-Code pro Equipment-Item (Unique-ID-basiert)
- [ ] Druck-Layout: Label mit Name, Code, optional Projekt
- [ ] Scan via Mobile-App-Kamera oder USB-Barcode-Scanner
- [ ] Scan-Aktion: Status ändern, Info anzeigen
#### EQ-08: Lagerort-Verwaltung
**Als** Lagerist **möchte ich** Lagerorte definieren und Equipment zuweisen, **damit** ich weiß, wo sich Artikel befinden.
**Akzeptanzkriterien:**
- [ ] CRUD für Lagerorte: Name, Adresse
- [ ] Equipment: Standard-Lagerort + aktueller Standort
- [ ] Lagerort-Übersicht: Welches Equipment liegt wo?
---
### 4.3 Crew & Personal
#### CR-01: Crew-Katalog pflegen
**Als** Projektleiter **möchte ich** Crew-Mitglieder (intern + Freelancer) im Katalog verwalten, **damit** ich sie Projekten zuweisen kann.
**Akzeptanzkriterien:**
- [ ] CRUD für Crew: Name, Kontakt, Typ, Stundensatz/Tagessatz, Skills
- [ ] Unterscheidung intern/Freelancer
- [ ] Skills als Tags (Mehrfachauswahl)
- [ ] CSV-Import/Export
#### CR-02: Crew zu Projektfunktion zuweisen
**Als** Projektleiter **möchte ich** ein Crew-Mitglied einer Projektfunktion (z.B. "Tontechniker") zuweisen, **damit** die Personalplanung abgeschlossen ist.
**Akzeptanzkriterien:**
- [ ] Projektfunktion als Crew-Funktion definiert (type=crew_function)
- [ ] Crew-Auswahl per Dropdown/Suche
- [ ] Warnung bei Verfügbarkeitskonflikt
- [ ] Mehrere Crew pro Funktion (wenn amount > 1)
#### CR-03: Crew-Verfügbarkeitsplanung
**Als** Projektleiter **möchte ich** die Verfügbarkeit der Crew im Projektzeitraum sehen, **damit** ich keine Doppelbuchungen mache.
**Akzeptanzkriterien:**
- [ ] Kalender-Ansicht pro Crew-Mitglied
- [ ] Unverfügbarkeiten eintragen: Datum, Typ, Grund
- [ ] Konflikt-Erkennung bei Zuweisung
- [ ] Monats-/Wochenübersicht für alle Crew
#### CR-04: Freelancer-Self-Service
**Als** Freelancer **möchte ich** meine Verfügbarkeit selbst eintragen und meine Projekte einsehen, **damit** ich selbstbestimmt planen kann.
**Akzeptanzkriterien:**
- [ ] Freelancer-Login (eingeschränkter Zugang)
- [ ] Eigene Verfügbarkeit eintragen/bearbeiten
- [ ] Zugewiesene Projekte sehen (read-only)
- [ ] Eigene Kontaktdaten bearbeiten
---
### 4.4 Fahrzeuge & Transport
#### FH-01: Fahrzeug-Katalog pflegen
**Als** Admin **möchte ich** Fahrzeuge im Katalog verwalten, **damit** Transport geplant werden kann.
**Akzeptanzkriterien:**
- [ ] CRUD: Name, Kennzeichen, Typ, Zuladung, Volumen
- [ ] Aktiv/Inaktiv-Status
#### FH-02: Fahrzeug zu Projekt zuweisen
**Als** Projektleiter **möchte ich** ein Fahrzeug einem Projekt zuweisen, **damit** der Transport gesichert ist.
**Akzeptanzkriterien:**
- [ ] Zuweisung: Fahrzeug + Projekt + Zeitraum + Fahrer
- [ ] Verfügbarkeitsprüfung (keine Doppelzuweisung)
- [ ] Anzeige im Projekt als Transport-Funktion
#### FH-03: Transport-Planungsübersicht
**Als** Projektleiter **möchte ich** eine Übersicht aller Fahrzeug-Zuweisungen, **damit** ich Transportkonflikte erkenne.
**Akzeptanzkriterien:**
- [ ] Kalender-Ansicht mit allen Fahrzeugen
- [ ] Farbcodierung: eigenes Projekt vs. andere
- [ ] Filter: Fahrzeug, Zeitraum
---
### 4.5 Kunden & Kontakte
#### KK-01: Kontakte verwalten
**Als** Projektleiter **möchte ich** Firmen und Personen als Kontakte speichern, **damit** ich sie Projekten zuweisen kann.
**Akzeptanzkriterien:**
- [ ] CRUD für Firmen (company) und Personen (person)
- [ ] Beziehung: Ansprechpartner (Person) gehört zu Firma (Company)
- [ ] Suche und Filter
- [ ] Verknüpfte Projekte anzeigen ("Welche Projekte hat Kunde X?")
#### KK-02: Kunde zum Projekt zuweisen
**Als** Projektleiter **möchte ich** einen Kontakt als Kunden im Projekt setzen, **damit** die Zuordnung klar ist.
**Akzeptanzkriterien:**
- [ ] Kunden-Auswahl per Autocomplete-Suche
- [ ] Adresse des Kunden als Veranstaltungsort übernehmbar
- [ ] Ansprechpartner separat wählbar
---
### 4.6 Finanzen
#### FI-01: Preiskalkulation im Projekt
**Als** Projektleiter **möchte ich** dass das System automatisch Gesamtpreise kalkuliert, **damit** ich Angebote auf Basis der Planung erstellen kann.
**Akzeptanzkriterien:**
- [ ] Equipment-Positionen: Menge × Einzelpreis
- [ ] Crew-Funktionen: amount × Tagessatz/Stundensatz × Dauer
- [ ] Transport: Preis pro Fahrzeug
- [ ] Rabatte auf Positionen und global
- [ ] Steuer-Berechnung (MwSt. konfigurierbar)
- [ ] Echtzeit-Aktualisierung bei Änderungen
#### FI-02: Angebote erstellen und verwalten
**Als** Projektleiter **möchte ich** ein Angebot aus der Projektplanung generieren, **damit** ich es dem Kunden senden kann.
**Akzeptanzkriterien:**
- [ ] Angebot aus Projekt generieren: Alle Positionen übernehmen
- [ ] Angebots-Template auswählen
- [ ] Status: Entwurf → Versendet → Angenommen/Abgelehnt
- [ ] PDF-Export und E-Mail-Versand
- [ ] Angebots-Historie pro Projekt (Versionen)
#### FI-03: Rechnungen erstellen und verwalten
**Als** Projektleiter **möchte ich** aus einem angenommenen Angebot eine Rechnung erstellen, **damit** ich abrechnen kann.
**Akzeptanzkriterien:**
- [ ] Rechnung aus Angebot generieren (Positionen übernehmen)
- [ ] Teil-Rechnungen möglich (z.B. 50% Anzahlung)
- [ ] Rechnungsstatus: Entwurf → Versendet → Bezahlt/Überfällig/Storniert
- [ ] Mahnwesen: Überfällige Rechnungen markieren, Mahnung generieren
- [ ] PDF-Export und E-Mail-Versand
- [ ] Nummernkreis automatisch (konfigurierbar)
#### FI-04: Währung & Steuern konfigurieren
**Als** Admin **möchte ich** Währung und Steuersätze global und pro Projekt konfigurieren, **damit** die Finanzberechnung korrekt ist.
**Akzeptanzkriterien:**
- [ ] Standardwährung setzen (EUR, USD, CHF...)
- [ ] Standard-Steuersatz (z.B. 19%)
- [ ] Projekt kann abweichenden Steuersatz haben
#### FI-05: Finanz-Übersicht
**Als** Admin **möchte ich** eine Übersicht über offene Posten und Einnahmen, **damit** ich die Liquidität im Blick habe.
**Akzeptanzkriterien:**
- [ ] Dashboard: Offene Rechnungen, Umsatz (Monat/Jahr), Top-Kunden
- [ ] Filter: Zeitraum, Projektstatus
- [ ] Export-Funktion
---
### 4.7 Projektanfragen (Project Requests)
#### PA-01: Projektanfrage einreichen (Kunden-Portal)
**Als** potenzieller Kunde **möchte ich** über ein öffentliches Formular eine Projektanfrage stellen, **damit** ich ein Angebot erhalte.
**Akzeptanzkriterien:**
- [ ] Öffentliches Formular (ohne Login): Event-Name, Kontaktdaten, Ort, Zeitraum, Bemerkung
- [ ] Validierung der Pflichtfelder
- [ ] Bestätigungs-E-Mail nach Einreichung
#### PA-02: Equipment zur Anfrage hinzufügen
**Als** Kunde **möchte ich** gewünschtes Equipment in der Anfrage auflisten, **damit** der Anbieter meinen Bedarf kennt.
**Akzeptanzkriterien:**
- [ ] Positionen hinzufügen: Name, Menge, optionaler Einzelpreis
- [ ] Mehrere Positionen möglich
- [ ] Möglichkeit, auf existierende Katalog-Artikel zu verweisen
#### PA-03: Anfrage prüfen und in Projekt konvertieren
**Als** Projektleiter **möchte ich** eine eingegangene Anfrage prüfen und in ein Projekt umwandeln, **damit** die Planung beginnen kann.
**Akzeptanzkriterien:**
- [ ] Anfrage-Liste mit Status
- [ ] Detailansicht der Anfrage mit allen Positionen
- [ ] "In Projekt umwandeln": Neues Projekt aus Anfrage-Daten erstellen
- [ ] Equipment-Positionen in Projekt übernehmen
- [ ] Status der Anfrage auf "Konvertiert" setzen
---
### 4.8 Scheduling & Zeitplanung
#### SC-01: Projekt-Timeline (Gantt-Ansicht)
**Als** Projektleiter **möchte ich** eine visuelle Timeline aller Projekte sehen, **damit** ich Überschneidungen erkenne.
**Akzeptanzkriterien:**
- [ ] Horizontale Zeitleiste: Monate/Wochen/Tage
- [ ] Jedes Projekt als Balken (Planungszeitraum + Nutzungszeitraum)
- [ ] Farbcodierung nach Status oder Projekttyp
- [ ] Drag-and-Drop: Projektzeitraum ändern
- [ ] Zoom: Jahr, Monat, Woche, Tag
#### SC-02: Equipment/Crew-Timeline (Ressourcen-Ansicht)
**Als** Projektleiter **möchte ich** in der Timeline sehen, welche Ressourcen belegt sind, **damit** ich Engpässe erkenne.
**Akzeptanzkriterien:**
- [ ] Gruppierung: Equipment / Crew / Fahrzeuge
- [ ] Belegungsblöcke pro Ressource
- [ ] Konflikt-Hervorhebung (rot)
- [ ] Filter nach Kategorie/Typ
#### SC-03: Kalender-Integration
**Als** Projektleiter **möchte ich** Projekte und Aufgaben in meinem externen Kalender sehen, **damit** ich alles an einem Ort habe.
**Akzeptanzkriterien:**
- [ ] iCal/CalDAV-Feed pro Benutzer
- [ ] Abonnement-Link für Google Calendar, Outlook, Apple Calendar
- [ ] Option: Öffentlicher Projekt-Kalender
#### SC-04: Aufgaben-Management
**Als** Projektleiter **möchte ich** Aufgaben innerhalb eines Projekts anlegen und zuweisen, **damit** nichts vergessen wird.
**Akzeptanzkriterien:**
- [ ] Aufgaben-CRUD: Titel, Beschreibung, Fälligkeit, Verantwortlicher, Status
- [ ] Status: Offen, In Bearbeitung, Erledigt
- [ ] Aufgaben-Liste im Projekt und persönliche To-Do-Liste
- [ ] Erinnerungs-E-Mail vor Fälligkeit
---
### 4.9 Dokumenten-Management
#### DO-01: Angebots-Templates verwalten
**Als** Admin **möchte ich** Angebots-Templates mit eigenem Layout und Platzhaltern definieren, **damit** Corporate Design eingehalten wird.
**Akzeptanzkriterien:**
- [ ] HTML/CSS-basierte Templates
- [ ] Platzhalter: {{project_name}}, {{customer_name}}, {{total_price}}, {{items_table}}, etc.
- [ ] Template-Vorschau mit Beispiel-Daten
- [ ] Mehrere Templates speicherbar
#### DO-02: Rechnungs-Templates verwalten
**Als** Admin **möchte ich** Rechnungs-Templates definieren, **damit** Rechnungen dem Corporate Design entsprechen.
**Akzeptanzkriterien:**
- [ ] Wie Angebots-Templates, jedoch mit Rechnungs-spezifischen Platzhaltern
- [ ] Rechtlich korrekte Pflichtangaben
- [ ] Zahlungsbedingungen konfigurierbar
#### DO-03: Digitale Packliste generieren
**Als** Lagerist **möchte ich** eine Packliste aus der Equipment-Planung generieren, **damit** ich weiß, was gepackt werden muss.
**Akzeptanzkriterien:**
- [ ] Packliste: Alle Equipment-Positionen mit Menge und Lagerort
- [ ] Gruppierung: Nach Equipment-Gruppe oder Lagerort
- [ ] Checkboxen zum Abhaken (digital + Druck)
- [ ] PDF-Export
#### DO-04: Lieferscheine generieren
**Als** Projektleiter **möchte ich** einen Lieferschein für das Equipment erstellen, **damit** der Kunde den Empfang quittieren kann.
**Akzeptanzkriterien:**
- [ ] Lieferschein: Equipment-Liste, Projekt-Info, Lieferadresse
- [ ] Unterschriftsfeld
- [ ] PDF-Export
#### DO-05: Allgemeines Dokumenten-Management
**Als** Projektleiter **möchte ich** beliebige Dateien (PDF, Bilder, Pläne) zu einem Projekt hochladen, **damit** alle relevanten Dokumente zentral gespeichert sind.
**Akzeptanzkriterien:**
- [ ] Datei-Upload per Drag-and-Drop
- [ ] Unterstützte Formate: PDF, JPG, PNG, DOCX, XLSX, DWG (mind. Vorschau)
- [ ] Dateien nach Kategorien ordnen
- [ ] Zugriffskontrolle (projektbezogen)
---
### 4.10 Benutzer & Rollen
#### BR-01: Benutzerverwaltung
**Als** Admin **möchte ich** Benutzer anlegen, bearbeiten und deaktivieren, **damit** das Team Zugriff hat.
**Akzeptanzkriterien:**
- [ ] Benutzer-CRUD: Name, E-Mail, Passwort, Rolle
- [ ] Einladungs-Workflow: E-Mail mit Aktivierungslink
- [ ] Passwort-Reset über E-Mail
- [ ] Deaktivierung statt Löschung (Datenintegrität)
#### BR-02: Rollen & Berechtigungen
**Als** Admin **möchte ich** Rollen mit granular steuerbaren Berechtigungen definieren, **damit** jeder nur sieht, was er braucht.
**Akzeptanzkriterien:**
- [ ] Vordefinierte Rollen: Admin, Projektleiter, Lagerist, Freelancer
- [ ] Benutzerdefinierte Rollen möglich
- [ ] Berechtigungen: Modul-Zugriff (read/write/delete), Projekt-Zugriff (alle/eigene)
- [ ] Rollen-Matrix (UI für Konfiguration)
#### BR-03: Benutzer-Aktivitätslog
**Als** Admin **möchte ich** sehen, wer welche Änderungen vorgenommen hat, **damit** es nachvollziehbar bleibt.
**Akzeptanzkriterien:**
- [ ] Log-Einträge: Benutzer, Aktion, Entität, Zeitstempel
- [ ] Filter nach Benutzer, Aktionstyp, Datum
- [ ] Nur für Admins sichtbar
---
### 4.11 Reporting & Analytik
#### RE-01: Dashboard
**Als** Projektleiter **möchte ich** ein Dashboard mit den wichtigsten Kennzahlen sehen, **damit** ich den Überblick behalte.
**Akzeptanzkriterien:**
- [ ] Widgets: Aktive Projekte, Heutige Events, Equipment-Auslastung, Crew-Auslastung, Offene Rechnungen
- [ ] Konfigurierbare Widgets (an/ab wählbar)
- [ ] Daten per Klick in Detail-Ansicht drill-down
#### RE-02: Projekt-Statistiken
**Als** Admin **möchte ich** Statistiken zu Projekten, Umsatz, und Auslastung einsehen, **damit** ich das Geschäft analysieren kann.
**Akzeptanzkriterien:**
- [ ] Umsatz pro Monat/Jahr, pro Kunde, pro Projekttyp
- [ ] Anzahl Projekte nach Status
- [ ] Durchschnittliche Projektdauer
#### RE-03: Equipment-Auslastungsreport
**Als** Lagerist **möchte ich** einen Report über die Equipment-Auslastung, **damit** ich Einkaufsentscheidungen treffen kann.
**Akzeptanzkriterien:**
- [ ] Auslastung pro Artikel (Belegungstage / verfügbare Tage)
- [ ] Top- und Flop-Artikel
- [ ] Zeitraum flexibel wählbar
- [ ] Export als CSV/Excel
#### RE-04: Finanz-Report
**Als** Admin **möchte ich** einen Finanz-Report mit Umsatz und offenen Posten, **damit** ich die Buchhaltung unterstützen kann.
**Akzeptanzkriterien:**
- [ ] Umsatz pro Monat (Ist vs. Plan)
- [ ] Offene Rechnungen mit Alter
- [ ] Kunden-Ranking
---
### 4.12 Mobile App
#### MO-01: Barcode/QR-Code-Scanning
**Als** Lagerist **möchte ich** mit dem Smartphone Equipment scannen, **damit** ich unterwegs Status-Änderungen vornehmen kann.
**Akzeptanzkriterien:**
- [ ] Kamera-Scan von Barcode und QR-Code
- [ ] Nach Scan: Info anzeigen + Aktion wählen (Status ändern, Packen, Einlagern)
- [ ] Vibrations-/Ton-Feedback bei erfolgreichem Scan
#### MO-02: Packliste digital abhaken
**Als** Lagerist **möchte ich** auf der Mobile App die Packliste durchgehen und abhaken, **damit** nichts vergessen wird.
**Akzeptanzkriterien:**
- [ ] Packliste anzeigen (pro Projekt)
- [ ] Checkbox pro Position
- [ ] Fortschrittsbalken (X/Y gepackt)
- [ ] Offline: Letzter Stand lokal gespeichert, Sync bei Verbindung
#### MO-03: Verfügbarkeits-Check mobil
**Als** Projektleiter **möchte ich** unterwegs schnell prüfen, ob Equipment verfügbar ist, **damit** ich beim Kunden direkt antworten kann.
**Akzeptanzkriterien:**
- [ ] Suchfeld mit Autocomplete
- [ ] Ergebnis: Verfügbarkeits-Status (frei/belegt) + Belegungsdetails
#### MO-04: Offline-Fähigkeit
**Als** Lagerist **möchte ich** die App auch ohne Internet nutzen können, **damit** ich in Hallen/Kellern ohne Empfang arbeiten kann.
**Akzeptanzkriterien:**
- [ ] Projektdaten und Equipment-Listen offline cachen
- [ ] Änderungen lokal speichern und bei Verbindung synchronisieren
- [ ] Konflikt-Erkennung: Warnung, wenn Daten zwischenzeitlich geändert wurden
- [ ] Sync-Status-Anzeige
---
### 4.13 Integrationen
#### INT-01: REST API
**Als** Entwickler **möchte ich** eine vollständige REST API, **damit** ich externe Systeme anbinden kann.
**Akzeptanzkriterien:**
- [ ] API-Endpunkte für alle Kernentitäten (≥80% des Datenmodells)
- [ ] Authentifizierung per API-Token (JWT/Bearer)
- [ ] API-Dokumentation (OpenAPI/Swagger)
- [ ] Rate Limiting
- [ ] Versionierung (/api/v1/...)
#### INT-02: Webhooks
**Als** Admin **möchte ich** Webhooks konfigurieren, **damit** externe Systeme automatisch über Ereignisse informiert werden.
**Akzeptanzkriterien:**
- [ ] Webhook-Ereignisse: Projekt erstellt, Status geändert, Rechnung erstellt, Ausrüstung gescannt
- [ ] Webhook-URL + Secret konfigurierbar
- [ ] Retry-Logik bei Fehlschlag
- [ ] Webhook-Log (Erfolg/Fehler)
#### INT-03: Excel/CSV Import/Export
**Als** Admin **möchte ich** Daten via Excel/CSV importieren und exportieren, **damit** ich bestehende Daten migrieren kann.
**Akzeptanzkriterien:**
- [ ] Import: Equipment, Crew, Kontakte
- [ ] Validierung mit Fehlerbericht
- [ ] Dry-Run-Modus (Vorschau)
- [ ] Export: Projektdaten, Equipment-Liste, Reports
---
## 5. UI-Komponenten-Matrix
| Modul | Hauptseiten | Schlüssel-Komponenten | Interaktionsmuster |
|-------|------------|----------------------|-------------------|
| **Projekte** | Liste, Detail, Formular | Filter-Toolbar, Status-Badge, Timeline-Miniatur, Tab-Navigation (Übersicht/Funktionen/Equipment/Crew/Finanzen/Dokumente) | Inline-Editing, Drag-and-Drop für Funktionen |
| **Equipment** | Katalog, Detail, Scan-View | Suchfeld mit Autocomplete, Kachel/Tabelle-Toggle, Barcode-Scan-Button, Verfügbarkeits-Kalender | Barcode-Scan, Massen-Selektion, Drag-in-Projekt |
| **Crew** | Katalog, Detail, Verfügbarkeit | Profilkarte, Skill-Tags, Verfügbarkeits-Kalender | Drag-and-Drop in Projektfunktion |
| **Fahrzeuge** | Katalog, Zuweisung | Fahrzeug-Kachel, Transport-Kalender | Drag-and-Drop in Projekt |
| **Kontakte** | Liste, Detail | Firmen-Baum + Ansprechpartner-Tabelle, Projekt-Verknüpfungen | Inline-Editing |
| **Finanzen** | Angebote-Liste, Rechnungen-Liste, Template-Editor | PDF-Preview, E-Mail-Dialog, Zahlungsstatus-Badge | Template-Builder (WYSIWYG oder HTML) |
| **Anfragen** | Liste, Detail, Konvertierungs-Dialog | Status-Badge, Konvertierungs-Button, Positions-Tabelle | Formular-basiert |
| **Scheduling** | Gantt-Timeline, Kalender | Horizontale Zeitleiste, Drag-and-Drop-Balken, Zoom-Slider, Ressourcen-Filter | Drag-and-Drop, Scroll-Zoom |
| **Dokumente** | Datei-Liste, Template-Editor | Upload-Zone (Drag-and-Drop), Datei-Vorschau, Ordner-Baum | Drag-and-Drop-Upload |
| **Dashboard** | Dashboard-Startseite | Widget-Grid, Drill-Down-Klick, Zeitraum-Filter | Widget-Konfiguration, Responsive Grid |
| **Admin** | Benutzer, Rollen, Einstellungen | Rollen-Matrix (Checkbox-Grid), Aktivitätslog-Tabelle | Matrix-Editor |
| **Mobile App** | Scan, Packliste, Suche | Kamera-View mit Overlay, Checkliste mit Fortschritt, Sync-Status-Indikator | Touch-optimiert, Offline-First |
---
## 6. Nicht-funktionale Anforderungen
### Performance & Skalierbarkeit
| ID | Anforderung | Messkriterium |
|----|------------|---------------|
| NF-P01 | Seiten-Ladezeit | Initial Page Load < 2s (P95), Subsequent Navigation < 500ms |
| NF-P02 | API-Response-Zeit | < 200ms (P95) für GET-Endpunkte, < 500ms für POST/PUT |
| NF-P03 | Datenbank-Abfragen | Maximale Datenmenge: 100.000 Projekte, 500.000 Equipment-Items |
| NF-P04 | Parallelität | Mindestens 50 gleichzeitige Benutzer ohne spürbare Degradation |
| NF-P05 | Offline-Sync | Mobile App: Konflikt-Auflösung bei ≤100 Offline-Änderungen |
### Sicherheit
| ID | Anforderung | Beschreibung |
|----|------------|-------------|
| NF-S01 | Authentifizierung | JWT-basiert, Token-Ablauf konfigurierbar (Standard: 24h), Refresh-Token |
| NF-S02 | Autorisierung | Rollenbasierte Zugriffskontrolle (RBAC) auf Modul- und Objektebene |
| NF-S03 | HTTPS | Ausschließlich TLS 1.3, HSTS-Header |
| NF-S04 | Passwort-Policy | Mindestens 8 Zeichen, Komplexitätsanforderung, bcrypt-Hashing |
| NF-S05 | API-Sicherheit | Rate Limiting (100 req/min pro Token), Input-Validierung, SQL-Injection-Schutz |
| NF-S06 | Daten-Isolation | Multi-Tenant: Strikte Trennung der Account-Daten |
| NF-S07 | Audit-Log | Alle schreibenden Operationen protokolliert mit Benutzer + Zeitstempel |
| NF-S08 | DSGVO-Konformität | Recht auf Auskunft/Löschung, Auftragsverarbeitungsvertrag-fähig |
### Zuverlässigkeit
| ID | Anforderung | Beschreibung |
|----|------------|-------------|
| NF-R01 | Verfügbarkeit | 99,5% Uptime (außerhalb geplanter Wartungsfenster) |
| NF-R02 | Backup | Automatisches tägliches Backup, 30 Tage Retention |
| NF-R03 | Disaster Recovery | Wiederherstellungszeit < 4h, maximal 24h Datenverlust (RPO) |
### Benutzerfreundlichkeit
| ID | Anforderung | Beschreibung |
|----|------------|-------------|
| NF-U01 | Responsive Design | Optimiert für Desktop (1920px), Tablet (1024px), Mobile (375px) |
| NF-U02 | Barrierefreiheit | WCAG 2.1 Level AA (Kontrast, Tastatur-Navigation, Screenreader) |
| NF-U03 | Internationalisierung | Mehrsprachig (DE, EN). Weitere Sprachen per Übersetzungsdatei ergänzbar |
| NF-U04 | Browser-Support | Chrome, Firefox, Safari, Edge jeweils letzte 2 Major-Versionen |
### Technische Architektur-Präferenzen (Diskussionsbasis)
- **Frontend:** React mit TypeScript (Mobile PWA mit Capacitor)
- **Backend:** Python FastAPI oder Node.js NestJS
- **Datenbank:** PostgreSQL
- **Caching:** Redis
- **Datei-Speicher:** S3-kompatibler Object Storage (MinIO oder AWS S3)
- **Containerisierung:** Docker + Kubernetes
- **CI/CD:** GitHub Actions oder GitLab CI
---
## 7. Annahmen
1. **Multi-Tenant-Architektur:** Jedes Unternehmen (Account) hat vollständig isolierte Daten. Ein Account kann mehrere Benutzer haben.
2. **Keine Integration mit echtem Rentman:** Dies ist ein Standalone-Produkt, kein Sync-Client.
3. **Firmen-eigener Server oder Cloud:** Self-Hosted oder SaaS, keine zwingende Abhängigkeit von externen Diensten außer E-Mail und optional S3.
4. **Keine Echtzeit-Kollaboration** im MVP (kein WebSocket-Sync mehrerer Benutzer im gleichen Formular). Locking-Mechanismus ausreichend.
5. **Buchhaltung:** Kein vollständiges Buchhaltungssystem. Der Klon deckt Angebote, Rechnungen und grundlegende Finanzübersicht ab. DATEV-Export optional.
6. **E-Mail-Versand:** Transaktionale E-Mails (SMTP) und optionale Integration mit SendGrid/Mailgun.
7. **Datei-Uploads:** Maximal 50 MB pro Datei.
8. **Mobile App:** PWA mit Capacitor (nicht nativ), ausreichend für Kamera-Zugriff und Offline-Speicher.
9. **Projektvorlagen:** Kopieren nur die Struktur (Funktionen, Gruppen), nicht konkrete Crew- oder Equipment-Zuweisungen.
10. **Nummernkreise:** pro Account konfigurierbar (Projektnummer, Angebotsnummer, Rechnungsnummer).
---
## 8. Nicht-Ziele (Out of Scope)
Dieser Abschnitt definiert explizit, was **nicht** Teil des Klons ist (MVP und V1).
| ID | Nicht-Ziel | Begründung |
|----|-----------|-----------|
| N-01 | Vollständige Buchhaltung / DATEV-Integration | Übersteigt Scope; Fokus auf Angebot/Rechnung |
| N-02 | Personalabrechnung / Lohn | Eigene Domäne, nicht Kern des Verleih-Managements |
| N-03 | GPS-Tracking von Fahrzeugen | Hardware-Abhängigkeit, optional in V2 |
| N-04 | KI-basierte Preisvorschläge | Außerhalb MVP-Scope |
| N-05 | Native iOS/Android Apps | PWA deckt Anforderungen; native Apps optional V2 |
| N-06 | Echtzeit-Chat zwischen Benutzern | Kommunikation erfolgt über externe Kanäle |
| N-07 | Integration mit Miet-ERP-Systemen | Custom-Integrationen pro Kunde → Professional Services |
| N-08 | BIM-/CAD-Integration | Nischen-Anforderung, nicht für MVP |
| N-09 | RFID-Hardware-Integration | Barcode/QR ausreichend; RFID optional |
| N-10 | On-Premise Active Directory / LDAP | OAuth2/SAML für V2 geplant |
---
## 9. Offene Fragen
Diese Fragen müssen vor Architektur-Beginn geklärt werden.
| ID | Frage | Relevanz für | Vorgeschlagene Antwort |
|----|-------|-------------|----------------------|
| Q-01 | Welches Tech-Stack wird bevorzugt? (React/FastAPI vs. Vue/Laravel vs. Next.js/Prisma) | Architektur-Entscheidung | React + FastAPI, da API-zentrisch |
| Q-02 | Multi-Tenant auf DB-Ebene (shared DB + tenant_id) oder Schema-Ebene (ein Schema pro Tenant)? | Sicherheit, Skalierung | Shared DB mit tenant_id (einfacher) |
| Q-03 | Soll es ein Self-Service-Onboarding geben (Account registrieren) oder nur Admin-gesteuert? | Benutzerfluss | Self-Service mit Trial-Periode |
| Q-04 | Wie soll die Template-Engine für Angebote/Rechnungen funktionieren? WYSIWYG oder HTML/CSS? | UI-Design, Aufwand | HTML mit Platzhaltern (ähnlich Rentman), Vorschau-Funktion |
| Q-05 | Preis-Modell des Klons? (Open Source, kommerziell, SaaS-Abo) | Geschäftsmodell | Open Source mit kommerzieller SaaS-Option |
| Q-06 | Welche Sprachen werden für MVP benötigt? | i18n-Aufwand | Deutsch + Englisch |
| Q-07 | Barcode-Generierung: Code128, QR, beide? Welches Label-Format? | Druck-Layout | QR-Code primär, Code128 optional. Label: 50×25mm |
| Q-08 | Offline-Sync-Strategie: Last-Write-Wins oder CRDT? | Mobile App | Last-Write-Wins (einfacher, ausreichend für Equipment-Tracking) |
---
## Zusammenfassung
| Metrik | Wert |
|--------|------|
| **Anzahl User Stories** | 40 |
| **Anzahl Kernentitäten** | 16 |
| **Abgedeckte Module** | 13/13 (100%) |
| **Geschätzter Funktionsumfang vs. Rentman** | ≥90% |
| **Offene Fragen** | 8 |
| **Explizite Nicht-Ziele** | 10 |
| **Bereit für Architektur** | Ja (nach Klärung der offenen Fragen) |