15:00
Karte 1 ⏱ 2 Minuten

Disposition Management Modul

für Odoo 18 ERP-System

IHK Abschlussprüfung · Fachinformatiker Anwendungsentwicklung

🎯 Projektziel

Problem: Keine integrierte Lösung für Fahrzeugbeladung und Tourenplanung in Odoo
Lösung: LKW und Anhänger als "mobile Lager" mit vollständiger Bestandsverwaltung
Kernfunktion: Drag & Drop Beladungsplanung mit Echtzeit-Kapazitätsüberwachung
🚛
Mobile Warehouses
Fahrzeuge als Lagerorte
📋
Kanban-Board
Visuelle Beladung
⚖️
Kapazitätsprüfung
Gewicht & Volumen
🔗
Truck-Trailer
Kombinationen
Karte 2 ⏱ 2 Minuten

Systemarchitektur

ODOO 18 Core
Fleet
Fahrzeuge
Stock
Lager
Sales
Verkauf
Picking
Lieferung
DISPOSITION MANAGEMENT MODUL
disposition.order fleet.vehicle (erweitert) stock.picking (erweitert) stock.location (erweitert)

💡 API-Übergabepunkte (ORM)

# Model Inheritance
_inherit = 'fleet.vehicle'

# Computed Fields → Automatische Neuberechnung
@api.depends('assigned_picking_ids')

# Domain Filter → Dynamische Filterung
domain="[('is_mobile_warehouse', '=', True)]"
Karte 3 ⏱ 3 Minuten

Live-Demo: Fahrzeugübersicht

📍 Navigation: Disposition → Fahrzeug Beladung

Offene Lieferungen
📦 Lieferung #1234
📦 Lieferung #1235
📦 Lieferung #1236
LKW-01
45% beladen
📦 Lieferung #1230
LKW-02
82% beladen
📦 Lieferung #1231
📦 Lieferung #1232

⚙️ XML View Definition

<kanban default_group_by="vehicle_id" 
        class="o_vehicle_loading_kanban"
        js_class="vehicle_loading_kanban">
    <progressbar field="vehicle_loading_status" 
                 colors="{ok: success, warning: warning, overloaded: danger}"/>
</kanban>
default_group_by Gruppierung nach Fahrzeug js_class Eigener JavaScript-Controller progressbar Farbcodierte Auslastung
Karte 4 ⏱ 3 Minuten

Live-Demo: Drag & Drop Beladung

📦 Lieferung
🚛 Fahrzeug

👀 Visuelle Reaktion

1 Karte wird verschoben
2 Progressbar aktualisiert sich
3 >80%: Gelber Header (Warnung)
4 Überladung: Roter Header + Pulsieren

⚙️ JavaScript Controller

export class VehicleLoadingKanbanRenderer extends KanbanRenderer {
    // Lädt Fahrzeugdaten nach jeder Änderung
    onWillUpdateProps(async () => {
        await this.loadVehicleData();
    });
    
    // CSS-Klassen basierend auf Auslastung
    getGroupClasses(group) {
        if (vehicle.is_overloaded) return "o_vehicle_overloaded";
        if (vehicle.weight_utilization > 80) return "o_vehicle_warning";
    }
}

🔌 API-Übergabepunkt

Browser Event OWL Framework ORM write() Python Model @api.depends
Karte 5 ⏱ 3 Minuten

Live-Demo: Kapazitätsberechnung

Maximale Kapazität
24.000 kg
Aktuelle Ladung
18.500 kg
Verbleibend
5.500 kg
Auslastung
77%

⚙️ Python Model - Computed Fields

@api.depends('assigned_picking_ids.shipping_weight', 
             'assigned_picking_ids.shipping_volume')
def _compute_picking_stats(self):
    for vehicle in self:
        # Summe aller zugewiesenen Pickings
        total_weight = sum(p.shipping_weight for p in vehicle.assigned_picking_ids)
        
        # Berechnung Restkapazität
        vehicle.remaining_weight_capacity = vehicle.effective_max_weight_capacity - total_weight
        
        # Überladung prüfen
        vehicle.is_overloaded = vehicle.remaining_weight_capacity < 0
stock.picking.write({'vehicle_id': X}) @api.depends erkennt Änderung _compute_picking_stats() ausgeführt Alle computed fields aktualisiert → DB Write
Karte 6 ⏱ 2 Minuten

Live-Demo: Überladwarnung

🚨 LKW-03 - ÜBERLADEN
112% beladen!
📦 #1240
📦 #1241
📦 #1242
📦 #1243
1 Spaltenheader wird ROT
2 Pulsierender Schatten (CSS Animation)
3 Progressbar auf 100%+ in Rot

