Commit Graph

197 Commits

Author SHA1 Message Date
aeb8e5660b feat: Add timeout detection and comprehensive test suite
- Implement check_timeouts() for session timeout detection (20s)
- Fix code duplication bug in session_detector.py
- Add periodic timeout check in main loop (every 1s)
- Add 13 unit tests for session detection
- Add 5 integration tests with real MQTT broker
- Document Odoo integration strategy in README
- Remove hardcoded credentials, use env vars
- All 18 tests passing
2026-01-24 11:32:23 +01:00
4c03959437 feat(mqtt): Implement M0-M3 - MQTT IoT Bridge with Session Detection
- M0: MQTT Client with TLS/SSL support
  - Connection to mqtt.majufilo.eu:8883
  - Topic subscription with wildcards
  - JSON payload parsing

- M1: Shelly PM Mini G3 Integration
  - Status message parser (shaperorigin/status/pm1:0)
  - Custom MQTT topic prefix support
  - Power, voltage, current, frequency extraction
  - Device mapping via topic_prefix

- M2: Event Normalization
  - Event Schema v1 with UUID-based event IDs
  - ISO 8601 UTC timestamps
  - Machine/Device info mapping
  - Metrics normalization (power_w, voltage_v, current_a, frequency_hz)
  - Filter None values

- M3: Session Detection Engine
  - State machine: IDLE → STARTING → RUNNING → STOPPING → IDLE
  - Power-based threshold detection (configurable per machine)
  - Debounce logic (separate for start/stop)
  - Session events with duration calculation
  - Persistent storage (JSONL for events, JSON for sessions)
  - Odoo-ready data format for future migration

Data Storage:
- events.jsonl: JSON Lines format (one event per line)
- sessions.json: Session records with start/end/duration
- Ready for migration to open_workshop.session model

Multi-device ready: Add devices via config.yaml with unique topic_prefix
2026-01-22 19:59:17 +01:00
75d91984d1 feat: Wiki-Links in Tree View als klickbare Namen anzeigen
Änderungen:
- maintenance_equipment.py: Zwei neue computed HTML-Felder hinzugefügt:
  - wiki_doku_link: Zeigt wiki_doku_id als Link zur Dokumentations-Seite
  - wiki_status_link: Zeigt wiki_status_id als Link zur Odoo-Status-Seite
- maintenance_equipment_views.xml: Tree View erweitert mit Wiki-Links
  - Wiki Doku: Standardmäßig sichtbar (optional='show')
  - Wiki Status: Standardmäßig ausgeblendet (optional='hide')
- maintenance_equipment_views.xml: Formular-Layout verbessert
  - Doku-Seite mit prominentem Link oben

Nutzen:
- Benutzer sehen jetzt 'sabko-laser' statt vollständige URL
- Links sind klickbar und öffnen in neuem Tab
- Übersichtlichere List View mit relevanten Wiki-Informationen
2026-01-19 20:57:43 +01:00
77cd3f4595 fix: Deprecated force_sync Feature entfernt und wiki_doku_id bei Reset erhalten
Änderungen:
- maintenance_equipment.py: wiki_doku_id wird bei action_reset_wiki_sync_status() nicht mehr zurückgesetzt (ist manuell editierbar)
- equipment_wiki_sync_wizard.py: Deprecated force_sync Feld und zugehörige Logik entfernt
- equipment_wiki_sync_wizard_views.xml: force_sync UI-Element entfernt
- FEATURE_REQUEST/Odoo18_MQTT_IoT.md: Projektplan für MQTT-basierte IoT-Events hinzugefügt

