Das ist ein Odoo Modul für die Verwaltung von Maschinen, Einweisungen für Nutzer in einer offenen Werkstatt / Fablab
Go to file
2026-02-07 19:44:47 +01:00
.devcontainer FIX: pos: wenn auf - gedrückt wird um eine Order zu entfernen, wurde nicht 2025-10-25 14:10:25 +02:00
.gitea/workflows .gitea/workflows/odoo-restore-open_workshop_install.yaml aktualisiert 2025-04-23 21:46:02 +02:00
.vscode FIX: pos: wenn auf - gedrückt wird um eine Order zu entfernen, wurde nicht 2025-10-25 14:10:25 +02:00
aspl_equipment_qrcode_generator feat(aspl_equipment_qrcode_generator): Fix QR-code generation and PDF rendering 2025-12-11 21:53:21 +01:00
FEATURE_REQUEST feat(mqtt): Implement M0-M3 - MQTT IoT Bridge with Session Detection 2026-01-22 19:59:17 +01:00
log working merge with open_workshop 17.0. Missing Traings view in Machine Backend. No POS Machine sidebar. 2025-06-28 15:31:59 +02:00
open_workshop_base Improve product assignment UX with many2many_tags widget 2026-02-07 19:12:15 +01:00
open_workshop_dokuwiki feat: Wiki-Links in Tree View als klickbare Namen anzeigen 2026-01-19 20:57:43 +01:00
open_workshop_employee_imagegenerator Update custom widget 2026-01-13 17:53:31 +01:00
open_workshop_mqtt IOT Bridge noch nicht so richtig funktionsfähig. Odoo MQTT muss noch aufgeräumt werden 2026-02-07 19:44:47 +01:00
open_workshop_pos fix: POS-Funktionalität in open_workshop_pos verschoben + Workarounds 2026-01-28 18:55:55 +01:00
open_workshop_pos_customer_display Umstellung: Employee Image Generator speichert nur Foto, Customer Display baut Badge dynamisch 2026-01-12 19:10:43 +01:00
open_workshop_report Integration Plan für automatisierte DokuWiki-Report-Generierung 2025-12-26 23:47:24 +01:00
.gitignore fix: MQTT topic matching + UI button fixes 2026-01-28 22:08:59 +01:00
open_workshop.code-workspace FIX: pos: wenn auf - gedrückt wird um eine Order zu entfernen, wurde nicht 2025-10-25 14:10:25 +02:00
README.md Improve product assignment UX with many2many_tags widget 2026-02-07 19:12:15 +01:00
todo.md working merge with open_workshop 17.0. Missing Traings view in Machine Backend. No POS Machine sidebar. 2025-06-28 15:31:59 +02:00

Open Workshop

POS-basiertes Maschinenfreigabe- und Werkstattverwaltungssystem für Odoo

Open Workshop ist eine modulare Erweiterung des Odoo POS-Systems zur Verwaltung von einweisungspflichtigen Maschinen und Geräten in Werkstätten, Makerspaces und FabLabs. Das System ermöglicht die Verwaltung von Maschinenfreigaben, Einweisungen und Equipment-Dokumentation.


Hauptfunktionen

  • Maschinenfreigaben: Verwaltung von kundenspezifischen Freigaben für einweisungspflichtige Geräte

  • Sicherheitskategorien: Dreistufiges Kategoriesystem (grün/gelb/rot) für unterschiedliche Einweisungspflichten

  • POS-Integration: Verkauf von Einweisungen und Anzeige von Maschinenfreigaben direkt am Point of Sale

  • Equipment-Verwaltung: Vollständige Integration mit dem OCA Maintenance-Modul

  • Dokumentation: Automatische Synchronisation von Equipment-Daten mit DokuWiki

  • Mitarbeiter-Display: Dynamische Anzeige von Mitarbeiterdaten im POS Customer Display


Module

open_workshop_base