⚙️ CSS Styling

/* Roter Header bei Überladung */
.o_vehicle_overloaded .o_kanban_header {
    background-color: #dc3545 !important;
}

/* Pulsier-Animation als Warnung */
.o_vehicle_overloaded {
    animation: pulse-danger 2s infinite;
}

@keyframes pulse-danger {
    0%, 100% { box-shadow: 0 0 0 0 rgba(220,53,69,0.4); }
    50% { box-shadow: 0 0 0 10px rgba(220,53,69,0); }
}
💡 Warum diese Lösung? Sofort sichtbar ohne Klick · Farbpsychologie: Rot = Gefahr · Animation zieht Aufmerksamkeit
Karte 7 ⏱ 2 Minuten

Live-Demo: Truck-Trailer Kombination

🚛
LKW-01
Max: 24.000 kg
🚃
Anhänger-A1
Max: 18.000 kg
=
Kombinierte Kapazität: 42.000 kg
Anhänger verschwindet aus Kanban (ist Teil des LKW)

⚙️ Python Model - Effektive Kapazität

# Effektive Kapazität = Eigene + Anhänger
effective_max_weight_capacity = fields.Float(
    compute='_compute_effective_capacity'
)

@api.depends('attached_trailer_id', 'max_weight_capacity')
def _compute_effective_capacity(self):
    for vehicle in self:
        base = vehicle.max_weight_capacity
        trailer_cap = vehicle.attached_trailer_id.max_weight_capacity or 0
        vehicle.effective_max_weight_capacity = base + trailer_cap
Karte 8 ⏱ 3 Minuten

Live-Demo: Dispositionsauftrag

Entwurf
Bestätigt
In Bearbeitung
Erledigt
Fahrzeug: LKW-01 + Anhänger-A1
Fahrer: Max Mustermann
Stopps:
✓ Kunde A - München
⏳ Kunde B - Stuttgart
○ Kunde C - Karlsruhe

⚙️ XML View - Statusbar & Decoration

<header>
    <button name="action_confirm" string="Bestätigen" 
            invisible="state != 'draft'"/>
    <field name="state" widget="statusbar" 
           statusbar_visible="draft,confirmed,in_progress,done"/>
</header>

<!-- Zeilen mit visueller Dekoration -->
<list decoration-success="stop_status == 'done'" 
      decoration-warning="stop_status == 'in_progress'">
Karte 9 ⏱ 2 Minuten

Technische Zusammenfassung

Schicht Technologie Zweck
Frontend OWL Framework Reaktive UI-Komponenten
Styling CSS3 + SCSS Animationen, Farbcodes
JavaScript ES6 Modules Kanban-Erweiterung
Backend Python 3.10+ Business Logic
ORM Odoo ORM Datenbank-Abstraktion
Views XML Deklarative UI-Definition

🔄 Datenfluss

1. User Action (Klick/Drag)
2. JavaScript Event Handler
3. ORM RPC Call (JSON-RPC)
4. Python Model + @api.depends
5. Database (PostgreSQL) → UI Update
Karte 10 ⏱ 2 Minuten

Qualitätssicherung

✅ Getestete Szenarien

  • Drag & Drop mit verschiedenen Gewichten
  • Überladung erkennen und anzeigen
  • Truck-Trailer Kopplung/Entkopplung
  • Dispositionsauftrag Workflow

🐛 Herausforderungen & Lösungen

Kanban-Refresh: Nach D&D muss JS die Daten neu laden
→ Lösung: onWillUpdateProps Hook
CSS Specificity: Odoo-Styles überschreiben
→ Lösung: !important und spezifische Selektoren

📈 Mögliche Erweiterungen

📍 GPS-Integration
🗺️ Routenoptimierung
📱 Mobile App
Karte 11 ⏱ 1 Minute

Fazit & Abschluss

🎯

Das Disposition Management Modul ermöglicht eine intuitive, visuelle Beladungsplanung mit automatischer Kapazitätsüberwachung.

💡 Lessons Learned

OWL Framework für reaktive UIs
Wichtigkeit von visuellen Feedback-Mechanismen
Odoo's deklarativer Ansatz (XML Views)

Vielen Dank für Ihre Aufmerksamkeit!

❓ Ich stehe für Ihre Fragen zur Verfügung.

Steuerung: ← → Pfeiltasten · Space = Nächste · F = Vollbild · T = Timer · Home/End = Erste/Letzte