Grund:
- force_sync Feature referenzierte nicht existierende Methoden (_generate_wiki_doku_page_content, _get_wiki_doku_page_id)
- wiki_doku_id ist jetzt manuell editierbar und sollte nicht automatisch zurückgesetzt werden
- Cleanup von veralteter/fehlerhafter Funktionalität
2026-01-19 20:27:17 +01:00
4684d33241 fix(dokuwiki): Migration-Script optimiert - entfernt Docstring
Die Kommentare waren überflüssig. Das vereinfachte Script funktioniert.
Lokal getestet mit Produktions-Datenbank: Upgrade erfolgreich.
2026-01-18 14:38:31 +01:00
85a90f90fd fix(dokuwiki): Verbessertes Pre-Migration-Script mit robuster Fehlerbehandlung
- Explizite Commits nach jeder ALTER TABLE Operation
- Besseres Logging mit Statusmeldungen
- Verifizierung nach Migration
- Fehlerbehandlung mit detaillierten Fehlermeldungen
- Prüfung ob maintenance_equipment Tabelle existiert
2026-01-18 14:23:46 +01:00
0d27ca36b0 feat(dokuwiki): Trennung von wiki_status_id und wiki_doku_id, verbesserte UI
- Neues Feld wiki_status_id: Eindeutige ID für Odoo-Status-Seite (name-seriennummer)
- Überarbeitung wiki_doku_id: Editierbar, für Benutzer-Dokumentation (Duplikate erlaubt)
- Funktion _get_wiki_doku_page_id → _get_wiki_status_page_id (bessere Benennung)
- Template-Platzhalter: wiki_doku_page/link → wiki_status_page/link
- Pre-Migration-Script für Upgrade ohne Fehler (18.0.2.1.0)

View-Verbesserungen:
- 3-spaltige Darstellung: Wiki Status Seite | Wiki Dokumentations Seite
- Separate Gruppe für Wiki URL
- Erweiterte Hilfe mit Unterscheidung Status-/Doku-Seite
- Include-Plugin-Beispiel für DokuWiki-Integration

Version: 18.0.2.0.0 → 18.0.2.1.0
2026-01-18 13:47:38 +01:00
b85ec97d9c DokuWiki: wiki_doku_id nutzt jetzt name + comp_serial_no für garantierte Eindeutigkeit
- _get_wiki_doku_id() generiert Format: {normalized_name}-{comp_serial_no}
- Automatische Generierung von comp_serial_no falls nicht vorhanden
- Nutzt aspl_equipment_qrcode_generator Modul für eindeutige Seriennummern
- Entfernt Fallback zu name+model (kein Fallback mehr)
- Vorbereitung für editierbare wiki_doku_id in nächstem Schritt
2026-01-18 12:53:06 +01:00
f9cbcffe34 open_workshop_dokuwiki: tags_list now with space separated output 2026-01-17 20:12:07 +01:00
fe09d1439f Update custom widget 2026-01-13 17:53:31 +01:00
23b9867eec Increase backup cron time limit to 1 hour
- Default 120s timeout was too short for large SFTP uploads
- Set time_limit to 3600s (1 hour) to prevent incomplete backups
- Fixes timeout during SFTP upload causing server reload
2026-01-13 17:51:10 +01:00
00df958985 Umstellung: Employee Image Generator speichert nur Foto, Customer Display baut Badge dynamisch
Employee Image Generator:
- Speichert nur zugeschnittenes 369×492px Foto (nicht mehr A4-Badge)
- Speichert job_focus zusätzlich zu image_1920
- html2canvas Dependency entfernt
- Vorschau bleibt zur Visualisierung

Customer Display:
- Baut Badge dynamisch aus Employee-Daten (Foto, Name, job_focus)
- Responsive Design basierend auf thekenheld print.html
- Neues employee_badge.css für Screen-Optimierung
- Footer bleibt immer am unteren Bildschirmrand
- job_focus mit max-height und overflow für lange Texte
- Lädt job_focus über hr.employee ID (nicht user_id)

