intial version of open workshop v13.0

This commit is contained in:
MaPaLo76 2025-03-29 17:28:05 +01:00
parent d120089c0b
commit 9ae8b095da
17 changed files with 430 additions and 221 deletions

View File

@ -1,28 +1,20 @@
{ {
'name': 'Open Workshop', 'name': 'POS Open Workshop',
'version': '1.0', 'license': 'AGPL-3',
'author': 'Dein Name / Deine Organisation', 'version': '13.0.1.0.0',
'category': 'Custom', 'summary': 'Erstellt Maschinenfreigaben basierend auf POS-Einweisungsprodukten',
'summary': 'Verwaltung von Maschinen & Einweisungen in einer offenen Werkstatt', 'depends': ['point_of_sale'],
'description': """ 'author': 'matthias.lotz',
Dieses Modul fügt zwei neue Modelle hinzu: 'category': 'Point of Sale',
- Maschinen (mit Metadaten)
- Maschineneinweisungen (Verknüpfung zwischen Partner und Maschine)
Außerdem wird das Partnerformular erweitert, damit man direkt sieht,
für welche Maschinen ein Partner bereits eingewiesen ist.
""",
'depends': [
'base',
'point_of_sale',
],
'data': [ 'data': [
'security/ir.model.access.csv', 'security/ir.model.access.csv',
'views/open_workshop_machine_views.xml', 'views/machine_area_views.xml',
'views/open_workshop_training_views.xml', 'views/machine_views.xml', # <--- diese Zeile hinzufügen
'views/res_partner_views.xml', 'views/res_partner_view.xml',
'views/menu_views.xml',
],
'demo': [
'demo/demo_data.xml', # <--- DEMO-DATEN HINZUGEFÜGT
], ],
'installable': True, 'installable': True,
'application': True,
} }

154
data/demo_data.xml Normal file
View File

@ -0,0 +1,154 @@
<odoo noupdate="1">
<!-- Bereiche -->
<record id="area_fablab" model="ows.machine.area">
<field name="name">Fablab</field>
<field name="color">3</field>
</record>
<record id="area_holz" model="ows.machine.area">
<field name="name">Holzbereich</field>
<field name="color">1</field>
</record>
<record id="area_metall" model="ows.machine.area">
<field name="name">Metallbereich</field>
<field name="color">2</field>
</record>
<record id="area_elektronik" model="ows.machine.area">
<field name="name">Elektronikbereich</field>
<field name="color">4</field>
</record>
<!-- Maschinen im Fablab -->
<record id="machine_sabako_laser" model="ows.machine">
<field name="name">Sabako Laser</field>
<field name="code">sabako_laser</field>
<field name="area_id" ref="area_fablab"/>
</record>
<record id="machine_prusa" model="ows.machine">
<field name="name">Prusa</field>
<field name="code">prusa</field>
<field name="area_id" ref="area_fablab"/>
</record>
<record id="machine_prusa_mmu" model="ows.machine">
<field name="name">Prusa MMU</field>
<field name="code">prusa_mmu</field>
<field name="area_id" ref="area_fablab"/>
</record>
<record id="machine_3d_delta" model="ows.machine">
<field name="name">3D Delta</field>
<field name="code">3d_delta</field>
<field name="area_id" ref="area_fablab"/>
</record>
<record id="machine_cnc_beamicon" model="ows.machine">
<field name="name">CNC Beamicon</field>
<field name="code">cnc_beamicon</field>
<field name="area_id" ref="area_fablab"/>
</record>
<!-- Maschinen im Holzbereich -->
<record id="machine_formatkreissaege" model="ows.machine">
<field name="name">Formatkreissäge</field>
<field name="code">formatkreissaege</field>
<field name="area_id" ref="area_holz"/>
</record>
<record id="machine_bandsaege_holz" model="ows.machine">
<field name="name">Bandsäge</field>
<field name="code">bandsaege_holz</field>
<field name="area_id" ref="area_holz"/>
</record>
<record id="machine_abrichte" model="ows.machine">
<field name="name">Abricht Dickenhobel</field>
<field name="code">dickenhobel</field>
<field name="area_id" ref="area_holz"/>
</record>
<record id="machine_drechselbank" model="ows.machine">
<field name="name">Drechselbank</field>
<field name="code">drechselbank</field>
<field name="area_id" ref="area_holz"/>
</record>
<record id="machine_festool_domino" model="ows.machine">
<field name="name">Festool Domino Fräse</field>
<field name="code">festool_domino</field>
<field name="area_id" ref="area_holz"/>
</record>
<record id="machine_maffel_duo" model="ows.machine">
<field name="name">Maffel Duo Dübler</field>
<field name="code">maffel_duo</field>
<field name="area_id" ref="area_holz"/>
</record>
<record id="machine_lamello" model="ows.machine">
<field name="name">Lamello Zeta P2</field>
<field name="code">lamello_zeta_p2</field>
<field name="area_id" ref="area_holz"/>
</record>
<!-- Maschinen im Metallbereich -->
<record id="machine_kreissaege_metall" model="ows.machine">
<field name="name">Kreissäge</field>
<field name="code">kreissaege_metall</field>
<field name="area_id" ref="area_metall"/>
</record>
<record id="machine_bandsaege_metall" model="ows.machine">
<field name="name">Bandsäge</field>
<field name="code">bandsaege_metall</field>
<field name="area_id" ref="area_metall"/>
</record>
<record id="machine_mig_mag" model="ows.machine">
<field name="name">MIG/MAG Schweißgeräte</field>
<field name="code">mig_mag</field>
<field name="area_id" ref="area_metall"/>
</record>
<record id="machine_wig" model="ows.machine">
<field name="name">WIG Schweißgerät</field>
<field name="code">wig</field>
<field name="area_id" ref="area_metall"/>
</record>
<record id="machine_schweissen" model="ows.machine">
<field name="name">Schweißen allgemein</field>
<field name="code">schweissen_allgemein</field>
<field name="area_id" ref="area_metall"/>
</record>
<record id="machine_drehbank" model="ows.machine">
<field name="name">Drehbank</field>
<field name="code">drehbank</field>
<field name="area_id" ref="area_metall"/>
</record>
<record id="machine_fraese" model="ows.machine">
<field name="name">Fräse</field>
<field name="code">fraese</field>
<field name="area_id" ref="area_metall"/>
</record>
<record id="machine_abkantbank" model="ows.machine">
<field name="name">Abkantbank</field>
<field name="code">abkantbank</field>
<field name="area_id" ref="area_metall"/>
</record>
<!-- Maschine im Elektronikbereich -->
<record id="machine_loetkolben" model="ows.machine">
<field name="name">Lötkolben</field>
<field name="code">loetkolben</field>
<field name="area_id" ref="area_elektronik"/>
</record>
</odoo>