Kernmodul - Stellt die Basis-Funktionalität für das gesamte System bereit.

Hauptfunktionen:

  • Maschinenmodelle mit Sicherheitskategorien (grün/gelb/rot)
  • Bereiche (z.B. Holz, Metall, FabLab)
  • Freigabeverwaltung (wer darf welche Maschine nutzen)
  • Produktverknüpfungen für Einweisungen und Nutzung
  • Integration mit OCA maintenance.equipment als Single Source of Truth

Datenmodelle:

  • ows.user - Benutzerdaten (RFID, Geburtstag, Sicherheitsunterweisung)
  • ows.machine.area - Maschinenbereiche mit Farbkodierung
  • ows.machine - Maschinen (nutzt _inherits Pattern mit maintenance.equipment)
  • ows.machine.access - Freigaben (Partner ↔ Maschine)
  • ows.machine.product - Nutzungsprodukte für Maschinen
  • ows.machine.training - Einweisungsprodukte für Maschinen

Abhängigkeiten:

  • OCA maintenance (Basis-Equipment-Verwaltung)

  • OCA maintenance_equipment_status (Equipment-Statusverwaltung)

    git clone https://github.com/OCA/maintenance.git
    cd maintenance
    git reset --hard 5510275e
    

open_workshop_pos

POS-Integration - Erweitert den Odoo Point of Sale um Maschinenfreigabe-Funktionalität.

Hauptfunktionen:

  • Machine Access List: Übersichtsanzeige aller verfügbaren Maschinen welche Einweisungspflichtig sind, mit Freigabestatus für den aktuellen Kunden (roter Punkt)
  • Customer Sidebar: Kundenspezifische Maschinenfreigaben am POS
  • POS Sidebar: Maschinenauswahl und Statusanzeige
  • Automatische Freigabenvergabe: Beim Verkauf eines Einweisungsprodukts wird dem Kunden automatisch die Freigabe für das zugehörige Gerät in der Datenbank erteilt

Verwendungszweck: Verkauf von Maschineneinweisungen und Anzeige bestehender Freigaben direkt am Kassensystem. Ermöglicht schnelle Prüfung, welcher Kunde auf welche einweisungspflichtigen Geräte zugreifen darf.

Abhängigkeiten:

  • open_workshop_base
  • point_of_sale

open_workshop_pos_customer_display

Mitarbeiter-Display - Zeigt dynamisches Mitarbeiter-Namensschild im POS Customer Display.

Hauptfunktionen:

  • Anzeige von Mitarbeiterfoto (generiert durch open_workshop_employee_imagegenerator)
  • Darstellung von Name und Schwerpunkten (job_focus)
  • Automatische Aktualisierung bei Kassiererwechsel
  • Responsive Design mit Fallback auf Company-Logo

Verwendungszweck: Darstellung der Mitarbeitenden am Kundendisplay, verbessert die Kundeninteraktion und Transparenz.

Abhängigkeiten:

  • point_of_sale
  • hr

open_workshop_dokuwiki

DokuWiki-Integration - Synchronisiert Equipment-Daten aus Odoo mit einem DokuWiki-System.

Hauptfunktionen:

  • Automatische Erstellung von Wiki-Seiten für Equipment
  • Übersichtstabelle aller Equipment (DataTables mit Sortierung/Filterung)
  • Status-Seiten für Include-Plugin (nur von Odoo generiert, read-only)
  • Smart Button "Wiki öffnen" im Equipment-Formular
  • Automatische Synchronisation bei Equipment-Änderungen

Architektur-Prinzip:

  • Odoo generiert NUR odoo-status/ Seiten (maschinengeneriert, read-only)
  • Benutzer erstellen eigene Dokumentation in {bereich}/ Namespaces
  • Einbindung der Odoo-Daten via DokuWiki Include-Plugin

Verwendungszweck: Zentrale Dokumentation aller Geräte mit automatisch aktualisiertem Status aus Odoo, kombiniert mit benutzergenerierten Anleitungen und Wartungshinweisen.

