diff --git a/open_workshop_dokuwiki/README.md b/open_workshop_dokuwiki/README.md
index 2b2e920..a949d46 100644
--- a/open_workshop_dokuwiki/README.md
+++ b/open_workshop_dokuwiki/README.md
@@ -1,4 +1,142 @@
-Verfügbare Platzhalter:
+# Equipment Übersichtstabelle - Setup
+
+## Voraussetzungen
+
+Das **datatables Plugin** muss in DokuWiki installiert sein:
+```bash
+# Als DokuWiki Admin: Administration → Erweiterungsverwaltung
+# Suche: "datatables"
+# Installiere: "DataTables Plugin" von Matthias Schulte
+```
+
+## Setup-Schritte
+
+### 1. Template-Seite in DokuWiki erstellen
+
+Erstelle die Seite: `werkstatt:ausruestung:uebersicht_template`
+
+Kopiere den Inhalt aus: `dokuwiki_uebersicht_template.txt`
+
+**Wichtige Platzhalter:**
+- `{{EQUIPMENT_TABLE_ROWS}}` → Wird durch Tabellenzeilen ersetzt
+- `{{SYNC_DATETIME}}` → Wird durch Sync-Zeitstempel ersetzt
+
+### 2. Odoo Konfiguration (optional)
+
+Falls andere Seitennamen gewünscht:
+
+```python
+# In Odoo: Einstellungen → Technisch → Parameter → Systemparameter
+
+dokuwiki.overview_page_id = werkstatt:ausruestung:uebersicht
+dokuwiki.overview_template_id = werkstatt:ausruestung:uebersicht_template
+```
+
+### 3. Erste Synchronisation
+
+1. In Odoo: **Wartung → Konfiguration → Wiki-Synchronisation**
+2. Wähle: **"Übersichtstabelle aktualisieren"**
+3. Klicke: **"Synchronisieren"**
+
+Die Übersichtsseite wird erstellt unter: `werkstatt:ausruestung:uebersicht`
+
+## Features
+
+### DataTables Funktionen
+- ✅ Sortieren nach allen Spalten (Klick auf Header)
+- ✅ Filter/Suche über alle Felder
+- ✅ Pagination bei vielen Einträgen
+- ✅ Responsive Design
+
+### Spalten
+| Spalte | Inhalt | Quelle |
+|--------|--------|--------|
+| Name | Link zur Detail-Seite | `maintenance.equipment.name` |
+| Status | In Betrieb, Wartung, etc. | `equipment_status_id` |
+| Sicherheits-Kategorie | 🟢 Grün / 🟡 Gelb / 🔴 Rot | `ows_category` |
+| Bereich | Holzwerkstatt, Metallwerkstatt, etc. | `ows_area_id` |
+| Standort | Freier Text | `location` |
+| Bild | Thumbnail 50px | `image_1920` |
+
+## Performance
+
+- ⚡ Schneller Sync: Keine DB-Iteration über 134 Einträge
+- ⚡ Generiert nur eine Seite (statt 134 einzelne)
+- ⚡ DokuWiki cached die Seite automatisch
+
+## Troubleshooting
+
+### "Template-Seite nicht gefunden"
+→ Erstelle `werkstatt:ausruestung:uebersicht_template` in DokuWiki
+
+### DataTables funktioniert nicht
+→ Installiere DataTables Plugin in DokuWiki
+
+### Bilder werden nicht angezeigt
+→ Prüfe ob Equipment `image_1920` Feld gesetzt hat
+→ Bilder müssen zuerst via "Alle Equipment" Sync hochgeladen werden
+
+### Equipment fehlen in Tabelle
+→ Nur Equipment mit gesetztem `ows_area_id` werden angezeigt
+→ Prüfe Filter in `action_sync_overview_table()`
+
+## Workflow
+
+```
+┌─────────────────┐
+│ Odoo Equipment │
+│ (134 Einträge) │
+└────────┬────────┘
+ │
+ ▼
+┌─────────────────────────┐
+│ _generate_overview_ │
+│ table_row() │ ← Pro Equipment eine Zeile
+│ (maintenance_equipment) │
+└────────┬────────────────┘
+ │ 134 Zeilen
+ ▼
+┌─────────────────────────┐
+│ Template laden │
+│ werkstatt:ausruestung: │
+│ uebersicht_template │
+└────────┬────────────────┘
+ │
+ ▼
+┌─────────────────────────┐
+│ Placeholder ersetzen │
+│ {{EQUIPMENT_TABLE_ROWS}}│
+│ {{SYNC_DATETIME}} │
+└────────┬────────────────┘
+ │
+ ▼
+┌─────────────────────────┐
+│ Seite speichern │
+│ werkstatt:ausruestung: │
+│ uebersicht │
+└─────────────────────────┘
+```
+
+## Automatische Updates
+
+Die Übersichtstabelle wird **NICHT** automatisch bei Equipment-Änderungen aktualisiert.
+
+**Manueller Sync empfohlen:**
+- Nach Massen-Importen
+- Einmal täglich/wöchentlich
+- Bei strukturellen Änderungen (neue Bereiche, etc.)
+
+**Alternativ: Cronjob einrichten**
+```python
+# In Odoo: Einstellungen → Technisch → Automatisierung → Geplante Aktionen
+
+Name: Wiki Übersichtstabelle Update
+Modell: maintenance.equipment
+Aktion: action_sync_overview_table()
+Intervall: Täglich um 02:00 Uhr
+```
+
+# Verfügbare Platzhalter:
Basis-Felder (maintenance.equipment):
diff --git a/open_workshop_dokuwiki/data/dokuwiki_uebersicht_template.txt b/open_workshop_dokuwiki/data/dokuwiki_uebersicht_template.txt
new file mode 100644
index 0000000..3e049ee
--- /dev/null
+++ b/open_workshop_dokuwiki/data/dokuwiki_uebersicht_template.txt
@@ -0,0 +1,24 @@
+====== Geräte & Maschinen - Übersicht ======
+
+Diese Seite wird automatisch von Odoo aktualisiert und bietet eine sortier- und filterbare Übersicht aller Geräte und Maschinen.
+
+**Letztes Update:** {{SYNC_DATETIME}}
+
+
+^ Name ^ Status ^ Sicherheits-Kategorie ^ Bereich ^ Standort ^ Bild ^
+{{EQUIPMENT_TABLE_ROWS}}
+
+
+----
+
+**Hinweis:** Diese Tabelle ist interaktiv:
+ * Klicken Sie auf die Spaltenköpfe zum Sortieren
+ * Nutzen Sie das Suchfeld zum Filtern
+ * Klicken Sie auf den Namen für die Detail-Dokumentation
+
+**Symbole:**
+ * 🟢 Grün = Keine Einweisung erforderlich
+ * 🟡 Gelb = Einweisung empfohlen
+ * 🔴 Rot = Einweisung zwingend erforderlich
+
+//Automatisch generiert aus Odoo - Änderungen werden beim nächsten Sync überschrieben//
diff --git a/open_workshop_dokuwiki/models/maintenance_equipment.py b/open_workshop_dokuwiki/models/maintenance_equipment.py
index 83bf4b6..831fde1 100644
--- a/open_workshop_dokuwiki/models/maintenance_equipment.py
+++ b/open_workshop_dokuwiki/models/maintenance_equipment.py
@@ -532,3 +532,134 @@ Hier kann die Dokumentation für {self.name} geschrieben werden.
record.write({'wiki_synced': False})
return result
+
+ # ==========================================
+ # Übersichtstabelle (DataTable)
+ # ==========================================
+
+ def _generate_overview_table_row(self):
+ """
+ Generiert eine DokuWiki DataTable Zeile für dieses Equipment.
+
+ Format: | [[link|Name]] | Status | Kategorie | Bereich | Standort | {{image.jpg?50}} |
+
+ Returns:
+ str: Wiki-Markup für eine Tabellenzeile
+ """
+ self.ensure_one()
+
+ # Name mit Link zur Detail-Seite
+ wiki_doku_id = self._get_wiki_doku_id()
+ doku_page_id = self._get_wiki_doku_page_id()
+ name_link = f"[[{doku_page_id}|{self.name}]]" if wiki_doku_id else self.name
+
+ # Status (maintenance_equipment_status)
+ status = self.status_id.name if self.status_id else "-"
+
+ # Sicherheitskategorie
+ category_map = {
+ 'green': '🟢 Grün',
+ 'yellow': '🟡 Gelb',
+ 'red': '🔴 Rot',
+ }
+ ows_category = category_map.get(self.ows_category, '-')
+
+ # Bereich
+ area = self.ows_area_id.name if self.ows_area_id else "-"
+
+ # Standort
+ location = self.location if self.location else "-"
+
+ # Bild (als Thumbnail 50px)
+ if self.image_1920:
+ media_id = self._get_wiki_media_id()
+ image = f"{{{{:{media_id}?50}}}}"
+ else:
+ image = "-"
+
+ # Tabellenzeile
+ row = f"| {name_link} | {status} | {ows_category} | {area} | {location} | {image} |"
+
+ return row
+
+ @api.model
+ def action_sync_overview_table(self):
+ """
+ Aktualisiert die Übersichtstabelle in DokuWiki mit allen Equipment-Einträgen.
+
+ Diese Methode:
+ 1. Lädt das Template aus DokuWiki (mit {{EQUIPMENT_TABLE_ROWS}} Placeholder)
+ 2. Generiert für jedes Equipment eine Tabellenzeile
+ 3. Ersetzt den Placeholder mit den generierten Zeilen
+ 4. Speichert die Übersichtsseite zurück zu DokuWiki
+
+ Returns:
+ dict: Ergebnis-Dictionary mit 'total', 'success', 'error_messages'
+ """
+ IrConfigParameter = self.env['ir.config_parameter'].sudo()
+ dokuwiki_client = self.env['dokuwiki.client']
+
+ # Config Parameter
+ overview_page_id = IrConfigParameter.get_param('dokuwiki.overview_page_id', 'werkstatt:ausruestung:uebersicht')
+ overview_template_id = IrConfigParameter.get_param('dokuwiki.overview_template_id', 'werkstatt:ausruestung:uebersicht_template')
+
+ try:
+ # Template aus Wiki laden
+ template_content = dokuwiki_client.get_page(overview_template_id)
+
+ if not template_content:
+ raise UserError(f"Template-Seite '{overview_template_id}' nicht gefunden! Bitte erst im Wiki erstellen.")
+
+ # Alle Equipment mit ows_area_id laden (sortiert nach Bereich, dann Name)
+ equipment_records = self.search([
+ ('ows_area_id', '!=', False)
+ ], order='ows_area_id, name')
+
+ if not equipment_records:
+ raise UserError("Keine Equipment-Einträge mit Bereich gefunden!")
+
+ # Tabellenzeilen generieren
+ table_rows = []
+ for equipment in equipment_records:
+ try:
+ row = equipment._generate_overview_table_row()
+ table_rows.append(row)
+ except Exception as e:
+ _logger.warning(f"Fehler beim Generieren der Zeile für {equipment.name}: {e}")
+ continue
+
+ # Rows zusammenfügen
+ table_rows_markup = '\n'.join(table_rows)
+
+ # Placeholder ersetzen
+ overview_content = template_content.replace('{{EQUIPMENT_TABLE_ROWS}}', table_rows_markup)
+
+ # Sync-Zeitstempel hinzufügen
+ sync_datetime = datetime.now().strftime('%d.%m.%Y %H:%M:%S')
+ overview_content = overview_content.replace('{{SYNC_DATETIME}}', sync_datetime)
+
+ # Seite in DokuWiki speichern
+ dokuwiki_client.create_page(
+ overview_page_id,
+ overview_content,
+ f"Automatisches Update der Übersichtstabelle ({len(table_rows)} Equipment)"
+ )
+
+ _logger.info(f"✓ Übersichtstabelle aktualisiert: {len(table_rows)} Equipment in {overview_page_id}")
+
+ return {
+ 'total': len(equipment_records),
+ 'success': len(table_rows),
+ 'error_messages': '',
+ 'overview_url': dokuwiki_client.get_wiki_url(overview_page_id),
+ }
+
+ except Exception as e:
+ error_msg = f"Fehler beim Aktualisieren der Übersichtstabelle: {str(e)}"
+ _logger.error(error_msg)
+ return {
+ 'total': 0,
+ 'success': 0,
+ 'error_messages': error_msg,
+ 'overview_url': '',
+ }
diff --git a/open_workshop_dokuwiki/models/res_config_settings.py b/open_workshop_dokuwiki/models/res_config_settings.py
index 1c9edc2..060a2ff 100644
--- a/open_workshop_dokuwiki/models/res_config_settings.py
+++ b/open_workshop_dokuwiki/models/res_config_settings.py
@@ -21,6 +21,8 @@ class ResConfigSettings(models.TransientModel):
'dokuwiki.url': 'https://wiki.hobbyhimmel.de',
'dokuwiki.user': 'odoo.odoo',
'dokuwiki.password': 'CHANGE_ME',
+ 'dokuwiki.overview_page_id': 'werkstatt:ausruestung:uebersicht',
+ 'dokuwiki.overview_template_id': 'werkstatt:ausruestung:uebersicht_template',
}
# Nur fehlende Parameter anlegen
diff --git a/open_workshop_dokuwiki/wizard/equipment_wiki_sync_wizard.py b/open_workshop_dokuwiki/wizard/equipment_wiki_sync_wizard.py
index ca7a8d6..02185bd 100644
--- a/open_workshop_dokuwiki/wizard/equipment_wiki_sync_wizard.py
+++ b/open_workshop_dokuwiki/wizard/equipment_wiki_sync_wizard.py
@@ -14,6 +14,7 @@ class EquipmentWikiSyncWizard(models.TransientModel):
('all', 'Alle Equipment'),
('area', 'Nach Bereich filtern'),
('unsynced', 'Nur nicht synchronisierte'),
+ ('overview_table', 'Übersichtstabelle aktualisieren'),
], string='Synchronisations-Modus', default='all', required=True)
ows_area_id = fields.Many2one(
@@ -33,6 +34,7 @@ class EquipmentWikiSyncWizard(models.TransientModel):
success_count = fields.Integer(string='Erfolgreich', readonly=True)
error_count = fields.Integer(string='Fehler', readonly=True)
error_messages = fields.Text(string='Fehlermeldungen', readonly=True)
+ overview_url = fields.Char(string='Übersichtsseite URL', readonly=True)
@api.onchange('sync_mode')
def _onchange_sync_mode(self):
@@ -46,6 +48,10 @@ class EquipmentWikiSyncWizard(models.TransientModel):
"""
self.ensure_one()
+ # Übersichtstabelle-Modus: Schneller Update ohne Equipment-Iteration
+ if self.sync_mode == 'overview_table':
+ return self._sync_overview_table()
+
# Equipment-Liste basierend auf Modus ermitteln
domain = []
@@ -121,3 +127,38 @@ class EquipmentWikiSyncWizard(models.TransientModel):
'target': 'new',
'context': {'show_result': True},
}
+
+ def _sync_overview_table(self):
+ """
+ Aktualisiert die Übersichtstabelle in DokuWiki.
+ Ruft die Methode im maintenance.equipment Model auf.
+
+ Returns:
+ dict: Action zum Anzeigen des Ergebnisses
+ """
+ self.ensure_one()
+
+ _logger.info("Starte Übersichtstabellen-Synchronisation")
+
+ # Equipment Model aufrufen
+ result = self.env['maintenance.equipment'].action_sync_overview_table()
+
+ # Statistik speichern
+ self.write({
+ 'total_count': result.get('total', 0),
+ 'success_count': result.get('success', 0),
+ 'error_count': result.get('total', 0) - result.get('success', 0),
+ 'error_messages': result.get('error_messages', 'Keine Fehler'),
+ 'overview_url': result.get('overview_url', ''),
+ })
+
+ # Ergebnis-View anzeigen
+ return {
+ 'type': 'ir.actions.act_window',
+ 'name': 'Übersichtstabelle aktualisiert',
+ 'res_model': 'equipment.wiki.sync.wizard',
+ 'view_mode': 'form',
+ 'res_id': self.id,
+ 'target': 'new',
+ 'context': {'show_result': True},
+ }
diff --git a/open_workshop_dokuwiki/wizard/equipment_wiki_sync_wizard_views.xml b/open_workshop_dokuwiki/wizard/equipment_wiki_sync_wizard_views.xml
index e9d6f8d..9102a0c 100644
--- a/open_workshop_dokuwiki/wizard/equipment_wiki_sync_wizard_views.xml
+++ b/open_workshop_dokuwiki/wizard/equipment_wiki_sync_wizard_views.xml
@@ -12,7 +12,7 @@
-
+
@@ -24,6 +24,7 @@
+