Vorteile: Flexibler, aktuelle Daten, kleinere Dateien, wiederverwendbares Foto
2026-01-12 19:10:43 +01:00
98c96018d6 Fix SFTP makedirs error with trailing slashes
- Normalize remote paths by removing trailing slashes
- Improve error handling for directory creation
- Fix OSError handling (errno not reliably set in SFTP)
- Prevents duplicate directory creation attempts
2026-01-11 20:43:25 +01:00
b2f7a5edbf added auto_backup tool 2026-01-11 20:21:24 +01:00
d6c2986ebf Verbessere Image Generator: Fixierter Crop-Rahmen, optimierte Vorschau-Skalierung
- Crop-Rahmen ist fixiert (nicht verschiebbar/skalierbar), nur Bild bewegbar
- Zuschnitt auf exakt 369×492 Pixel
- Finales Badge im A4-Format (794×1123px / 21×29.7cm)
- Vorschau auf 35% skaliert mit korrektem Platzverbrauch
- Große Bilder passen initial in Container, unbegrenztes Zoomen möglich
- Badge-Template behält alle mm/cm-Maße aus print.html
2026-01-11 18:22:10 +01:00
67184e7e01 fixed template 2026-01-10 19:18:55 +01:00
ee0e6c8b98 added ignored lib 2026-01-10 19:14:25 +01:00
1c9829a7aa feat: open_workshop_employee_imagegenerator - Thekenheld Badge-Generator als Odoo Modul
- OWL Component mit 3-step Wizard (Upload → Crop → Text/Preview)
- Cropper.js für Bildausschnitt (369×492px)
- html2canvas für PNG-Generierung (794×1123px A4)
- Badge-Template mit originalen CSS von Thekenheld
- Speicherung in hr.employee.image_1920
2026-01-10 16:42:39 +01:00
1abeb97afa Cleanup: Remove debug logs, unused backend files, add comprehensive comments
- Removed all console.log debug statements from JavaScript files
- Deleted unnecessary backend models (hr_employee.py, res_users.py, pos_session.py, pos_config.py)
- Added comprehensive German comments explaining the BroadcastChannel architecture
- Updated README with detailed technical documentation about frontend-only approach
- Removed debug info box from customer display template
- Simplified __init__.py files (pure frontend solution)

The module now uses a clean, maintainable frontend-only approach that:
- Patches Chrome component with effect(batched()) for reactive updates
- Sends cashier data via BroadcastChannel (same pattern as order updates)
- Uses hr.employee.public URL format (identical to POS navbar)
- Falls back to company logo when no employee image available
2026-01-10 15:10:51 +01:00
daddb51327 Add POS customer display customization module
- Show current cashier's employee image in customer display sidebar
- Image updates automatically when cashier changes
- Fallback to company logo when no image available or before first order
- Uses BroadcastChannel to sync between POS and customer display
- Full-size image display with correct aspect ratio (object-fit: contain)
2026-01-10 14:49:50 +01:00
5d1faa7b5b POS: Preislistenabhängige Preisanzeige auf Produktkarten
- Fügt reaktive Preisanzeige auf POS-Produktkarten hinzu
- Preis wird basierend auf der Preisliste des aktuellen Kunden berechnet
- Automatische Aktualisierung bei Kundenwechsel/Preislistenänderung
- Unterstützt Maßeinheiten für gewichtsbasierte Produkte
2026-01-09 22:11:01 +01:00
21b0d6305f POS: Rechnungs-Button im Payment Screen entfernt 2026-01-09 21:05:20 +01:00
988421a0c5 POS: Replace internal note button with pricelist button
- Remove internal note button from control buttons
- Add pricelist button directly visible in main view (not only in Actions dialog)
- Shows current pricelist name of the order/partner
- Allows direct access to change pricelist without opening Actions menu
2026-01-09 15:24:26 +01:00
b26e70dbe9 fix: Support multiple file types (PNG, PDF, JPEG) for DokuWiki media uploads
- Make upload_media accept ir.attachment records, IDs, or raw bytes
- Detect file extension from binary content using imghdr
- Build media_id with correct extension (.png, .jpg, .pdf)
- Prevent DokuWiki 'file extension mismatch' error
- Improve temp file cleanup with proper error handling
2026-01-08 17:13:34 +01:00
38d0becfad Fix: Korrigiere Zeitanzeige in POS Sidebar (UTC zu lokaler Zeit) 2026-01-07 19:01:41 +01:00
943d48af58 DokuWiki: Media-Namespace an DokuWiki Best Practice angepasst
- Geändert von :media: Sub-Namespace zu paralleler Struktur :{area}:
- Media-IDs folgen jetzt dem gleichen Muster wie Pages
- Alt: werkstatt:ausstattung:media:{id}.jpg
- Neu: werkstatt:ausstattung:{bereich}:{id}.jpg
- Entspricht DokuWiki-Konvention für parallele Page/Media-Strukturen
- Dokumentation im Docstring aktualisiert
2026-01-07 13:41:50 +01:00
09f28c8070 DokuWiki: Fix partner_ref sync und Template-Cache
- partner_ref zu sync_fields hinzugefügt für automatische Synchronisation
- action_clear_template_cache() Methode hinzugefügt zum manuellen Leeren des Caches
- Template-Cache-Leeren Button im Wiki-Sync Wizard
- Debug-Logging für partner_ref Wert