Abhängigkeiten:

  • open_workshop_base
  • maintenance
  • maintenance_equipment_status

🎨 open_workshop_employee_imagegenerator

Mitarbeiterfoto-Generator - Upload und Zuschnitt von Mitarbeiterfotos direkt in Odoo.

Hauptfunktionen:

  • Upload und Zuschnitt von Fotos auf festes Format (369x492 Pixel)
  • Hinzufügen von Schwerpunktbereichen (job_focus)
  • Integrierter Cropper.js für professionelle Bildbearbeitung
  • Fester Crop-Frame (nur Bild bewegt sich, nicht der Rahmen)
  • Integration im Employee-Formular über Button "Namensschild erstellen"

Verwendungszweck: Erstellung von professionellen Mitarbeiterfotos für das POS Customer Display. Vereinfacht den Workflow durch direkten Upload in Odoo ohne externe Bildbearbeitung.

Abhängigkeiten:

  • hr
  • web

Architektur & Datenfluss

Datenmodell-Übersicht

┌─────────────────────────────────────────────────────────────┐
│                    OCA maintenance.equipment                 │
│  (Single Source of Truth für name, serial_no, cost, etc.)   │
└──────────────────────┬──────────────────────────────────────┘
                       │ _inherits (Delegation Pattern)
                       │
                       ▼
              ┌────────────────┐
              │  ows.machine   │ ◄────────┐
              │ (OWS-Features) │          │
              └────┬───────────┘          │
                   │                      │
         ┌─────────┼──────────────────────┤
         │         │                      │
         │         ▼                      │
         │  ┌──────────────────┐         │
         │  │ ows.machine.area │         │
         │  │   (Bereiche)     │         │
         │  └──────────────────┘         │
         │                                │
         ▼                                │
┌──────────────────┐            ┌────────┴─────────┐
│ ows.machine.     │            │ ows.machine.     │
│   product        │            │   training       │
│ (Nutzung)        │            │ (Einweisung)     │
└──────────────────┘            └──────────────────┘

┌──────────────────┐            ┌──────────────────┐
│  res.partner     │            │  ows.user        │
│  (Kunde)         │◄───────────│ (Benutzerdaten)  │
└────────┬─────────┘  1:1       └──────────────────┘
         │
         │ M:N
         │
         ▼
┌──────────────────┐            ┌──────────────────┐
│ ows.machine.     │            │  ows.machine     │
│   access         │───────────►│                  │
│ (Freigaben)      │            │                  │
└──────────────────┘            └──────────────────┘

_inherits Pattern Erklärung

Das Modul nutzt das Odoo _inherits Pattern (Delegation/Prototypische Vererbung) für ows.machine:

Wie es funktioniert:

  • ows.machine delegiert Basis-Felder an maintenance.equipment
  • Beim Erstellen einer ows.machine wird automatisch ein maintenance.equipment erstellt
  • Felder wie name, serial_no, cost, location werden direkt von equipment übernommen
  • Keine Datenduplizierung! Ein Equipment-Datensatz, zwei Modell-Sichten

Vorteile:

  • maintenance.equipment bleibt die Single Source of Truth für Stammdaten
  • Kompatibilität mit allen OCA Maintenance-Modulen
  • ows.machine fügt nur OWS-spezifische Felder hinzu (category, area_id, etc.)
  • Nahtlose Integration in bestehendes Maintenance-System

Beispiel:

class OwsMachine(models.Model):
    _name = 'ows.machine'
    _inherits = {'maintenance.equipment': 'equipment_id'}
    
    equipment_id = fields.Many2one('maintenance.equipment', required=True, ondelete='cascade')
    category = fields.Selection(...)  # OWS-spezifisch
    area_id = fields.Many2one(...)    # OWS-spezifisch

Beim Zugriff auf machine.name wird automatisch machine.equipment_id.name zurückgegeben.


