Files
rentman-clone/.a0/requirements.md
T
Agent Zero 7f7da15965 Initial commit: Rentman Clone - Phase 0-6 (T001-T023)
Completed:
- Phase 0: Project Setup (T001-T003) - Docker Compose, FastAPI skeleton, React SPA
- Phase 1: Auth System (T004-T008) - DB models, JWT auth, RBAC middleware, user management
- Phase 2: Contacts & Tags (T009-T011) - CRUD API + UI
- Phase 3: Equipment Catalog (T012-T014) - Models, API, UI with barcode/QR
- Phase 4: Crew Management (T015-T017) - Models, availability, UI
- Phase 5: Vehicle Fleet (T018-T020) - Models, assignments, UI
- Phase 6: Projects (T021-T023) - Project hierarchy models, CRUD API, list/detail UI
2026-05-31 20:36:42 +00:00

1093 lines
48 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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) |