feat(equipment-view): Integrate OWS into Maintenance menu with Equipment-centric views

- Extended maintenance.equipment model with Related fields to ows.machine
  - ows_machine_id: One2many inverse relation
  - ows_category: Related to machine category (editable, stored)
  - ows_area_id: Related to machine area (editable, stored)
  - ows_product_ids: Related One2many for usage products
  - ows_training_ids: Related One2many for training products

- Equipment Form View Extensions:
  - Added ows_area_id and ows_category after location field
  - New 'Offene Werkstatt (Hobbyhimmel)' notebook page with:
    - Security section (category icon, category, area)
    - Usage products section (Nutzungsprodukte)
    - Training products section (Einweisungsprodukte)
  - Page visibility controlled by ows_machine_id existence

- Equipment List/Search View Extensions:
  - Added ows_category_icon and ows_area_id columns
  - Added OWS search fields (area, category)
  - Added category filters (green/yellow/red)
  - Added OWS grouping options (by area, by category)

- Menu Structure Migration:
  - Removed standalone 'Ausrüstung' top-level menu
  - Integrated all OWS config into Maintenance → Configuration:
    - Bereiche (Areas)
    - Zuordnungen (Assignments) container
      - Nutzungsprodukte (Usage Products)
      - Einweisungsprodukte (Training Products)

- Created simplified tree views for Equipment context:
  - view_ows_machine_product_tree_simple (no machine_id column)
  - view_ows_machine_training_tree_simple (no machine_id column)

- Freed location field from automatic area synchronization:
  - Removed area → location mapping in create()/write()
  - location now available for detailed physical location info
  - ows_area_id provides workspace area assignment

BREAKING CHANGE: Standalone OWS menu removed, all features now in Maintenance app
UX IMPROVEMENT: Single Equipment view shows all data, no split views needed
This commit is contained in:
Matthias Lotz 2025-12-13 17:43:07 +01:00
parent ed339b0e2e
commit 1b203eeb10
5 changed files with 167 additions and 57 deletions

View File

@ -400,6 +400,51 @@ AVAILABLE_COLORS = [
('#ffffff', 'Weiss'),
]
class OwsMachineArea(models.Model):
_name = 'ows.machine.area'
_table = 'ows_machine_area'
_description = 'OWS: Maschinenbereich'
class MaintenanceEquipment(models.Model):
"""Erweitere maintenance.equipment mit OWS-Feldern für direkte Bearbeitung"""
_inherit = 'maintenance.equipment'
# Inverse Relation zu ows.machine
ows_machine_id = fields.One2many('ows.machine', 'equipment_id', string='OWS Maschine', readonly=True)
# OWS-Felder direkt auf Equipment (via related für einfache Bearbeitung)
ows_category = fields.Selection(
related='ows_machine_id.category',
string='Sicherheitskategorie',
readonly=False,
store=True
)
ows_category_icon = fields.Char(
related='ows_machine_id.category_icon',
string=''
)
ows_area_id = fields.Many2one(
'ows.machine.area',
related='ows_machine_id.area_id',
string='Bereich',
readonly=False,
store=True
)
ows_product_ids = fields.One2many(
'ows.machine.product',
related='ows_machine_id.product_ids',
string='Nutzungsprodukte',
readonly=False
)
ows_training_ids = fields.One2many(
'ows.machine.training',
related='ows_machine_id.training_ids',
string='Einweisungsprodukte',
readonly=False
)
class OwsMachineArea(models.Model):
_name = 'ows.machine.area'
_table = 'ows_machine_area'
@ -527,12 +572,6 @@ class OwsMachine(models.Model):
'serial_no': vals.get('serial_no', False),
}
# Area → Location Mapping für Equipment
if 'area_id' in vals and vals['area_id']:
area = self.env['ows.machine.area'].browse(vals['area_id'])
if area and area.name:
equipment_vals['location'] = area.name
equipment = self.env['maintenance.equipment'].create(equipment_vals)
vals['equipment_id'] = equipment.id
@ -541,15 +580,8 @@ class OwsMachine(models.Model):
def write(self, vals):
"""
Bei Updates:
1. Area Location synchronisieren
2. Name/Serial_no Equipment synchronisieren
1. Name/Serial_no Equipment synchronisieren
"""
# Area → Location Mapping
if 'area_id' in vals and vals['area_id']:
area = self.env['ows.machine.area'].browse(vals['area_id'])
if area and area.name:
vals['location'] = area.name
# Name/Serial_no an Equipment weiterleiten
equipment_vals = {}
if 'name' in vals:

View File