🔄 Modul-Zusammenhänge

Installation & Abhängigkeiten

OCA maintenance ─────┐
OCA maintenance_     │
  equipment_status ──┤
                     ▼
            open_workshop_base ◄──────────┐
                     │                     │
         ┌───────────┼─────────────┐      │
         │           │             │      │
         ▼           ▼             ▼      │
  open_workshop  open_workshop  open_workshop
      _pos       _dokuwiki   _employee_
                              imagegenerator
         │                         │
         ▼                         │
  open_workshop_pos_              │
  customer_display ◄───────────────┘

Installation:

Die OCA Module maintenance und maintenance_equipment_status müssen im addons_path verfügbar sein. Sie werden automatisch mit installiert, wenn open_workshop_base installiert wird (siehe depends in der __manifest__.py).

git clone https://github.com/OCA/maintenance.git
cd maintenance
git reset --hard 5510275e

Installationsreihenfolge:

  1. open_workshop_base (Kernmodul - installiert OCA-Abhängigkeiten automatisch)
  2. Optionale Module je nach Bedarf:
    • open_workshop_pos für POS-Integration
    • open_workshop_dokuwiki für Wiki-Dokumentation
    • open_workshop_employee_imagegenerator für Mitarbeiterfotos
    • open_workshop_pos_customer_display für Customer Display (benötigt imagegenerator)

🛠️ Entwicklungshinweise

Wo finde ich was?

open_workshop_base

  • Models: /models/ows_models.py - Alle Kern-Datenmodelle
  • Views: /views/ - Backend-Ansichten (Form, Tree, Kanban)
    • Erweiterte Views:
      • res.partner (Kontakte): Formular, Listenansicht - Maschinenfreigaben-Tab
      • maintenance.equipment: Formular, Listenansicht, Suchansicht - OWS-Felder
  • Security: /security/ir.model.access.csv - Zugriffsrechte
  • Data: /data/ - Stammdaten (Equipment-Status, Bereiche)

open_workshop_pos

  • JavaScript: /static/src/js/ - POS Frontend-Logik
    • ows_pos_sidebar.js - POS Maschinensidebar
    • ows_pos_customer_sidebar.js - Kundensidebar
    • ows_machine_access_list.js - Zugriffsliste
  • Templates: /static/src/xml/ - OWL Templates für POS UI
  • Models: /models/pos_order.py - POS Order Extensions

open_workshop_dokuwiki

  • Models: /models/
    • dokuwiki_client.py - DokuWiki XML-RPC Client
    • maintenance_equipment.py - Equipment Extensions
  • Views: /views/
    • Erweiterte Views:
      • maintenance.equipment: Smart Button "Wiki öffnen"
      • maintenance.equipment.status: DokuWiki-Synchronisation
  • Wizard: /wizard/ - Synchronisations-Assistenten

open_workshop_employee_imagegenerator

  • JavaScript: /static/src/js/employee_image_widget.js - Cropper Widget
  • Templates: /static/src/xml/employee_image_widget.xml - Widget UI
  • Views: /views/
    • Erweiterte Views:
      • hr.employee: Button "Namensschild erstellen" im Formular
  • CSS: /static/src/css/ - Badge-Styling
  • Library: /static/lib/cropperjs/ - Cropper.js Integration

open_workshop_pos_customer_display

  • JavaScript: /static/src/js/customer_display.js - Display-Logik
  • CSS: /static/src/css/employee_badge.css - Badge-Styling

Wichtige Methoden & RPC Calls

open_workshop_base

  • ows.machine.get_access_list_grouped(partner_id) - Gruppierte Zugriffsliste für POS
    • Liefert alle Bereiche mit Maschinen und Zugriffssstatus für einen Partner
    • Wird vom POS Frontend verwendet

res.partner Extensions

  • machine_access_ids - One2many zu allen Freigaben
  • machine_access_html - Computed HTML-Tabelle für Backend-Ansicht im Res.partner / Kontakt Formular
  • ows_user_id - One2many zu ows.user (Benutzerdaten)