Fixes: partner_ref wurde nicht automatisch synchronisiert und Template-Änderungen erforderten Server-Neustart
2026-01-07 12:37:34 +01:00
40a5fe8b0f wiki_doku_id wird bei einem Sync Statut reset auch zurück gesetzt 2026-01-07 11:02:22 +01:00
31a40e95d7 Add voucher codes display in POS receipt
- Create ows_order_patch.js to collect voucher codes from orderlines
- Add voucher codes section at end of receipt with large readable format
- Include voucher code, product name, and value for each voucher
- Move partner name logic from receipt_header_patch to order_patch
- Add German labels (GUTSCHEIN-CODES, Wert:)
2026-01-06 14:48:09 +01:00
91209dead4 manifest 2026-01-06 14:12:51 +01:00
9cb6dc8ac5 Add partner name display in POS receipt header
- Patch PosOrder.export_for_printing() to include partner data in headerData
- Update receipt header template to display partner name above tracking number
- Partner name shown only when partner is selected for the order
2026-01-06 14:03:55 +01:00
93385abb0f [ADD] open_workshop_pos: Standard-Kategorie beim POS-Start
- Automatische Auswahl einer konfigurierbaren Standard-Kategorie
- Konfiguration über Kategorie-Name oder ID möglich
- Aktuell auf 'Nutzung' gesetzt
- Vereinfacht die Navigation für häufig genutzte Kategorien
2026-01-06 11:43:56 +01:00
e443f8709d added darker background color for pos 2026-01-06 11:29:16 +01:00
b151894c39 [IMP] open_workshop_pos: Fix Produktsuche und verbessere UI
- Fix: ProductScreen Patch korrigiert - Suchfeld erscheint wieder
  * Verwendung von patch() statt Klassen-Vererbung für korrekte Komponenten-Registrierung
  * Behebt OwlError 'Cannot find OwsPosSidebar'

- Add: Preisanzeige auf Produktkarten
  * Listenpreis wird unter Produktname angezeigt
  * Konsistente Ausrichtung am unteren Rand
  * Produkte mit/ohne Bild haben gleiche Preis-Position

- UX: Warenkorb-Mengenanzeige auf Produktkarten entfernt
  * Ruhigeres, übersichtlicheres Erscheinungsbild
  * Mengen nur noch in Bestellübersicht sichtbar
2026-01-06 11:25:24 +01:00
0c4b58e0a6 Update Open Workshop Dokuwiki Version 2025-12-27 20:37:02 +01:00
e460acddf3 DokuWiki: Reset-Funktion für Wiki-Sync-Status
Neue Funktion im Modul:
- action_reset_wiki_sync_status() in maintenance_equipment.py
- Setzt wiki_synced und wiki_last_sync zurück
- Aufrufbar über Wizard: Wartung → Konfiguration → Wiki-Synchronisation
- Neuer Modus: 'Sync-Status zurücksetzen'

Verwendung:
1. Nach Namespace-Änderungen (ausruestung → ausstattung)
2. Wenn alle Equipment neu synchronisiert werden sollen
3. Bei Wiki-Struktur-Änderungen

