diff --git a/__manifest__.py b/__manifest__.py
index 6529af3..e0005ad 100644
--- a/__manifest__.py
+++ b/__manifest__.py
@@ -23,6 +23,8 @@
'open_workshop/static/src/css/pos.css',
'open_workshop/static/src/js/ows_pos_customer_sidebar.js',
'open_workshop/static/src/xml/ows_pos_customer_sidebar.xml',
+ 'open_workshop/static/src/js/ows_machine_access_list.js',
+ 'open_workshop/static/src/xml/ows_machine_access_list.xml',
'open_workshop/static/src/xml/ows_product_screen.xml',
],
},
diff --git a/models/ows_models.py b/models/ows_models.py
index 7032fa3..e2fea6e 100644
--- a/models/ows_models.py
+++ b/models/ows_models.py
@@ -424,10 +424,10 @@ class OwsMachine(models.Model):
@api.model
def get_access_list_grouped(self, partner_id):
+ partner = self.env['res.partner'].browse(partner_id)
areas = self.env['ows.machine.area'].search([], order="name")
- _logger.info("🔍 Maschinenbereiche: %s", areas.mapped('name'))
- _logger.info("🔍 Partner_id: %s", partner_id)
- res = []
+
+ access_by_area = []
for area in areas:
machines = self.search([('area_id', '=', area.id)], order="name")
machine_list = []
@@ -440,12 +440,22 @@ class OwsMachine(models.Model):
'name': machine.name,
'has_access': has_access,
})
- res.append({
- 'area': area.name,
- 'color_hex': area.color_hex or '#000000',
- 'machines': machine_list
- })
- return res
+ if machine_list:
+ access_by_area.append({
+ 'area': area.name,
+ 'color_hex': area.color_hex or '#000000',
+ 'machines': machine_list
+ })
+
+ user = partner.ows_user_id[:1]
+ return {
+ 'access_by_area': access_by_area,
+ 'security_briefing': user.security_briefing if user else False,
+ 'security_id': user.security_id if user else '',
+ 'rfid_card': user.rfid_card if user else '',
+ 'birthday': user.birthday if user else '',
+ }
+
class OwsMachineAccess(models.Model):
diff --git a/static/src/css/pos.css b/static/src/css/pos.css
index c6f6e10..9276402 100644
--- a/static/src/css/pos.css
+++ b/static/src/css/pos.css
@@ -1,3 +1,24 @@
.ows-sidebar { width: 220px; }
.order-entry:hover { cursor: pointer; }
.order-entry.selected { background-color: #007bff; color: white; }
+
+.sidebar-line {
+ display: flex;
+ justify-content: space-between;
+ gap: 0.5em;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ padding: 0.2em 0;
+}
+
+.sidebar-date {
+ flex-shrink: 0;
+ }
+
+.sidebar-name {
+ flex-shrink: 1;
+ text-align: right;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
diff --git a/static/src/js/machine_access_sidebar.js b/static/src/js/machine_access_sidebar.js
deleted file mode 100644
index f94cb2b..0000000
--- a/static/src/js/machine_access_sidebar.js
+++ /dev/null
@@ -1,132 +0,0 @@
-/* This file is based on the original code from the OrderWidget in Odoo Point of Sale module (screen.js).
- * It has been modified to create a sidebar that displays machine access information for the selected customer.*/
-
-odoo.define('open_workshop.machine_access_sidebar', function (require) {
- "use strict";
-
- const DUMMY_PARTNER = {
- id: 1,
- name: "AAAA Max Mustermann",
- security_briefing: false,
- security_id: null,
- create_date: null,
- };
-
- var rpc = require('web.rpc');
- var screens = require('point_of_sale.screens');
- var chrome = require('point_of_sale.chrome');
- var core = require('web.core');
- var QWeb = core.qweb;
-
-
-
- var MachineAccessSidebar = screens.ScreenWidget.extend({
- template: 'MachineAccessSidebar',
-
- init: function(parent, options) {
- this._super(parent, options);
- this.partner = null;
- this.pos.bind('change:selectedOrder', this.bind_order_events, this);
- },
-
- show: function() {
- this._super();
- this.render_access();
- },
-
- update_machine_access: function(partner) {
- console.log("🔁 Sidebar aktualisiert Maschinenfreigaben für Partner:", partner);
- this.partner = partner;
- this.render_access();
- },
-
- render_access: function() {
- var self = this;
- var partner = this.partner || DUMMY_PARTNER;
-
-
-
- rpc.query({
- model: 'ows.machine',
- method: 'get_access_list_grouped',
- args: [partner.id],
- }).then(function (result) {
- partner.create_date = partner.create_date && partner.create_date.substring(0, 10);
- var html = QWeb.render('PartnerMachineAccessList', {
- areas: result || [],
- partner: partner,
- });
- self.$('.access-content').html(html);
- });
- },
-
- bind_order_events: function () {
- var order = this.pos.get_order();
- if (!order) return;
-
- /*order.unbind('change:client', this);
- order.bind('change:client', this, function () {
- this.update_machine_access(order.get_client());
- });*/
-
- this.update_machine_access(order.get_client());
- }
- });
-
- // Sidebar aktualisieren bei Klick im ClientListScreenWidget (Vorschau)
- screens.ClientListScreenWidget.include({
- show: function () {
- this._super();
- $('.order-selector').hide(); // ← wird hier versteckt
- },
- hide: function () {
- this._super();
- $('.order-selector').show(); // ← beim Verlassen wieder zeigen
- },
- display_client_details: function (visibility, partner, clickpos) {
- this._super(visibility, partner, clickpos);
-
- try {
- if (partner && typeof partner === 'object' && 'id' in partner) {
- var sidebar = this.pos.chrome.sidebar_widget;
- if (sidebar) {
- console.log("👤 ClientListScreen: Vorschau für", partner.name);
- sidebar.update_machine_access(partner);
- }
- }
- } catch (e) {
- console.warn("⚠️ Fehler beim Update der Sidebar nach Kundenauswahl:", e);
- }
- }
- });
-
- chrome.Chrome.include({
- build_widgets: function () {
- this._super();
-
- var sidebar = new MachineAccessSidebar(this, {});
- this.sidebar_widget = sidebar;
- sidebar.appendTo(this.$el);
-
- //this.pos.bind('change:selectedOrder', sidebar.bind_order_events, sidebar);
-
- if (this.pos.get_order()) {
- sidebar.bind_order_events();
- }
- }
- });
-});
-
-
-odoo.define('open_workshop.models', function (require) {
- "use strict";
- var models = require('point_of_sale.models');
- var field_utils = require('web.field_utils');
- models.load_fields('res.partner', 'create_date');
- models.load_fields('res.partner', 'birthday');
- models.load_fields('res.partner', 'security_briefing');
- models.load_fields('res.partner', 'security_id');
- models.load_fields('res.partner', 'rfid_card');
-
-
-});
\ No newline at end of file
diff --git a/static/src/js/ows_machine_access_list.js b/static/src/js/ows_machine_access_list.js
new file mode 100644
index 0000000..fc9e981
--- /dev/null
+++ b/static/src/js/ows_machine_access_list.js
@@ -0,0 +1,63 @@
+// @odoo-module
+
+import { Component, useState } from "@odoo/owl";
+import { useBus } from "@web/core/utils/hooks";
+import { usePos } from "@point_of_sale/app/store/pos_hook";
+import { jsonrpc } from "@web/core/network/rpc_service";
+
+export class OwsMachineAccessList extends Component {
+ static template = 'open_workshop.OwsMachineAccessList';
+
+ setup() {
+ this.pos = usePos();
+
+ this.state = useState({
+ grouped_accesses: [],
+ security_briefing: false,
+ security_id: '',
+ rfid_card: '',
+ birthday: '',
+ });
+
+ // 🔁 Reagiere auf Partnerwechsel über den Odoo-Bus
+ useBus(this.env.bus, 'partner-changed', () => {
+ this.updateAccessList();
+ });
+
+ // 🔃 Beim Mounten initiale Daten laden
+ this.updateAccessList();
+ }
+
+ async updateAccessList() {
+ const order = this.pos.get_order();
+ const partner = order?.get_partner?.();
+
+ if (!partner) {
+ this.state.grouped_accesses = [];
+ this.state.security_briefing = false;
+ this.state.security_id = '';
+ this.state.rfid_card = '';
+ this.state.birthday = '';
+ return;
+ }
+
+ try {
+ const data = await jsonrpc("/open_workshop/partner_access", {
+ partner_id: partner.id,
+ });
+
+ this.state.grouped_accesses = data.access_by_area || [];
+ this.state.security_briefing = data.security_briefing;
+ this.state.security_id = data.security_id;
+ this.state.rfid_card = data.rfid_card;
+ this.state.birthday = data.birthday;
+ } catch (error) {
+ console.error("Fehler beim Laden der Einweisungen:", error);
+ this.state.grouped_accesses = [];
+ this.state.security_briefing = false;
+ this.state.security_id = '';
+ this.state.rfid_card = '';
+ this.state.birthday = '';
+ }
+ }
+}
diff --git a/static/src/js/ows_pos_customer_sidebar.js b/static/src/js/ows_pos_customer_sidebar.js
index dfd95b8..ff69dca 100644
--- a/static/src/js/ows_pos_customer_sidebar.js
+++ b/static/src/js/ows_pos_customer_sidebar.js
@@ -5,6 +5,7 @@ import { useService } from "@web/core/utils/hooks";
import { usePos } from "@point_of_sale/app/store/pos_hook";
import { _t } from "@web/core/l10n/translation";
import { ConfirmPopup } from "@point_of_sale/app/utils/confirm_popup/confirm_popup";
+import { deserializeDateTime, formatDateTime, parseDateTime } from "@web/core/l10n/dates";
export class OwsPosCustomerSidebar extends Component {
static template = "open_workshop.OwsPosCustomerSidebar";
@@ -12,11 +13,13 @@ export class OwsPosCustomerSidebar extends Component {
setup() {
this.pos = usePos();
this.popup = useService("popup");
+
}
addOrder() {
this.pos.add_new_order(); // neue Order wird aktive Order
this.pos.selectPartner();
+ this.env.bus.trigger('partner-changed'); // ✅ korrektes Event feuern
}
async removeCurrentOrder() {
@@ -45,6 +48,7 @@ export class OwsPosCustomerSidebar extends Component {
}
// Hinweis: Weitere Funktionen wie Sync mit Server (siehe ticket_screen.js) können hier ergänzt werden.
+ this.env.bus.trigger('partner-changed'); // ✅ korrektes Event feuern
}
openTicketScreen() {
@@ -56,15 +60,21 @@ export class OwsPosCustomerSidebar extends Component {
}
getDate(order) {
- const date = new Date(order.creationDate || order.creation_date || Date.now());
- return date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });
+ const date = new Date(order.date_order);
+ const dd = String(date.getDate()).padStart(2, '0');
+ const mm = String(date.getMonth() + 1).padStart(2, '0');
+ const hh = String(date.getHours()).padStart(2, '0');
+ const mi = String(date.getMinutes()).padStart(2, '0');
+ return `${dd}.${mm}. ${hh}:${mi}`;
}
+
getPartner(order) {
return order.get_partner()?.name || "Kein Kunde";
}
selectOrder(order) {
this.pos.set_order(order);
+ this.env.bus.trigger('partner-changed'); // ✅ korrektes Event feuern
}
}
diff --git a/static/src/js/product_screen_template_patch.js b/static/src/js/product_screen_template_patch.js
index c86c55a..d478e56 100644
--- a/static/src/js/product_screen_template_patch.js
+++ b/static/src/js/product_screen_template_patch.js
@@ -3,12 +3,14 @@
import { ProductScreen } from "@point_of_sale/app/screens/product_screen/product_screen";
import { registry } from "@web/core/registry";
import { OwsPosCustomerSidebar } from "@open_workshop/js/ows_pos_customer_sidebar";
+import { OwsMachineAccessList } from "@open_workshop/js/ows_machine_access_list";
export class OwsProductScreen extends ProductScreen {
static template = "open_workshop.ProductScreen";
static components = {
...ProductScreen.components,
OwsPosCustomerSidebar,
+ OwsMachineAccessList,
};
}
diff --git a/static/src/xml/ows_machine_access_list.xml b/static/src/xml/ows_machine_access_list.xml
new file mode 100644
index 0000000..787441b
--- /dev/null
+++ b/static/src/xml/ows_machine_access_list.xml
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+ ‼️Bitte Prüfen‼️
+
+
+
+
+
+
-
-
-
-
- ‼️Bitte Prüfen‼️
-
-
-
-
-