1093 lines
48 KiB
Markdown
1093 lines
48 KiB
Markdown
|
|
# 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) |
|