@ -7,9 +7,6 @@
<field name="view_mode">list,form</field>
</record>
<!-- Menüpunkt unter Maschinen > Konfiguration -->
<menuitem id="menu_machine_area" name="Bereiche" parent="menu_machine_config" action="open_workshop_base.action_machine_area_list" sequence="30"/>
<!-- Listenansicht -->
<record id="view_machine_area_tree" model="ir.ui.view">
<field name="name">ows.machine.area.tree</field>

View File

@ -1,5 +1,5 @@
<odoo>
<!-- Tree View: Nutzungsprodukte -->
<!-- Tree View: Nutzungsprodukte (normale Ansicht) -->
<record id="view_machine_product_tree" model="ir.ui.view">
<field name="name">ows.machine.product.tree</field>
<field name="model">ows.machine.product</field>
@ -10,8 +10,19 @@
</list>
</field>
</record>
<!-- Tree View: Nutzungsprodukte (vereinfacht für Equipment) -->
<record id="view_ows_machine_product_tree_simple" model="ir.ui.view">
<field name="name">ows.machine.product.tree.simple</field>
<field name="model">ows.machine.product</field>
<field name="arch" type="xml">
<list editable="bottom">
<field name="product_id" domain="[('categ_id.name', '=', 'Maschinennutzung')]"/>
</list>
</field>
</record>
<!-- Tree View: Einweisungsprodukte -->
<!-- Tree View: Einweisungsprodukte (normale Ansicht) -->
<record id="view_machine_training_tree" model="ir.ui.view">
<field name="name">ows.machine.training.tree</field>
<field name="model">ows.machine.training</field>
@ -22,6 +33,17 @@
</list>
</field>
</record>
<!-- Tree View: Einweisungsprodukte (vereinfacht für Equipment) -->
<record id="view_ows_machine_training_tree_simple" model="ir.ui.view">
<field name="name">ows.machine.training.tree.simple</field>
<field name="model">ows.machine.training</field>
<field name="arch" type="xml">
<list editable="bottom">
<field name="training_id" domain="[('categ_id.name', 'in', ['Einweisungen', 'Kurse'])]"/>
</list>
</field>
</record>
<!-- Action: Nutzungsprodukte -->
<record id="action_machine_product" model="ir.actions.act_window">

View File

@ -1,15 +1,80 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Inherit maintenance.equipment form view to make location readonly -->
<record id="view_equipment_form_location_readonly" model="ir.ui.view">
<field name="name">maintenance.equipment.form.location.readonly</field>
<!-- Erweitere Equipment Form mit OWS-Feldern -->
<record id="view_equipment_form_ows_extension" model="ir.ui.view">
<field name="name">maintenance.equipment.form.ows</field>
<field name="model">maintenance.equipment</field>
<field name="inherit_id" ref="maintenance.hr_equipment_view_form"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='location']" position="attributes">
<attribute name="readonly">1</attribute>
<attribute name="help">Wird automatisch aus dem Bereich (ows.machine) synchronisiert. Änderungen nur über Bereich möglich.</attribute>
<!-- Füge OWS-Felder in die Details-Gruppe ein -->
<xpath expr="//field[@name='location']" position="after">
<field name="ows_area_id" string="Bereich"/>
<field name="ows_category" string="Sicherheitskategorie"/>
</xpath>
<!-- Füge Open Workshop Notebook-Page hinzu -->
<xpath expr="//notebook" position="inside">
<page string="Offene Werkstatt (Hobbyhimmel)" name="open_workshop" invisible="not ows_machine_id">
<group>
<group string="Sicherheit">
<field name="ows_machine_id" invisible="1"/>
<field name="ows_category_icon" readonly="1"/>
<field name="ows_category"/>
<field name="ows_area_id"/>
</group>
</group>
<group string="Nutzungsprodukte">
<field name="ows_product_ids" nolabel="1" context="{'tree_view_ref': 'open_workshop_base.view_ows_machine_product_tree_simple'}"/>
</group>
<group string="Einweisungsprodukte">
<field name="ows_training_ids" nolabel="1" context="{'tree_view_ref': 'open_workshop_base.view_ows_machine_training_tree_simple'}"/>
</group>
</page>
</xpath>
</field>
</record>
<!-- Erweitere Equipment List-View mit OWS-Spalten -->
<record id="view_equipment_tree_ows_extension" model="ir.ui.view">
<field name="name">maintenance.equipment.tree.ows</field>
<field name="model">maintenance.equipment</field>
<field name="inherit_id" ref="maintenance.hr_equipment_view_tree"/>
<field name="arch" type="xml">
<xpath expr="//field[@name='name']" position="after">
<field name="ows_category_icon" string="⚙" optional="show"/>
<field name="ows_area_id" optional="show"/>
</xpath>
</field>
</record>
<!-- Erweitere Equipment Search-View mit OWS-Filtern -->
<record id="view_equipment_search_ows_extension" model="ir.ui.view">
<field name="name">maintenance.equipment.search.ows</field>
<field name="model">maintenance.equipment</field>
<field name="inherit_id" ref="maintenance.hr_equipment_view_search"/>
<field name="arch" type="xml">
<!-- Füge OWS-Felder zur Suche hinzu -->
<xpath expr="//field[@name='name']" position="after">
<field name="ows_area_id" string="Bereich"/>
<field name="ows_category" string="Kategorie"/>
</xpath>
<!-- Füge OWS-Filter hinzu -->
<xpath expr="//filter[@name='inactive']" position="after">
<separator/>
<filter string="Kategorie 1 (grün)" name="filter_green" domain="[('ows_category', '=', 'green')]"/>
<filter string="Kategorie 2 (gelb)" name="filter_yellow" domain="[('ows_category', '=', 'yellow')]"/>
<filter string="Kategorie 3 (rot)" name="filter_red" domain="[('ows_category', '=', 'red')]"/>
</xpath>
<!-- Füge OWS-Gruppierungen hinzu (erstelle group wenn nicht vorhanden) -->
<xpath expr="//search" position="inside">
<group expand="0" string="Gruppieren nach">
<filter string="Bereich" name="group_by_area" context="{'group_by': 'ows_area_id'}"/>
<filter string="Kategorie" name="group_by_category" context="{'group_by': 'ows_category'}"/>
</group>
</xpath>
</field>
</record>
</odoo>

