feat: Improve equipment creation flow and UX

- Made location field readonly in maintenance.equipment view
- Hide equipment_id field in machine form (auto-created)
- Name and serial_no now directly editable in machine form
- Area is now required field
- Location automatically synced from area to equipment
- Equipment auto-created on machine save with all fields
- Renamed menu from 'Maschinen' to 'Ausrüstung'
- Improved user flow: No need to switch between views

Changes:
- Added maintenance_equipment_views.xml for readonly location
- Updated create() to always auto-create equipment
- Enhanced write() to sync name/serial_no changes to equipment
- Menu labels updated to 'Ausrüstung'
This commit is contained in:
Matthias Lotz 2025-12-07 21:33:06 +01:00
parent f87755e7d0
commit 42db76a9c7
5 changed files with 53 additions and 25 deletions

View File

@ -12,7 +12,8 @@
'views/machine_product_training_views.xml',
'views/menu_views.xml',
'views/machine_area_views.xml',
'views/machine_views.xml',
'views/machine_views.xml',
'views/maintenance_equipment_views.xml',
'views/res_partner_view.xml',
'data/data.xml',
],

View File

@ -467,7 +467,7 @@ class OwsMachine(models.Model):
# - serial_no → wird als 'code' verwendet (siehe @api.depends unten)
# - cost → purchase_price
# - effective_date → purchase_date
# - location → storage_location
# - location → storage_location (wird von area_id synchronisiert, readonly via View)
# - note → description
# - category_id → Wird mit area_id synchronisiert
@ -517,35 +517,49 @@ class OwsMachine(models.Model):
def create(self, vals):
"""
Beim Erstellen einer ows.machine:
1. Equipment erstellen FALLS nicht vorhanden
1. Equipment IMMER automatisch erstellen
2. Area Location synchronisieren
3. serial_no und name vom User übernehmen
"""
# Nur Equipment erstellen, wenn keins ausgewählt wurde
if 'equipment_id' not in vals or not vals['equipment_id']:
equipment_vals = {
'name': vals.get('name', 'Neue Maschine'),
}
equipment = self.env['maintenance.equipment'].create(equipment_vals)
vals['equipment_id'] = equipment.id
# Equipment IMMER automatisch erstellen
equipment_vals = {
'name': vals.get('name', 'Neue Maschine'),
'serial_no': vals.get('serial_no', False),
}
# Area → Location Mapping
# 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:
# Setze location direkt auf area.name
vals['location'] = area.name
equipment_vals['location'] = area.name
equipment = self.env['maintenance.equipment'].create(equipment_vals)
vals['equipment_id'] = equipment.id
return super(OwsMachine, self).create(vals)
def write(self, vals):
"""
Bei Updates Area Location synchronisieren
Bei Updates:
1. Area Location synchronisieren
2. 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:
equipment_vals['name'] = vals['name']
if 'serial_no' in vals:
equipment_vals['serial_no'] = vals['serial_no']
if equipment_vals and self.equipment_id:
self.equipment_id.write(equipment_vals)
return super(OwsMachine, self).write(vals)
def name_get(self):

View File

@ -35,18 +35,16 @@
</button>
</div>
<group>
<group string="Open Workshop" name="ows_group">
<field name="equipment_id"
options="{'no_create': False, 'no_open': False}"
context="{'default_name': name}"
string="Equipment"/>
<field name="name" invisible="1"/>
<group string="Maschine" name="ows_group">
<field name="equipment_id" invisible="1"/>
<field name="name" placeholder="z.B. Sabako Laser"/>
<field name="serial_no" string="Code/Seriennummer" placeholder="z.B. sabako_laser"/>
<field name="category_icon" string="⚙" readonly="1"/>
<field name="category"/>
<field name="area_id"/>
<field name="area_id" required="1"/>
</group>
<group name="info_group">
<field name="serial_no" readonly="1" string="Code (von Equipment)"/>
<field name="location" readonly="1" string="Standort (von Bereich)"/>
<field name="active"/>
</group>
</group>

View File

@ -0,0 +1,15 @@
<?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>
<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>
</xpath>
</field>
</record>
</odoo>

View File

@ -2,7 +2,7 @@
<odoo>
<!-- Maschinenliste -->
<record id="action_machine_list" model="ir.actions.act_window">
<field name="name">Maschinen</field>
<field name="name">Ausrüstung</field>
<field name="res_model">ows.machine</field>
<field name="view_mode">list,form</field>
</record>
@ -17,7 +17,7 @@
<!-- Menüstruktur -->
<!-- Oberstes Menü -->
<menuitem id="menu_machine_root"
name="Maschinen"
name="Ausrüstung"
sequence="10"/>
<!-- Konfigurationsebene -->
@ -28,7 +28,7 @@
<!-- Menüpunkt: Maschinenliste (klickbar) -->
<menuitem id="menu_machine_list_action"
name="Alle Maschinen"
name="Alle Ausrüstung"
parent="menu_machine_config"
action="open_workshop_base.action_machine_list"
sequence="10"/>