Setzt NUR den Status zurück, nicht die wiki_doku_id
(wiki_doku_id kann bei Bedarf manuell zurückgesetzt werden)
2025-12-27 20:25:17 +01:00
a1c6903893 Update Dokuwiki Template in maintenance equipment 2025-12-27 19:54:43 +01:00
72a46e3657 DokuWiki: Übersichtstabelle in 'uebersicht' statt 'start'
- Systemparameter dokuwiki.overview_page_id: werkstatt:ausstattung:uebersicht
- README.md aktualisiert mit neuem Pfad
- 'start' Seite kann nun für andere Zwecke genutzt werden (z.B. Willkommensseite)
2025-12-27 17:01:55 +01:00
641bfb3ade DokuWiki Integration: Neue Namespace-Struktur mit odoo-status
BREAKING CHANGES:
- Namespace-Struktur komplett überarbeitet
- ausruestung → ausstattung (konfigurierbar über dokuwiki.equipment_namespace)
- Neue Struktur: ausstattung:odoo-status/ für Odoo-generierte Status-Seiten
- Odoo erstellt KEINE Benutzer-Seiten mehr in {bereich}/ Namespaces

Neue Systemparameter:
- dokuwiki.equipment_namespace = werkstatt:ausstattung (Basis-Namespace)
- dokuwiki.central_documentation_namespace = werkstatt:ausstattung:odoo-status

Workflow-Änderung:
1. Odoo synchronisiert → erstellt nur start und odoo-status/ Seiten
2. Übersichtstabelle verlinkt auf {bereich}/{equipment_id} → Links sind rot
3. Benutzer klickt roten Link → DokuWiki bietet Seitenerstellung an
4. Benutzer erstellt Seite mit {{page>odoo-status:equipment_id}}

Vorteile:
- Klare Trennung: odoo-status/ (nur Odoo) vs. {bereich}/ (nur Benutzer)
- Keine Überschreibgefahr - Odoo und Benutzer haben getrennte Namespaces
- Benutzer entscheiden selbst ob/wann sie Dokumentation erstellen
- ACL-Schutz: odoo-status/ nur von odoo.odoo schreibbar
2025-12-27 16:56:17 +01:00
a73c0cb299 Integration Plan für automatisierte DokuWiki-Report-Generierung
Roadmap für vollautomatische monatliche PNG-Export-Generierung:
- Graph-Renderer mit Matplotlib/Plotly (alle Metabase-Features möglich)
- Scheduled Action (Cron) für monatliche Ausführung
- DokuWiki XML-RPC Upload Integration
- 5 Diagramm-Typen: Tagesansicht, Jahresvergleich, Trends, Wiederholungstäter
- Aufwand: 5-7 Stunden Implementierung

Vorteil: Vollautomatisch, professionelle Visualisierung mit Beschriftungen,
kein manueller Metabase-Export mehr nötig
2025-12-26 23:47:24 +01:00
4626379d6e Korrektur Ø Nutzer/Tag Berechnung und finale Verbesserungen
- Ø Nutzer/Tag Formel korrigiert: Buchungen/Tage statt Nutzer/Tage
- Jahr/Monat Felder zu DailyStats hinzugefügt für flexible Gruppierung
- Alle 2034 Datensätze neu generiert mit korrekten Werten
- show_measures zu allen Graph-Views hinzugefügt (Odoo-Limitation: funktioniert nicht)

LIMITIERUNG: Weitere Verbesserungen gegenüber Metabase nicht möglich
- Odoo Graph-Views können keine Werte auf Balken anzeigen
- 100% gestapelte Diagramme nicht möglich
- Komplexe Visualisierungen wie Häufigkeitsverteilungen nicht realisierbar
- Für Präsentationen und Export: Metabase bleibt überlegen

