| 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 : |
# 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.