hwkdo / intranet-app-tickets
Generated app: Tickets
Fund package maintenance!
Requires
- php: ^8.3
- hwkdo/intranet-app-base: dev-main || ^1.0
- illuminate/contracts: ^10.0||^11.0||^12.0
- illuminate/database: ^10.0||^11.0||^12.0
- illuminate/support: ^10.0||^11.0||^12.0
- livewire/volt: ^1.6.7
- spatie/laravel-package-tools: ^1.16
- spatie/laravel-permission: ^6.16
- spatie/laravel-webhook-client: ^3.4
- zammad/zammad-api-client-php: ^2.3
Requires (Dev)
- laravel/pint: ^1.14
- nunomaduro/collision: ^8.1.1||^7.10.0
- orchestra/testbench: ^10.0.0||^9.0.0||^8.22.0
- pestphp/pest: ^2.0||^3.0
- pestphp/pest-plugin-arch: ^2.5||^3.0
- pestphp/pest-plugin-laravel: ^2.0||^3.0
README
Zammad-Integration für das Intranet: Benutzer können ihre Support-Tickets einsehen und beantworten. Agenten arbeiten weiterhin im Zammad-UI.
Installation
composer require hwkdo/intranet-app-tickets php artisan migrate php artisan intranet-app:sync-settings php artisan intranet-app:sync-permissions --all
Umgebungsvariablen
ZAMMAD_URL=https://ticket.hwkdo.com ZAMMAD_HTTP_TOKEN=your-api-token WEBHOOK_ZAMMAD_SECRET=your-webhook-hmac-secret
Optional:
ZAMMAD_DEBUG=false INTRANET_APP_TICKETS_USER_MODEL=App\Models\User
Zammad Webhook einrichten
- In Zammad unter Verwalten → Webhooks einen neuen Webhook anlegen.
- Endpoint:
{APP_URL}/webhooks/zammad - HMAC-Token setzen (gleicher Wert wie
WEBHOOK_ZAMMAD_SECRET). - Unter Verwalten → Trigger Webhook-Trigger anlegen, z. B.:
- Agent-Antworten: Artikel erstellt, Sichtbarkeit = öffentlich, Sender = Agent
- Statusänderungen: Ticket aktualisiert, z. B. Status = geschlossen (ohne Artikel im Payload)
- Aktion jeweils: Webhook auslösen
Optional INTRANET_APP_TICKETS_WEBHOOK_NOTIFY_STATES=closed,open setzen, um nur bestimmte Status zu benachrichtigen (Standard: alle).
Webhook-Debugging
Eingegangene Webhooks (gespeichert nach gültiger Signatur) unter:
/apps/tickets/webhooks(Permissionmanage-app-tickets)
Zusätzlich in der allgemeinen Admin-Webhook-Übersicht (/admin/webhooks), sofern der Eintrag gespeichert wurde.
Wichtig: Der Webhook-Job läuft über die Queue (QUEUE_CONNECTION=redis). Horizon bzw. Queue-Worker müssen laufen, sonst bleibt der Eintrag in webhook_calls ohne Benutzer-Benachrichtigung.
Ticket-Kategorien einrichten
Nach der Migration die Standard-Kategorien seeden:
php artisan intranet-app-tickets:seed-categories
Im Admin-Bereich (/apps/tickets/admin → Tab Kategorien) pro Kategorie den Übertragungsweg konfigurieren:
- Zammad API: Zammad-Gruppe aus Dropdown wählen (Gruppen werden per API geladen)
- E-Mail: Zieladresse eintragen (Standard für Moodle)
- Optional: Genehmigung aktivieren und Genehmigungs-Rollen zuweisen
Funktionen
- Ticketliste (offen / geschlossen / alle) per Zammad API + eigene Anfragen („Zur Genehmigung“)
- Tickets erstellen mit kategoriespezifischen Flux-Formularen
- Genehmigungsworkflow mit Rollen pro Kategorie
- Übertragung per Zammad API oder E-Mail (konfigurierbar pro Kategorie)
- Ticketdetail mit öffentlichem Verlauf und Bearbeiter-Info
- Ticket-Erstellung und Antworten als Kunde (
setOnBehalfOfUser) - Admin: Zammad-Intranet-Rolle, Gruppenrechte und Benutzerübersicht (
/apps/tickets/admin→ Tab Zammad-Benutzer) - Automatische Zammad-Benutzeranlage beim ersten Ticket (Intranet-Daten → Zammad, inkl. Intranet-Rolle)
- Anhang-Download über die App
- Webhook-Benachrichtigungen bei Agent-Antworten (Reverb + Task-Badge)
- Webhook-Übersicht mit Verarbeitungsstatus und Live-Updates per Reverb/Echo
Zammad API-Token (Berechtigungen)
| Funktion | Zammad-Permission |
|---|---|
| Tickets erstellen / lesen | ticket.agent |
| Benutzer automatisch anlegen + Rolle zuweisen | admin.user |
| Gruppenrechte der Intranet-Rolle pflegen | admin.role |
Voraussetzung für Auto-Provisioning: Im Admin-Tab Zammad-Benutzer muss eine Intranet-Benutzer-Rolle konfiguriert sein (inkl. Gruppenrechte für die Ticket-Kategorien).
Berechtigungen
see-app-tickets— App nutzenmanage-app-tickets— Admin-Bereich
Tests
Alle Tests liegen im Package unter tests/ und werden über die Hauptanwendung ausgeführt:
php artisan test --compact packages/intranet-app-tickets/tests
Einzelne Suite:
php artisan test --compact packages/intranet-app-tickets/tests/Unit php artisan test --compact packages/intranet-app-tickets/tests/Feature