View File

@ -1,9 +0,0 @@
Name,Maschinen-Code,Standort,Active,Beschreibung
Standbohrmaschine,M-0001,Allgemein,1,Beschreibung 1
Kantenschleifer,M-0001,Holz,1,Beschreibung 1
Tischfräse,M-0001,Holz,1,Beschreibung 1
Felder Kreissäge,M-0001,Holz,1,Beschreibung 1
Felder Abricht-Dickenhobel,M-0001,Holz,1,Beschreibung 1
Felder Fräse,M-0001,Holz,1,Beschreibung 1
Felder Bandsäge,M-0001,Holz,1,Beschreibung 1
Drechselbank,M-0001,Holz,1,Beschreibung 1
1 Name Maschinen-Code Standort Active Beschreibung
2 Standbohrmaschine M-0001 Allgemein 1 Beschreibung 1
3 Kantenschleifer M-0001 Holz 1 Beschreibung 1
4 Tischfräse M-0001 Holz 1 Beschreibung 1
5 Felder Kreissäge M-0001 Holz 1 Beschreibung 1
6 Felder Abricht-Dickenhobel M-0001 Holz 1 Beschreibung 1
7 Felder Fräse M-0001 Holz 1 Beschreibung 1
8 Felder Bandsäge M-0001 Holz 1 Beschreibung 1
9 Drechselbank M-0001 Holz 1 Beschreibung 1

View File

@ -1,4 +1,5 @@
from . import machine from . import ows_models
from . import training from . import pos_order
from . import res_partner

View File

@ -1,12 +0,0 @@
from odoo import models, fields, api
class OpenWorkshopMachine(models.Model):
_name = 'open.workshop.machine'
_description = 'Open Workshop Machine'
name = fields.Char(string='Name', required=True)
code = fields.Char(string='Maschinen-Code', help='Interner Code oder Inventar-Nr.')
location = fields.Char(string='Standort')
description = fields.Text(string='Beschreibung')
active = fields.Boolean(default=True)

65
models/ows_models.py Normal file
View File

