| 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/seaside.pacim.de/web/docs/ |
Upload File : |
# Anreise-Infos – Technische Dokumentation
Dynamische Anreisehinweise, die Mitarbeiter im PaCIM CRM verwalten und die das
Buchungsformular künftig über die bestehende API abruft. Die Anzeige hängt von
**Schiff**, **Check-in-Uhrzeit** und **Parkplatztyp** ab.
Vollständig in die bestehende Event-Verwaltung (`/events/`) integriert – keine
neue Hauptnavigation, kein eigenes Modul. Wiederverwendet: Tabs, Bootstrap-Modals,
Tabellen, TinyMCE (wie bei der Event-Beschreibung), `events-api.php`, `api.php`,
`MysqliDb`, bestehende Namenskonventionen.
## Datenbankänderungen
Neue Tabelle `pacim_arrival_info` (UTF8MB4), Spalten-Präfix `arrival_info_`
analog zu `event_calendar_*` / `organizer_*`:
| Spalte | Typ | Bedeutung |
|---|---|---|
| `arrival_info_id` | INT PK AI | ID |
| `arrival_info_title` | VARCHAR(190) | interne Bezeichnung |
| `arrival_info_content` | MEDIUMTEXT | HTML (WYSIWYG) – Kundenanzeige |
| `arrival_info_ship_ids` | VARCHAR(255) | CSV von `pacim_events_info.event_id` |
| `arrival_info_all_ships` | TINYINT(1) | 1 = gilt für alle Schiffe |
| `arrival_info_parking_type` | VARCHAR(16) | `all` / `indoor` / `outdoor` / `valet` |
| `arrival_info_all_parking` | TINYINT(1) | 1 wenn Typ `all` (Komfort/Spec) |
| `arrival_info_time_from` | TIME NULL | Check-in von |
| `arrival_info_time_to` | TIME NULL | Check-in bis |
| `arrival_info_no_time_limit` | TINYINT(1) | 1 = immer anzeigen |
| `arrival_info_priority` | INT | höher = weiter oben |
| `arrival_info_active` | TINYINT(1) | aktiv/inaktiv |
| `arrival_info_created` / `arrival_info_updated` | DATETIME | Zeitstempel |
Indizes: `idx_ai_active`, `idx_ai_priority`.
> **Schiff-Stammdaten:** `ship_id` referenziert `pacim_events_info.event_id`
> (eine Zeile je Schiff, z. B. 1=AIDAdiva, 3=Regal Princess). `pacim_events`
> verweist via `event_calendar_info_id` darauf → daher kann auch eine `event_id`
> (Termin) zur `ship_id` aufgelöst werden.
## Admin-UI
`/events/` → neuer Tab **„Anreise-Infos"** (`#ev-arrival`, lazy-load beim Öffnen).
- **Kopfbereich:** „Neue Anreise-Info", Suche, Filter (Schiff, Parkplatztyp,
Aktiv/Inaktiv, Zeitraum von/bis).
- **Tabelle:** Titel, Schiff, Parkplatztyp, Uhrzeit, Priorität, Status, Geändert, Aktionen.
- **Komfort:** Aktiv/Inaktiv-Umschalten direkt in der Tabelle, Duplizieren,
Schnellbearbeitung (Klick auf Titel/Zeile), Vorschau, Suche, Sortierung
(Priorität DESC, ID DESC).
- **Editor-Modal:** Titel, Inhalt (TinyMCE: fett/kursiv/Listen/Links/Farben/Bilder),
Schiff (Alle / Mehrfachauswahl), Parkplatztyp, Check-in-Zeit (von/bis oder
„Immer anzeigen"), Priorität, Aktiv.
- **Vorschau-Modal:** zeigt genau das spätere Kunden-Modal („Hinweise zu Ihrer
Anreise") mit dem gerenderten Inhalt.
## API-Erweiterung
### Admin (Session, `events-api.php`, `is_admin`)
`arrival-ships`, `arrival-infos` (Filter q/ship/parking/active/time_from/time_to),
`arrival-info` (GET id), `arrival-info-save` (POST), `arrival-info-toggle`,
`arrival-info-duplicate`, `arrival-info-delete`.
### Öffentlich (`api.php`, API-Key) – neue Route
```
GET /api.php?resource=arrival-info
Auth: Authorization: Bearer <key> (Scope: read_event)
```
Parameter: `ship_id`, `event_id` (alternativ zu ship_id), `checkin_time` (HH:MM),
`parking_type` (`indoor|outdoor|valet|all`).
Beispiel:
```
GET /api.php?resource=arrival-info&ship_id=3&checkin_time=10:30&parking_type=outdoor
```
### Filterlogik (nur aktive Datensätze)
- **Schiff:** `all_ships = 1` ODER `ship_id` in `ship_ids`.
- **Parkplatztyp:** `parking_type = 'all'` ODER `parking_type = <angefragt>`.
- **Uhrzeit:** `no_time_limit = 1` ODER `time_from <= checkin <= time_to`.
- **Sortierung:** `priority DESC, id DESC`.
- `event_id` wird zu `ship_id` aufgelöst, falls `ship_id` fehlt.
### Beispiel-Response (Treffer)
```json
{ "success": true, "count": 2, "items": [
{ "id": 1, "title": "Frühe Anreise", "content": "<p>…</p>",
"ships": ["Norwegian Getaway","Regal Princess"], "ship_ids": [7,3],
"all_ships": false, "parking_type": "outdoor", "parking_type_label": "Außenparkplatz",
"time_from": "08:00", "time_to": "10:30", "no_time_limit": false,
"priority": 100, "active": true },
{ "id": 2, "title": "Allgemeiner Hinweis", "content": "<p>…</p>",
"ships": [], "ship_ids": [], "all_ships": true,
"parking_type": "all", "parking_type_label": "Alle Parkplatztypen",
"time_from": null, "time_to": null, "no_time_limit": true,
"priority": 10, "active": true } ] }
```
Keine Treffer: `{ "success": true, "count": 0, "items": [] }`
Fehler: `{ "success": false, "message": "Die Anreise-Infos konnten nicht geladen werden.", "items": [] }`
## Geänderte Dateien
- `events-api.php` – Admin-CRUD-Aktionen + Helfer (`ai_*`).
- `api.php` – öffentliche Ressource `arrival-info` (+ Aliasse `arrival_info`, `arrival-infos`).
- `includes/templates/templates/events.tpl` – Tab, Toolbar, Tabelle, Editor- + Vorschau-Modal.
- `assets/js/events.js` – Anreise-Infos-Modul (Liste, Filter, CRUD, TinyMCE, Vorschau).
## Neue Dateien
- DB-Tabelle `pacim_arrival_info`.
- `docs/anreise-infos.md` (dieses Dokument).
## Hinweise für die spätere Frontend-Integration
Das Buchungsformular sendet lediglich:
```json
{ "ship_id": 3, "checkin_time": "10:30", "parking_type": "outdoor", "event_id": 123 }
```
an `api.php?resource=arrival-info` (mit gültigem API-Key, Scope `read_event`) und
erhält die passenden, priorisierten Hinweise zurück. `parking_type` muss
`indoor|outdoor|valet` sein; `content` ist fertiges HTML und kann direkt in einem
Modal angezeigt werden (Reihenfolge = Items-Reihenfolge).