Erweiterung des Systems

Neue Sicherheitskategorie hinzufügen:

  1. In ows_models.pyOwsMachine.category Selection erweitern
  2. Icon-Mapping in _compute_category_icon() aktualisieren
  3. CSS in /static/src/css/category_color.css ergänzen

Neuen Maschinenbereich erstellen:

  • Im Backend: Wartung → Konfiguration → Bereiche
  • Oder via Data-File in /data/ für Standardbereiche

POS-UI anpassen:

  • OWL Templates in /static/src/xml/ bearbeiten
  • JavaScript-Komponenten in /static/src/js/ erweitern
  • CSS in /static/src/css/ anpassen

📝 Technische Details

Backend-Konfiguration

Sicherheitskategorien zuweisen:

  • Menü: Wartung → Ausrüstung → [Equipment auswählen]
  • Im Formular: Feld "Sicherheitskategorie" (🟢/🟡/🔴)
  • Die Kategorie ist direkt am ows.machine / maintenance.equipment gespeichert

Einweisungsprodukte zuweisen:

  • Menü: Wartung → Ausrüstung → [Equipment auswählen]
  • Im Formular: Tab "Einweisungsprodukte"
  • Button "Hinzufügen" → Produkt aus product.product auswählen
  • Speichert Verknüpfung in ows.machine.training (Many2many über One2many)
  • Beim Verkauf dieses Produkts am POS wird automatisch die Freigabe erteilt

Nutzungsprodukte zuweisen:

  • Gleicher Weg wie Einweisungsprodukte
  • Tab "Nutzungsprodukte" im Equipment-Formular
  • Speichert Verknüpfung in ows.machine.product
  • Diese Produkte können für Nutzungsgebühren verwendet werden

Maschinenfreigaben manuell vergeben:

  • Menü: Kontakte → [Partner auswählen]
  • Tab "Maschinenfreigaben" (von open_workshop_base hinzugefügt)
  • Übersicht aller Bereiche und Maschinen mit aktuellem Freigabestatus
  • Freigaben werden jedoch hauptsächlich automatisch über POS-Verkäufe vergeben

Konfiguration:

  • Bereiche: Wartung → Konfiguration → Bereiche
  • Produkt-Zuordnungen: Wartung → Konfiguration → Zuordnungen
    • Nutzungsprodukte (Übersicht aller Zuordnungen)
    • Einweisungsprodukte (Übersicht aller Zuordnungen)

Sicherheitskategorien

  • 🟢 Grün (Kategorie 1): Keine Einweisungspflicht, freier Zugang
  • 🟡 Gelb (Kategorie 2): Empfohlene Einweisung, optionale Freigabe
  • 🔴 Rot (Kategorie 3): Einweisung zwingend erforderlich, POS zeigt nur rote Maschinen

Freigabenverwaltung

Freigaben werden in ows.machine.access gespeichert mit:

  • Partner (Kunde)
  • Maschine
  • Datum der Freigabe
  • Optional: Ablaufdatum
  • Herkunft (granted_by_pos)

DokuWiki Namespace-Struktur

{equipment_namespace}:
├── overview              # Übersichtstabelle (von Odoo)
└── odoo-status/          # Maschinengeneriert (read-only)
    ├── maschine_1        # Status-Seite für Include
    ├── maschine_2
    └── c_template        # Template für Status-Seiten

{bereich}:                # Benutzer-Namespaces
├── holz/
│   ├── maschine_1       # Benutzer-Dokumentation
│   └── maschine_2       # (inkludiert odoo-status via {{page>}})
└── metall/
    └── ...

📄 Lizenz

AGPL-3 (open_workshop_base)
LGPL-3 (weitere Module)


👤 Autor

Matthias Lotz / Hobbyhimmel


🔗 Verwandte Projekte