@ -0,0 +1,65 @@
from odoo import models, fields
class OwsMachineArea(models.Model):
_name = 'ows.machine.area'
_table = "ows_machine_area"
_description = 'OWS: Maschinenbereich'
_order = 'name'
name = fields.Char(required=True, translate=True)
color = fields.Integer(string="Farbe")
class OwsMachine(models.Model):
_name = 'ows.machine'
_table = 'ows_machine'
_description = 'OWS: Maschine'
name = fields.Char(required=True, translate=True)
code = fields.Char(required=True, help="Eindeutiger Kurzcode, z.B. 'lasercutter'")
description = fields.Text()
active = fields.Boolean(default=True)
area_id = fields.Many2one('ows.machine.area', string='Bereich')
_sql_constraints = [
('code_unique', 'unique(code)', 'Maschinencode muss eindeutig sein.')
]
def name_get(self):
return [(rec.id, f"{rec.name} ({rec.code})") for rec in self]
class OwsMachineAccess(models.Model):
_name = 'ows.machine.access'
_table = 'ows_machine_access'
_description = 'OWS: Maschinenfreigabe'
_order = 'partner_id, machine_id'
partner_id = fields.Many2one('res.partner', required=True, ondelete='cascade')
machine_id = fields.Many2one('ows.machine', required=True)
date_granted = fields.Date(default=fields.Date.today)
date_expiry = fields.Date(string="Ablaufdatum")
granted_by_pos = fields.Boolean(default=True)
_sql_constraints = [
('partner_machine_unique', 'unique(partner_id, machine_id)', 'Der Kunde hat diese Freigabe bereits.')
]
class OwsMachineProduct(models.Model):
_name = 'ows.machine.product'
_table = 'ows_machine_product'
_description = 'OWS: Zurordnung Produkt der Einweisung zur die Maschine'
product_id = fields.Many2one('product.product', required=True, domain=[('available_in_pos', '=', True)], ondelete='cascade')
machine_id = fields.Many2one('ows.machine', required=True, ondelete='cascade')
class ResPartner(models.Model):
_inherit = 'res.partner'
machine_access_ids = fields.One2many(
'ows.machine.access',
'partner_id',
string='Maschinenfreigaben'
)

51
models/pos_order.py Normal file
View File

@ -0,0 +1,51 @@
from odoo import models, fields, api
import debugpy
import logging
_logger = logging.getLogger(__name__)
_logger.info("✅ pos_order.py geladen")
debugpy.listen(("0.0.0.0", 5678))
print("✅ debugpy wartet auf Verbindung (Port 5678) ...")
# Optional: Starte erst, wenn VS Code verbunden ist
#debugpy.wait_for_client()
class PosOrder(models.Model):
_inherit = 'pos.order'
def _process_order(self, order, draft, existing_order):
pos_order_id = super(PosOrder, self)._process_order(order, draft, existing_order)
pos_order = self.browse(pos_order_id)
training_products = self.env['ows.machine.product'].search([])
product_map = {
tp.product_id.product_tmpl_id.id: tp.machine_id.id
for tp in training_products
}
partner = pos_order.partner_id
if not partner:
_logger.info("🟡 POS-Bestellung ohne Partner keine Freigabe möglich")
return pos_order_id
for line in pos_order.lines:
product_tmpl_id = line.product_id.product_tmpl_id.id
machine_id = product_map.get(product_tmpl_id)
_logger.info("🔍 Prüfe Produkt %s → Maschine ID: %s", line.product_id.display_name, machine_id)
if machine_id:
already_exists = self.env['ows.machine.access'].search([
('partner_id', '=', partner.id),
('machine_id', '=', machine_id)
])
if not already_exists:
self.env['ows.machine.access'].create({
'partner_id': partner.id,
'machine_id': machine_id,
'granted_by_pos': True
})
_logger.info("✅ Maschinenfreigabe erstellt: %s für %s", machine_id, partner.name)
return pos_order_id

View File

@ -1,11 +0,0 @@
from odoo import models, fields
class ResPartner(models.Model):
_inherit = 'res.partner'
machine_training_ids = fields.One2many(
'open.workshop.machine.training',
'partner_id',
string='Maschineneinweisungen'
)

View File

@ -1,29 +0,0 @@
from odoo import models, fields, api
class OpenWorkshopMachineTraining(models.Model):
_name = 'open.workshop.machine.training'
_description = 'Machine Training for Partners'
partner_id = fields.Many2one(
'res.partner',
string='Partner',
required=True,
ondelete='cascade'
)
machine_id = fields.Many2one(
'open.workshop.machine',
string='Maschine',
required=True,
ondelete='restrict'
)
training_date = fields.Datetime(
string='Datum der Einweisung',
default=fields.Datetime.now
)
notes = fields.Text(string='Notizen')
trainer_id = fields.Many2one(
'res.users',
string='Einweiser/In'
)