View File

@ -1,11 +1,15 @@
<!-- menu_views.xml -->
<odoo>
<!-- Maschinenliste -->
<record id="action_machine_list" model="ir.actions.act_window">
<!-- Equipment-Liste mit OWS-Filter (ersetzt Standard Equipment Action) -->
<record id="action_equipment_ows" model="ir.actions.act_window">
<field name="name">Ausrüstung</field>
<field name="res_model">ows.machine</field>
<field name="res_model">maintenance.equipment</field>
<field name="view_mode">list,form</field>
<field name="context">{'search_default_group_area': 1, 'group_expand': True}</field>
<field name="domain">[('ows_machine_id', '!=', False)]</field>
<field name="context">{
'default_ows_category': 'red',
'search_default_group_by_area': 1
}</field>
</record>
<!-- Trainingsprodukt-Liste -->
@ -15,42 +19,32 @@
<field name="view_mode">list,form</field>
</record>
<!-- Menüstruktur -->
<!-- Oberstes Menü -->
<menuitem id="menu_machine_root"
name="Ausrüstung"
sequence="10"/>
<!-- Integration in Maintenance Menü -->
<!-- Bereiche unter Maintenance → Configuration -->
<menuitem id="menu_maintenance_ows_areas"
name="Bereiche"
parent="maintenance.menu_maintenance_config"
action="open_workshop_base.action_machine_area_list"
sequence="50"/>
<!-- Konfigurationsebene -->
<menuitem id="menu_machine_config"
name="Konfiguration"
parent="menu_machine_root"
sequence="10"/>
<!-- Menüpunkt: Maschinenliste (klickbar) -->
<menuitem id="menu_machine_list_action"
name="Alle Ausrüstung"
parent="menu_machine_config"
action="open_workshop_base.action_machine_list"
sequence="10"/>
<!-- Menücontainer: Zuordnungen -->
<menuitem id="menu_machine_list"
<!-- Zuordnungen Container unter Maintenance → Configuration -->
<menuitem id="menu_maintenance_ows_assignments"
name="Zuordnungen"
parent="menu_machine_config"
sequence="20"/>
parent="maintenance.menu_maintenance_config"
sequence="51"/>
<!-- Untermenü: Nutzungsprodukte -->
<menuitem id="menu_machine_product"
<!-- Nutzungsprodukte unter Zuordnungen -->
<menuitem id="menu_maintenance_machine_product"
name="Nutzungsprodukte"
parent="menu_machine_list"
parent="menu_maintenance_ows_assignments"
action="action_machine_product"
sequence="10"/>
<!-- Untermenü: Einweisungsprodukte -->
<menuitem id="menu_machine_training"
<!-- Einweisungsprodukte unter Zuordnungen -->
<menuitem id="menu_maintenance_machine_training"
name="Einweisungsprodukte"
parent="menu_machine_list"
parent="menu_maintenance_ows_assignments"
action="action_machine_training"
sequence="20"/>