Diveclub ManagerDokumentation
Das Modul contao-diveclub-bundle ermöglicht Tauchvereinen und -schulen die effiziente Verwaltung von Tauchausrüstung, Reglerservicing, TÜV-Prüfungen für Tauchflaschen sowie die Organisation von Tauchkursen.
Inhaltsverzeichnis
- Systemvoraussetzungen
- Einrichtung der globalen Einstellungen
- Tabellenstruktur
- Ausrüstungsverwaltung
- Verwaltung von Leihausrüstung
- Regler-Service und Historie
- Verwaltung vereinseigener Flaschen
- Planung von TÜV-Sammelterminen
- Buchungsprozess für Mitglieder
- Ablauf von Reservierung bis Rückgabe
- Status-Definitionen
- Erstellung von Kursen und Modulen
- Fortschrittskontrolle für Schüler
- Kurskalender
- Verwendung von Insert-Tags
- Anpassung der Twig-Templates
- Insert-Tags
- Templates Variablen
Installation & Konfiguration
Installation
Das Bundle wird über Composer installiert:
composer require diversworld/contao-diveclub-bundle
Nach der Installation müssen die Datenbank-Migrationen über den Contao Manager oder die Konsole ausgeführt werden:
php vendor/bin/contao-console contao:migrate
Globale Konfiguration
Die zentralen Einstellungen finden Sie im Contao Backend unter **System > Konfiguration**. Dort gibt es einen Bereich
für das Diveclub Bundle.
Einstellungen (tl_dc_config)
- Vorlagen (Templates):
Hier weisen Sie Ihre eigenen PHP-Dateien für Hersteller, Ausrüstungstypen, Größen, Regler und Kurse zu. Diese Dateien dienen als Datenquelle für Dropdown-Menüs. - Rechnungen:
Auswahl eines PDF-Templates (Briefpapier) und Definition von Zusatztexten für generierte Rechnungen. - Speicherorte:
Definition der Ordner im Contao-Dateisystem für generierte PDFs (Rechnungen, TÜV-Listen). Standardmäßig wird `files/` verwendet. - TÜV-Listen Export:
Standard-Exportformat wählen (PDF, CSV oder XLSX). - Reservierungen:
Konfiguration von Bestätigungstexten und Benachrichtigungs-E-Mails für Ausleihvorgänge. - Mietbedingungen:
Hinterlegung der AGB für die Ausrüstungsmiete.
Ausrüstungsverwaltung & Regler
Das Bundle ermöglicht die detaillierte Verwaltung von vereinseigener oder Schul-Ausrüstung.
Allgemeine Ausrüstung (Equipment)
Unter dem Menüpunkt **Ausrüstung** können diverse Gegenstände wie Anzüge, ABC-Ausrüstung, Jackets etc. verwaltet werden.
Jedes Teil kann einen Status besitzen, um die Verfügbarkeit zu tracken:
- `available` (verfügbar)
- `reserved` (reserviert)
- `borrowed` (verliehen)
- `returned` (zurückgegeben)
- `overdue` (überfällig)
- `lost` / `damaged` / `missing`
Regler-Management
Speziell für Atemregler gibt es eine detaillierte Erfassung der ersten und zweiten Stufen sowie der Revisionshistorie.
Konfiguration der Modelldaten
Die Hersteller und Modelle werden über externe Textdateien definiert, um flexibel auf den Bestand reagieren zu können.
Beispiel für `equipment_manufacturer.txt`:
<?php
return [
'1' => 'Scubapro',
'2' => 'Aqualung',
// ...
];
Wartungshistorie
Zu jedem Regler-Set können die Service-Termine hinterlegt werden. Das System kann so genutzt werden, um fällige
Revisionen im Blick zu behalten.
Reservierungssystem (Frontend)
Mitglieder können im Frontend verfügbare Ausrüstung reservieren.
- Frontend-Modul:
"Equipment Reservation" auf einer Seite einbinden. - Prozess:
Mitglied wählt Zeitspanne und Artikel -> Status springt auf `reserved`. - Ausgabe:
Der Administrator markiert bei Abholung den Status als `borrowed`.
TÜV-Management & Flaschen
Dieses Modul unterstützt die Verwaltung von Tauchflaschen und die Organisation von TÜV-Prüfungsterminen.
Flaschenverwaltung (Tanks)
Im Bereich **Tauchflaschen** können alle Flaschen des Vereins mit Seriennummer, Größe und letztem Prüfdatum erfasst
werden.
- TÜV-Überwachung:
Das System zeigt an, welche Flaschen zur Prüfung fällig sind. - Listenansicht:
Über ein Frontend-Modul können die Flaschendaten für Mitglieder (z.B. zur Ausleihe) angezeigt werden.
TÜV-Prüfungstermine (Sammelprüfung)
Der Verein kann "Angebote" oder "Termine" für TÜV-Sammelprüfungen erstellen.
Ablauf einer Sammelprüfung:
- Angebot erstellen:
Im Backend unter **TÜV-Angebote** einen Termin und die Preise für Flaschen-TÜV, O2-Service etc. anlegen. - Kalender-Verknüpfung:
Das Angebot mit einem Event im Contao-Kalender verknüpfen. - Frontend-Anmeldung:
Mitglieder können über das Modul "Tank Check" ihre eigenen Flaschen für diesen Termin anmelden. - Export:
Der Administrator kann eine Liste aller angemeldeten Flaschen exportieren (PDF/CSV/XLSX), um sie dem Prüfunternehmen zu übergeben. - Abrechnung:
Nach der Prüfung können im Backend Rechnungen als PDF generiert werden.
Equipment-Verleih
Das ContaoDiveclubBundle bietet ein integriertes System zur Verwaltung des Verleihs von Tauchausrüstung. Dies umfasst die Reservierung im Frontend durch Mitglieder sowie die Abwicklung (Abholung/Rückgabe) im Backend durch Administratoren.
Funktionen im Überblick
- Verfügbarkeitsprüfung:
Mitglieder sehen im Frontend, welche Ausrüstungsgegenstände im gewünschten Zeitraum verfügbar sind. - Transparenter Status:
Jeder Verleihvorgang durchläuft definierte Status, die jederzeit nachvollziehbar sind. - Gebührenverwaltung:
Hinterlegung von Leihgebühren für verschiedene Gegenstände. - Historie:
Alle Verleihvorgänge werden dokumentiert und sind einem Mitglied zugeordnet.
Der Verleih-Prozess
Der Ablauf eines Verleihs gliedert sich typischerweise in folgende Schritte:
1. Reservierung (Frontend)
Mitglieder können über das Frontend-Modul "Equipment Reservation" Ausrüstung für einen bestimmten Zeitraum anfragen.
- Auswahl des Zeitraums (Start- und Enddatum).
- Auswahl der gewünschten Gegenstände (Flaschen, Regler, Jackets etc.).
- Nach Abschluss der Reservierung wird der Status auf `reserved` gesetzt.
2. Abholung (Backend)
Sobald das Mitglied die Ausrüstung abholt, dokumentiert der Administrator dies im Backend.
- Aufrufen der Reservierung unter **Verleih & Reservierung**.
- Erfassen des Abholdatums (`picked_up_at`).
- Der Status der Gegenstände ändert sich auf `borrowed` (ausgeliehen).
3. Rückgabe (Backend)
Bei Rückgabe der Ausrüstung wird der Vorgang abgeschlossen.
- Erfassen des Rückgabedatums (`returned_at`).
- Prüfung auf Defekte oder Vollständigkeit.
- Der Status wird auf `returned` gesetzt, wodurch die Gegenstände für neue Reservierungen wieder als `available` markiert werden.
Status-Definitionen
Innerhalb des Verleihsystems können Gegenstände und Reservierungen folgende Status annehmen:
| Status | Beschreibung |
| `available` | Der Gegenstand ist verfügbar und kann reserviert werden. |
| `reserved` | Der Gegenstand ist für einen Zeitraum reserviert, aber noch nicht abgeholt. |
| `borrowed` | Der Gegenstand ist aktuell beim Mitglied (ausgeliehen). |
| `returned` | Der Gegenstand wurde zurückgegeben. |
| `overdue` | Die Rückgabefrist wurde überschritten. |
| `damaged` / `lost` | Der Gegenstand ist defekt oder verloren gegangen und steht nicht zur Verfügung. |
| `cancelled` | Die Reservierung wurde storniert. |
Verwaltung im Backend
Die Verwaltung erfolgt über zwei Hauptebenen:
- Reservierungen (`tl_dc_reservation`):** Hier werden die Kopfdaten (Mitglied, Zeitraum, Gesamtstatus, Gebühren) verwaltet.
- Reservierungspositionen (`tl_dc_reservation_items`):** Hier werden die einzelnen Gegenstände aufgelistet, die zu einer Reservierung gehören.
Kursverwaltung
Die Kursverwaltung ermöglicht das Anlegen von Tauchkursen, die Zuweisung von Modulen und die Dokumentation des Lernfortschritts.
Struktur der Kurse
Ein Kurs ist hierarchisch aufgebaut:
- Kursart (Course):
Grundlegende Definition (z.B. OWD, AOWD). - Module:
Unterteilung des Kurses (z.B. Theorie, Pool, Freiwasser). - Übungen (Exercises):
Konkrete Fertigkeiten innerhalb eines Moduls.
Ausbildungsprozess
1. Kurs-Setup
Zuerst werden die Kursarten und die zugehörigen Übungen definiert. Diese dienen als Vorlage.
2. Schüler-Verwaltung
Schüler werden im System erfasst und einem konkreten Kurs zugeordnet. Bei der Zuordnung werden automatisch alle für diesen Kurs definierten Übungen für den Schüler generiert.
3. Fortschrittsdokumentation
Tauchlehrer können im Backend den Status jeder Übung für einen Schüler setzen:
- `done` (Erfolgreich abgeschlossen)
- `repeat` (Muss wiederholt werden)
- `failed` (Nicht bestanden)
4. Frontend-Ansicht
Schüler können ihren eigenen Fortschritt im Frontend über das Modul **Course Progress** einsehen. Dort wird grafisch oder in Tabellenform angezeigt, welche Übungen bereits erfolgreich absolviert wurden.
Twig-Templates und Anpassungsmöglichkeiten
Das `ContaoDiveclubBundle` nutzt moderne Contao 5 Twig-Templates. Die Darstellung der Frontend-Module kann flexibel über Twig-Template-Vererbung angepasst werden.
Allgemeine Anpassung via Vererbung
Um ein Template anzupassen, erstellen Sie eine neue Datei im Contao-Verzeichnis `templates/` (z. B.
`mod_dc_course_events_list_custom.html.twig`) und erben Sie vom Original-Template. Dank der flachen Block-Struktur
können Sie gezielt einzelne Bereiche überschreiben.
Beispiel:
{% extends "@Contao/frontend_module/mod_dc_course_events_list" %}
{% block event_title %}
<h3>Exklusiv: {{ ev.title }}</h3>
{% endblock %}
Übersicht der Templates
Kurs-Event-Liste (`dc_course_events_list`)
Zeigt eine Übersicht aller veröffentlichten Kurs-Events an.
Template: `mod_dc_course_events_list.html.twig`
{% block content %}
{% set container_attributes = attrs().addClass('dc-events-list').mergeWith(container_attributes|default) %}
<div{{ container_attributes }}>
{% if not hasEvents %}
{{ block('no_events') }}
{% else %}
{{ block('events_warning') }}
{{ block('events_list') }}
{% endif %}
</div>
{% endblock %}
Verfügbare Variablen:
- `events`: Array der anzuzeigenden Events. Jedes Element enthält:
- `id`: Interne ID.
- `title`: Titel des Events.
- `dateStart`: Formatiertes Startdatum.
- `dateEnd`: Formatiertes Enddatum.
- `instructor`: Name des Kursleiters.
- `description`: Beschreibung (HTML).
- `location`: Veranstaltungsort.
- `maxParticipants`: Maximale Teilnehmerzahl.
- `price`: Kursgebühr.
- `url`: Link zur Detailseite.
- `isTankCheck`: (Optional) `true`, wenn es sich um einen Flaschen-TÜV Termin handelt.
- `hasEvents`: Boolean, ob Events vorhanden sind.
- `hasJumpTo`: Boolean, ob eine Reader-Seite konfiguriert wurde.
Wichtige Blöcke:
- `events_list`: Container für die Liste.
- `event_item`: Ein einzelner Listeneintrag.
- `event_title`: Der Titel des Events.
- `event_details`: Detailinformationen (Datum, Kursleiter, Ort).
- `event_description`: Kurzbeschreibung.
- `event_link`: Link zur Detailseite.
Kurs-Event-Reader (`dc_course_event_reader`)
Zeigt die Details eines einzelnen Kurs-Events inklusive Zeitplan und Anmeldeformular.
Template: `mod_dc_course_event_reader.html.twig`
{% block content %}
{% set container_attributes = attrs().addClass('dc-event-reader').mergeWith(container_attributes|default) %}
<div{{ container_attributes }}>
{% if notFound|default(false) %}
{{ block('not_found') }}
{% else %}
{{ block('event_title') }}
{{ block('event_details') }}
{{ block('event_description') }}
{{ block('student_progress') }}
{{ block('event_schedule') }}
{{ block('event_signup') }}
{% endif %}
</div>
{% endblock %}
Verfügbare Variablen:
- `event`: Objekt/Array mit den Details des Events:
- `title`, `description`, `dateStart`, `dateEnd`, `price`, `instructor`.
- `schedule`: Array mit den Terminen des Zeitplans:
- `planned_at`: Formatiertes Datum/Uhrzeit.
- `location`, `instructor`, `notes`, `module`, `exercise`.
- `hasSchedule`: Boolean, ob ein Zeitplan existiert.
- `isLoggedIn`: Boolean, ob der Nutzer angemeldet ist.
- `alreadyRegistered`: Boolean, ob der Nutzer bereits angemeldet ist.
- `signup`: Array mit Labels für das Anmeldeformular.
- `request_token`: CSRF-Token für das Formular.
Wichtige Blöcke:
- `event_title`: Titel des Events.
- `event_details`: Basisinfos (Start, Ende, Preis, Kursleiter).
- `event_description`: Ausführliche Beschreibung.
- `event_schedule`: Der gesamte Zeitplanbereich.
- `schedule_table`: Die Tabelle mit den Terminen.
- `event_signup`: Der Anmeldebereich.
- `signup_guest`: Das Formular für Gäste.
- `signup_member`: Das Formular für angemeldete Mitglieder.
Kurs-Zeitplan / Kalender (`dc_course_event_calendar`)
Stellt die Termine eines Events in einer Kalenderansicht dar.
Template: `mod_dc_course_event_calendar.html.twig`
{% block content %}
{% set container_attributes = attrs().addClass('dc-course-calendar').mergeWith(container_attributes|default) %}
<div{{ container_attributes }}>
{% if be_message is defined %}
{{ block('be_info') }}
{% elseif not hasEvents %}
{{ block('no_events') }}
{% else %}
{{ block('calendar_table') }}
{{ block('calendar_script') }}
{% endif %}
</div>
{% endblock %}
Verfügbare Variablen:
- `weeks`: Array der Wochen, die wiederum Arrays der Tage enthalten:
- `label`: Tag des Monats.
- `events`: Array der Termine an diesem Tag (`title`, `time`, `location`, `instructor`, `notes`).
- `class`: CSS-Klasse für den Tag (`today`, `weekend`, `empty`).
- `days`: Array der Wochentagsnamen.
- `currentMonth`: Name des aktuell angezeigten Monats und Jahres.
- `prevHref` / `nextHref`: Links zur Navigation.
- `hasEvents`: Boolean, ob Termine vorhanden sind.
Wichtige Blöcke:
- `calendar_table`: Der Tabellencontainer.
- `calendar_nav`: Vor/Zurück Navigation.
- `calendar_day_labels`: Wochentagsnamen.
- `calendar_event`: Ein einzelner Termin im Kalender.
- `calendar_event_details`: Detail-Popup bei Klick auf einen Termin.
Flaschen-Check / TÜV (`dc_tank_check`)
Ermöglicht Mitgliedern und Gästen die Anmeldung von Tauchflaschen für eine TÜV-Prüfung.
Template: `mod_dc_tank_check.html.twig`
{% block content %}
{% if success %}
{{ block('success_view') }}
{% elseif isBooking %}
{{ block('booking_view') }}
{% else %}
{{ block('proposal_list') }}
{% endif %}
{% endblock %}
Verfügbare Variablen:
- `proposals`: Liste verfügbarer TÜV-Termine (für die Listenansicht).
- `isBooking`: Boolean, ob gerade eine Buchung durchgeführt wird.
- `proposal`: Das aktuell gewählte TÜV-Angebot.
- `sessionTanks`: Array der bereits im "Warenkorb" befindlichen Flaschen.
- `articles`: Liste zusätzlich buchbarer Leistungen (O2-Service etc.).
- `tankSizes`: Array verfügbarer Flaschengrößen.
- `labels`: Übersetzungen für das Formular.
- `success`: Boolean, ob die Buchung erfolgreich abgeschlossen wurde.
Wichtige Blöcke:
- `proposal_list`: Liste der verfügbaren TÜV-Termine.
- `booking_view`: Die Ansicht während des Buchungsvorgangs.
- `form_add_tank`: Formular zum Hinzufügen einer Flasche.
- `reserved_tanks`: Übersicht der bereits vorgemerkten Flaschen.
- `final_booking`: Abschluss der Buchung (Adressdaten).
- `success_view`: Bestätigungsseite nach erfolgreicher Buchung.
Kurs-Fortschritt (`dc_course_progress`)
Zeigt den aktuellen Ausbildungsstand eines Tauchschülers an.
Template: `mod_dc_course_progress.html.twig`
{% block content %}
{% set container_attributes = attrs().addClass('mod_dc_course_progress').mergeWith(container_attributes|default) %}
<div{{ container_attributes }}>
{% if not isLoggedIn %}
{{ block('not_logged_in') }}
{% elseif notFound %}
{{ block('not_found') }}
{% else %}
{{ block('progress_header') }}
{{ block('progress_exercises') }}
{{ block('progress_schedule') }}
{{ block('progress_actions') }}
{% endif %}
</div>
{% endblock %}
Twig-Templates und Anpassungsmöglichkeitenerfügbare Variablen:
- `assignment`: Infos zur Kurszuordnung (`id`, `status`, `course_title`).
- `exercises`: Liste der Übungen:
- `title`, `module`, `status`, `status_label`, `instructor`, `dateCompleted`.
- `schedule`: Zeitplan des zugehörigen Events.
- `labels`: Übersetzungen für die Ansicht.
Wichtige Blöcke:
- `course_info`: Infos zum gewählten Kurs.
- `progress_summary`: Zusammenfassung der erledigten Übungen.
- `modules_list`: Liste der Kursmodule.
- `exercise_row`: Eine einzelne Übung mit Status.
Weitere Templates
Buchungsübersicht (`dc_booking`)
Template: `mod_dc_booking.html.twig`
- `items`: Liste der Buchungen.
{% block content %}
{% set assets = assets ?? [] %} {# Standardwert setzen, falls assets nicht existiert #}
{{ block('booking_headline') }}
{{ block('booking_intro') }}
{{ block('booking_selection') }}
{{ block('booking_actions_summary') }}
{{ block('booking_items_selection') }}
{% endblock %}'
Ausrüstungs-Auflistung (`dc_equipment_listing`)
Template: `mod_dc_equipment_listing.html.twig`
- `data`: Array mit Ausrüstungstypen (`id`, `title`, `type`).
Vereinsflaschen (`dc_tanks_listing`)
**Template:** `mod_dc_tanks_listing.html.twig`
- `tanks`: Array mit Flaschendaten (Seriennummer, Größe, TÜV-Datum etc.).
Kursübersicht Schüler (`dc_student_courses`)
Template: `mod_dc_student_courses.html.twig`
- `courses`: Liste der Kurse eines Schülers.
Allgemeine Auflistung (`dc_listing`)
**Template:** `mod_dc_listing.html.twig`
- `event`, `proposal`, `articles`: Verknüpfte Daten eines Events.
Best Practices für Anpassungen
- Nicht das Original ändern:
Ändern Sie niemals Dateien direkt im `vendor/`-Verzeichnis oder im Bundle-Ordner selbst (außer Sie entwickeln das Bundle). Nutzen Sie immer das Contao `templates/`-Verzeichnis. - Dateinamen:
Wenn Sie ein Template für alle Instanzen eines Moduls ändern wollen, nutzen Sie den gleichen Namen (z. B. `mod_dc_course_events_list.html.twig`). Wenn Sie eine Variante erstellen wollen, hängen Sie ein Suffix an (z.B. `_custom`) und wählen Sie dieses im Contao-Backend beim Modul aus. - Debugging:
Nutzen Sie `{{ dump() }}`, um alle verfügbaren Variablen in einem Template einzusehen (erfordert den Debug-Modus von Contao). - Mehrsprachigkeit:
Verwenden Sie nach Möglichkeit die bereitgestellten `labels`-Variablen oder den `trans`-Filter für eigene Texte, um die Mehrsprachigkeit zu erhalten.
Entwickler-Dokumentation
Informationen für Entwickler und Redakteure zur Anpassung und Erweiterung des Bundles.
Insert-Tags
Das Bundle bietet spezielle Insert-Tags, um Daten aus der aktuellen Session (z.B. nach einer Buchung) anzuzeigen.
TÜV-Buchungen (`{{ dc_check::* }}`)
Bezieht sich auf Daten aus der Tabelle `tl_dc_check_order` basierend auf der Session `last_tank_check_order`.
| Tag | Beschreibung |
| '{{ dc_check::bookingNumber }}' | Die generierte Buchungsnummer. |
| '{{ dc_check::totalPrice }}' | Gesamtpreis der Buchung. |
| '{{ dc_check::firstname }}' | Vorname des Buchenden. |
| '{{ dc_check::bookingDate }}' | Datum der Buchung (formatiert). |
Kurs-Anmeldungen (`{{ course::* }}`)
Bezieht sich auf Daten der Kurszuordnung basierend auf `last_course_order`.
| Tag | Beschreibung |
| `{{ course::title }}` | Name des Kurses / Events. |
| `{{ course::firstname }}` | Vorname des Schülers. |
| `{{ course::dateStart }}` | Startdatum des Kurses. |
Twig Templates
Das Bundle nutzt Contao 5 Twig Templates. Diese können über Vererbung im globalen `templates/`-Ordner angepasst werden.
Beispiel: Anpassung der Kursliste
Erstellen Sie eine Datei `templates/mod_dc_course_events_list.html.twig`:
{% extends "@Contao/frontend_module/mod_dc_course_events_list" %}
{% block event_title %}
<h3>Kurs: {{ ev.title }}</h3>
{% endblock %}
Wichtige Templates:
- `mod_dc_course_events_list.html.twig`: Liste der Kurstermine.
- `mod_dc_course_event_reader.html.twig`: Detailansicht eines Kurses.
- `mod_dc_tank_check.html.twig`: Formular für die TÜV-Anmeldung.
- `mod_dc_course_progress.html.twig`: Fortschrittsanzeige für Schüler.