View File

@ -1,4 +1,5 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_open_workshop_machine_user,access_open_workshop_machine_user,model_open_workshop_machine,base.group_user,1,1,1,1 access_ows_machine_access_user,ows.machine.access,model_ows_machine_access,base.group_user,1,1,1,1
access_open_workshop_training_user,access_open_workshop_training_user,model_open_workshop_machine_training,base.group_user,1,1,1,1 access_ows_machine_user,ows.machine,model_ows_machine,base.group_user,1,1,1,1
access_ows_machine_product_user,ows.machine.product,model_ows_machine_product,base.group_user,1,1,1,1
access_ows_machine_area,ows.machine.area,model_ows_machine_area,base.group_user,1,1,1,1

1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_open_workshop_machine_user access_ows_machine_access_user access_open_workshop_machine_user ows.machine.access model_open_workshop_machine model_ows_machine_access base.group_user 1 1 1 1
3 access_open_workshop_training_user access_ows_machine_user access_open_workshop_training_user ows.machine model_open_workshop_machine_training model_ows_machine base.group_user 1 1 1 1
4 access_ows_machine_product_user ows.machine.product model_ows_machine_product base.group_user 1 1 1 1
5 access_ows_machine_area ows.machine.area model_ows_machine_area base.group_user 1 1 1 1

View File

@ -0,0 +1,37 @@
<odoo>
<!-- Action zum Anzeigen der Bereiche -->
<record id="action_machine_area_list" model="ir.actions.act_window">
<field name="name">Maschinenbereiche</field>
<field name="res_model">ows.machine.area</field>
<field name="view_mode">tree,form</field>
</record>
<!-- Menüpunkt unter Maschinen > Konfiguration -->
<menuitem id="menu_machine_area" name="Bereiche" parent="menu_machine_config" action="open_workshop.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>
<field name="model">ows.machine.area</field>
<field name="arch" type="xml">
<tree>
<field name="name"/>
<field name="color" widget="color_picker"/>
</tree>
</field>
</record>
<!-- Formularansicht -->
<record id="view_machine_area_form" model="ir.ui.view">
<field name="name">ows.machine.area.form</field>
<field name="model">ows.machine.area</field>
<field name="arch" type="xml">
<form string="Maschinenbereich">
<group>
<field name="name"/>
<field name="color" widget="color_picker"/>
</group>
</form>
</field>
</record>
</odoo>

34
views/machine_views.xml Normal file
View File

@ -0,0 +1,34 @@
<odoo>
<!-- Maschinen Listenansicht -->
<record id="view_machine_tree" model="ir.ui.view">
<field name="name">ows.machine.tree</field>
<field name="model">ows.machine</field>
<field name="arch" type="xml">
<tree>
<field name="name"/>
<field name="code"/>
<field name="area_id" widget="many2one_color"/>
<field name="active"/>
</tree>
</field>
</record>
<!-- Maschinen Formularansicht -->
<record id="view_machine_form" model="ir.ui.view">
<field name="name">ows.machine.form</field>
<field name="model">ows.machine</field>
<field name="arch" type="xml">
<form string="Maschine">
<sheet>
<group>
<field name="name"/>
<field name="code"/>
<field name="area_id"/>
<field name="active"/>
<field name="description"/>
</group>
</sheet>
</form>
</field>
</record>
</odoo>

46
views/menu_views.xml Normal file
View File

@ -0,0 +1,46 @@
<odoo>
<!-- Maschinenliste -->
<record id="action_machine_list" model="ir.actions.act_window">
<field name="name">Maschinen</field>
<field name="res_model">ows.machine</field>
<field name="view_mode">tree,form</field>
</record>
<!-- Trainingsprodukt-Liste -->
<record id="action_training_product_list" model="ir.actions.act_window">
<field name="name">Einweisungs-Produkte</field>
<field name="res_model">ows.machine.product</field>
<field name="view_mode">tree,form</field>
</record>
<!-- Menüstruktur -->
<menuitem id="menu_machine_root" name="Maschinen" sequence="10"/>
<menuitem id="menu_machine_config" name="Konfiguration" parent="menu_machine_root" sequence="10"/>
<menuitem id="menu_machine_list" name="Maschinen" parent="menu_machine_config" action="open_workshop.action_machine_list" sequence="10"/>
<menuitem id="menu_training_product" name="Einweisungs-Produkte" parent="menu_machine_config" action="open_workshop.action_training_product_list" sequence="20"/>
<!-- List & Form Views für training.product -->
<record id="view_training_product_tree" model="ir.ui.view">
<field name="name">ows.machine.product.tree</field>
<field name="model">ows.machine.product</field>
<field name="arch" type="xml">
<tree>
<field name="product_id"/>
<field name="machine_id"/>
</tree>
</field>
</record>
<record id="view_training_product_form" model="ir.ui.view">
<field name="name">ows.machine.product.form</field>
<field name="model">ows.machine.product</field>
<field name="arch" type="xml">
<form string="Einweisungs-Produkt">
<group>
<field name="product_id"/>
<field name="machine_id"/>
</group>
</form>
</field>
</record>
</odoo>

