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
48 KiB
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
- Projektübersicht & Vision
- Systemkontext & Benutzerrollen
- Datenmodell – Kernentitäten & Beziehungen
- Funktionale Anforderungen – User Stories
- UI-Komponenten-Matrix
- Nicht-funktionale Anforderungen
- Annahmen
- Nicht-Ziele (Out of Scope)
- 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 | ✅ |
| 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 | * |
| 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 | 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
- Multi-Tenant-Architektur: Jedes Unternehmen (Account) hat vollständig isolierte Daten. Ein Account kann mehrere Benutzer haben.
- Keine Integration mit echtem Rentman: Dies ist ein Standalone-Produkt, kein Sync-Client.
- Firmen-eigener Server oder Cloud: Self-Hosted oder SaaS, keine zwingende Abhängigkeit von externen Diensten außer E-Mail und optional S3.
- Keine Echtzeit-Kollaboration im MVP (kein WebSocket-Sync mehrerer Benutzer im gleichen Formular). Locking-Mechanismus ausreichend.
- Buchhaltung: Kein vollständiges Buchhaltungssystem. Der Klon deckt Angebote, Rechnungen und grundlegende Finanzübersicht ab. DATEV-Export optional.
- E-Mail-Versand: Transaktionale E-Mails (SMTP) und optionale Integration mit SendGrid/Mailgun.
- Datei-Uploads: Maximal 50 MB pro Datei.
- Mobile App: PWA mit Capacitor (nicht nativ), ausreichend für Kamera-Zugriff und Offline-Speicher.
- Projektvorlagen: Kopieren nur die Struktur (Funktionen, Gruppen), nicht konkrete Crew- oder Equipment-Zuweisungen.
- 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) |