Empfehlung: Odoo für operative Arbeit, Metabase für Präsentationen nutzen
2025-12-26 23:40:42 +01:00
9be8f320f7 Tägliche Statistiken mit Drill-Down und Jahresvergleich
- Tägliche Statistiken (DailyStats) implementiert mit 2034 Datensätzen
- Wochenende vs. Wochentag farblich unterschieden in Tagesansicht
- Jahr/Monat Felder für Jahresvergleich hinzugefügt
- Button 'Tagesansicht' in Kanban-Dashboard für Drill-Down zu täglichen Statistiken
- Alle Dashboard-Graphen auf Jahresvergleich umgestellt (Monat × Jahr, nicht gestapelt)
- Jahresvergleich, Ø Nutzer/Tag, Wiederholungstäter, Nutzer pro Monat - alle mit Jahresvergleich
2025-12-26 21:35:22 +01:00
d6a98cfbd0 initiale Version von Open Workshop Report 2025-12-26 19:14:17 +01:00
0135035a54 DokuWiki Integration: Performance-Optimierung und Best Practices
- Connection Caching: Wiederverwendung von DokuWiki-Verbindungen (von 12min auf 20s für 50 Equipment)
- Template Caching: Template nur einmal laden statt pro Equipment
- Dokumentation: Best Practices für erweiterbare DokuWiki-Seitenstruktur (page.txt + page/ ohne start.txt)
- Catlist-Syntax dokumentiert für automatische Unterseiten-Auflistung
2025-12-24 14:13:59 +01:00
f79e126c8c DokuWiki Integration: wiki_doku_id aus Name+Modell, zentraler Namespace konfigurierbar
- wiki_doku_id wird nun aus equipment.name und equipment.model kombiniert generiert
- Systemparameter 'dokuwiki.central_documentation_namespace' für konfigurierbaren Namespace
- Verbessertes Error-Handling in dokuwiki_client mit detaillierteren Fehlermeldungen
- Docker-Netzwerk Unterstützung dokumentiert
- Gelöschte veraltete WordPress-API Dateien
2025-12-23 14:48:44 +01:00
253d289633 feat(dokuwiki): Flexible overview table with configurable columns
- Made overview table columns fully configurable via system parameters
- Added wiki_page_id placeholder for internal DokuWiki links
- Removed DokuWiki template dependency for overview table
- Added _register_hook to initialize parameters on module load/update
- Updated README with new configuration approach
- System parameters: overview_page_id, overview_title, overview_columns, overview_column_data
- Default columns: Name (with link), Status, Security Category, Area, Location, Image
2025-12-20 12:49:58 +01:00
de317f46e6 feat(dokuwiki): Add equipment overview table with DataTables
- Add _generate_overview_table_row() to generate table row per equipment
- Add action_sync_overview_table() for fast overview page sync
- Add new sync mode 'Übersichtstabelle aktualisieren' in wizard
- Add config parameters for overview page and template IDs
- Add overview_url field to wizard result view
- Columns: Name (linked), Status, Security Category, Area, Location, Image
- Performance: Single page update without iterating all equipment
- Include DokuWiki template and setup documentation
- Requires DokuWiki DataTables plugin for sortable/filterable table
- Fix: Use status_id instead of equipment_status_id
2025-12-19 20:40:29 +01:00
8ae586cca6 feat: Auto-create ows.machine on equipment import/create
- Add @api.model_create_multi hook to MaintenanceEquipment.create()
- Add load() override to handle Excel/CSV import correctly
- Add _create_missing_ows_machines() helper with recursion prevention
- Modify OwsMachine.create() to only create equipment if equipment_id not provided
- Use context flag 'skip_ows_machine_creation' to prevent infinite recursion
- Fixes: Equipment import now auto-creates ows.machine and displays OWS tab
- Migration tested: Compatible with SQL-based post-migration (23/23 machines migrated)
2025-12-19 20:12:54 +01:00
e18f2880a4 Make post-migration.py more robust when setting default status
- Check if status 'In Betrieb' exists before setting it
- Add warning if status not found instead of SQL error
- Status records are created automatically via XML data file
2025-12-18 20:56:14 +01:00
43cf5754fd Add automated maintenance equipment status creation with smileys
- open_workshop_base: Create 4 status records (In Betrieb, Defekt, Wartung, Ausgemustert) via XML data
- open_workshop_dokuwiki: Add smiley field to status model and populate with DokuWiki smileys/emojis
- Use noupdate=1 to prevent overwriting user customizations
- Status data loads automatically during module installation
2025-12-18 20:53:04 +01:00