View File

@ -1,54 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="action_open_workshop_machine" model="ir.actions.act_window">
<field name="name">Maschinen</field>
<field name="res_model">open.workshop.machine</field>
<field name="view_mode">list,form</field>
<field name="help">Verwaltung aller Maschinen in der offenen Werkstatt</field>
</record>
<menuitem id="open_workshop_main_menu"
name="Offene Werkstatt"
sequence="10"/>
<menuitem id="open_workshop_menu_machine"
name="Maschinen"
parent="open_workshop_main_menu"
action="action_open_workshop_machine"
sequence="20"/>
<record id="view_open_workshop_machine_tree" model="ir.ui.view">
<field name="name">open.workshop.machine.tree</field>
<field name="model">open.workshop.machine</field>
<field name="arch" type="xml">
<list string="Maschinen">
<field name="name"/>
<field name="code"/>
<field name="description"/>
<field name="location"/>
<field name="active"/>
</list>
</field>
</record>
<record id="view_open_workshop_machine_form" model="ir.ui.view">
<field name="name">open.workshop.machine.form</field>
<field name="model">open.workshop.machine</field>
<field name="arch" type="xml">
<form string="Maschine">
<sheet>
<group>
<field name="name"/>
<field name="code"/>
<field name="location"/>
<field name="active"/>
</group>
<group>
<field name="description"/>
</group>
</sheet>
</form>
</field>
</record>
</odoo>

View File

@ -1,48 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="action_open_workshop_training" model="ir.actions.act_window">
<field name="name">Maschineneinweisungen</field>
<field name="res_model">open.workshop.machine.training</field>
<field name="view_mode">list,form</field>
<field name="help">Verwaltung aller Maschineneinweisungen (Partner -> Maschine)</field>
</record>
<menuitem id="open_workshop_menu_training"
name="Einweisungen"
parent="open_workshop_main_menu"
action="action_open_workshop_training"
sequence="30"/>
<record id="view_open_workshop_training_tree" model="ir.ui.view">
<field name="name">open.workshop.machine.training.tree</field>
<field name="model">open.workshop.machine.training</field>
<field name="arch" type="xml">
<list string="Maschineneinweisungen">
<field name="partner_id"/>
<field name="machine_id"/>
<field name="training_date"/>
</list>
</field>
</record>
<record id="view_open_workshop_training_form" model="ir.ui.view">
<field name="name">open.workshop.machine.training.form</field>
<field name="model">open.workshop.machine.training</field>
<field name="arch" type="xml">
<form string="Maschineneinweisung">
<sheet>
<group>
<field name="partner_id"/>
<field name="machine_id"/>
<field name="training_date"/>
<field name="trainer_id"/>
</group>
<group>
<field name="notes"/>
</group>
</sheet>
</form>
</field>
</record>
</odoo>

View File

@ -0,0 +1,21 @@
<odoo>
<record id="view_partner_form_inherit_open_workshop" model="ir.ui.view">
<field name="name">res.partner.form.ows.machine.access</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_partner_form"/>
<field name="arch" type="xml">
<notebook position="inside">
<page string="Maschinenfreigaben">
<field name="machine_access_ids">
<tree>
<field name="machine_id"/>
<field name="date_granted"/>
<field name="date_expiry"/>
<field name="granted_by_pos"/>
</tree>
</field>
</page>
</notebook>
</field>
</record>
</odoo>

View File

@ -1,30 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="view_partner_form_open_workshop_inherit" model="ir.ui.view">
<field name="name">res.partner.form.open.workshop.inherit</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_partner_form"/>
<field name="arch" type="xml">
<xpath expr="//notebook" position="inside">
<page string="Maschineneinweisungen">
<field name="machine_training_ids">
<list editable="bottom">
<field name="machine_id"/>
<field name="training_date"/>
<field name="trainer_id"/>
</list>
<form>
<group>
<field name="machine_id"/>
<field name="training_date"/>
<field name="trainer_id"/>
<field name="notes"/>
</group>
</form>
</field>
</page>
</xpath>
</field>
</record>
</odoo>