# 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) |