diff --git a/pos_odoo_driver_device_list/README.rst b/pos_odoo_driver_device_list/README.rst
new file mode 100644
index 0000000..e69de29
diff --git a/pos_odoo_driver_device_list/__init__.py b/pos_odoo_driver_device_list/__init__.py
new file mode 100644
index 0000000..0650744
--- /dev/null
+++ b/pos_odoo_driver_device_list/__init__.py
@@ -0,0 +1 @@
+from . import models
diff --git a/pos_odoo_driver_device_list/__manifest__.py b/pos_odoo_driver_device_list/__manifest__.py
new file mode 100644
index 0000000..a3cb044
--- /dev/null
+++ b/pos_odoo_driver_device_list/__manifest__.py
@@ -0,0 +1,25 @@
+# Copyright (C) 2024 - Today: GRAP (http://www.grap.coop)
+# @author: Sylvain LE GAL (https://twitter.com/legalsylvain)
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+{
+ "name": "Point of Sale - Devices List (odoo-pos-driver)",
+ "version": "16.0.1.0.0",
+ "category": "Point Of Sale",
+ "summary": "Get devices information from odoo-pos-driver library",
+ "author": "GRAP",
+ "website": "https://github.com/grap/odoo-addons-pos",
+ "license": "AGPL-3",
+ "depends": ["point_of_sale"],
+ "assets": {
+ "point_of_sale.assets": [
+ # "pos_odoo_driver_payment/static/src/css/pos.css",
+ # "pos_odoo_driver_payment/static/src/js/devices.esm.js",
+ # "pos_odoo_driver_payment/static/src/js/ProxyStatus.esm.js",
+ # "pos_odoo_driver_payment/static/src/js/PaymentScreen.esm.js",
+ # "pos_odoo_driver_payment/static/src/xml/PaymentScreenPaymentLines.xml",
+ ],
+ },
+ "data": ["views/view_pos_device.xml"],
+ "installable": True,
+}
diff --git a/pos_odoo_driver_device_list/i18n/fr.po b/pos_odoo_driver_device_list/i18n/fr.po
new file mode 100644
index 0000000..e69de29
diff --git a/pos_odoo_driver_device_list/models/__init__.py b/pos_odoo_driver_device_list/models/__init__.py
new file mode 100644
index 0000000..9044dab
--- /dev/null
+++ b/pos_odoo_driver_device_list/models/__init__.py
@@ -0,0 +1,2 @@
+from . import pos_config
+from . import pos_device
diff --git a/pos_odoo_driver_device_list/models/pos_config.py b/pos_odoo_driver_device_list/models/pos_config.py
new file mode 100644
index 0000000..f14a042
--- /dev/null
+++ b/pos_odoo_driver_device_list/models/pos_config.py
@@ -0,0 +1,11 @@
+# Copyright (C) 2024 - Today: GRAP (http://www.grap.coop)
+# @author: Sylvain LE GAL (https://twitter.com/legalsylvain)
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+from odoo import fields, models
+
+
+class PosConfig(models.Model):
+ _inherit = "pos.config"
+
+ device_ids = fields.One2many(comodel_name="pos.device", inverse_name="config_id")
diff --git a/pos_odoo_driver_device_list/models/pos_device.py b/pos_odoo_driver_device_list/models/pos_device.py
new file mode 100644
index 0000000..2b85510
--- /dev/null
+++ b/pos_odoo_driver_device_list/models/pos_device.py
@@ -0,0 +1,30 @@
+# Copyright (C) 2024 - Today: GRAP (http://www.grap.coop)
+# @author: Sylvain LE GAL (https://twitter.com/legalsylvain)
+# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+from odoo import fields, models
+
+
+class PosDevice(models.Model):
+ _name = "pos.device"
+
+ config_id = fields.Many2one(comodel_name="pos.config")
+
+ company_id = fields.Many2one(
+ commodel_name="res.company", default=lambda x: x._default_company_id()
+ )
+
+ name = fields.Char(readonly=True)
+
+ product_name = fields.Char(readonly=True)
+
+ vendor_product_code = fields.Char(readonly=True)
+
+ serial_number = fields.Char(readonly=True)
+
+ manufacturer = fields.Char(readonly=True)
+
+ last_connexion_date = fields.Datetime(readonly=True)
+
+ def _default_company_id(self):
+ return self.env.company
diff --git a/pos_odoo_driver_device_list/readme/CONTRIBUTORS.rst b/pos_odoo_driver_device_list/readme/CONTRIBUTORS.rst
new file mode 100644
index 0000000..ae6f43a
--- /dev/null
+++ b/pos_odoo_driver_device_list/readme/CONTRIBUTORS.rst
@@ -0,0 +1 @@
+* Sylvain LE GAL (https://twitter.com/legalsylvain)
diff --git a/pos_odoo_driver_device_list/readme/DESCRIPTION.rst b/pos_odoo_driver_device_list/readme/DESCRIPTION.rst
new file mode 100644
index 0000000..e619d9b
--- /dev/null
+++ b/pos_odoo_driver_device_list/readme/DESCRIPTION.rst
@@ -0,0 +1,4 @@
+This module extends the Point of Sale odoo module, to add compatibility with the ``odoo-pos-driver``
+python library.
+
+It will store connected devices information in Odoo for analysis.
diff --git a/pos_odoo_driver_device_list/readme/USAGE.rst b/pos_odoo_driver_device_list/readme/USAGE.rst
new file mode 100644
index 0000000..2104a27
--- /dev/null
+++ b/pos_odoo_driver_device_list/readme/USAGE.rst
@@ -0,0 +1,9 @@
+* Open the Point of sale, with usb devices connected.
+
+* Close the point of sale.
+
+* Go to " / Devices".
+
+you can see the devices information, with last usage date.
+
+.. figure:: ../static/img/pos_device_tree.png
diff --git a/pos_odoo_driver_device_list/static/description/pos_front_end.png b/pos_odoo_driver_device_list/static/description/pos_front_end.png
new file mode 100644
index 0000000..56f4ce2
Binary files /dev/null and b/pos_odoo_driver_device_list/static/description/pos_front_end.png differ
diff --git a/pos_odoo_driver_device_list/static/description/pos_payment_method_form.png b/pos_odoo_driver_device_list/static/description/pos_payment_method_form.png
new file mode 100644
index 0000000..e15ed11
Binary files /dev/null and b/pos_odoo_driver_device_list/static/description/pos_payment_method_form.png differ
diff --git a/pos_odoo_driver_device_list/static/src/css/pos.css b/pos_odoo_driver_device_list/static/src/css/pos.css
new file mode 100644
index 0000000..fc59dcc
--- /dev/null
+++ b/pos_odoo_driver_device_list/static/src/css/pos.css
@@ -0,0 +1,7 @@
+div.send-payment-terminal-button {
+ font-size: x-large;
+ padding: 8px;
+ margin: 8px;
+ border: 2px solid gray;
+ border-radius: 10px;
+}
diff --git a/pos_odoo_driver_device_list/static/src/js/PaymentScreen.esm.js b/pos_odoo_driver_device_list/static/src/js/PaymentScreen.esm.js
new file mode 100644
index 0000000..723cf44
--- /dev/null
+++ b/pos_odoo_driver_device_list/static/src/js/PaymentScreen.esm.js
@@ -0,0 +1,39 @@
+// Copyright (C) 2024 - Today: GRAP (http://www.grap.coop)
+// @author: Sylvain LE GAL (https://twitter.com/legalsylvain)
+// License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+odoo.define("pos_odoo_driver_payment.PaymentScreen", function (require) {
+
+ const PaymentScreen = require("point_of_sale.PaymentScreen");
+ const Registries = require("point_of_sale.Registries");
+ const { useListener } = require("@web/core/utils/hooks");
+
+ const OverloadPaymentScreen = (OriginalPaymentScreen) =>
+ class extends OriginalPaymentScreen {
+
+ setup() {
+ super.setup();
+ useListener('send-payment-terminal', this.SendPaymentTerminal);
+ }
+
+ SendPaymentTerminal(event) {
+ var self = this;
+ const { cid } = event.detail;
+ const payment_line = this.paymentLines.find((line) => line.cid === cid);
+ this.env.proxy.payment_terminal_push_amount(payment_line)
+ .then(function (result) {
+ if (!result) {
+ self.showPopup('ErrorTracebackPopup', {
+ title: self.env._t('Communication failed'),
+ body: self.env._t('Possible reasons: \n- the terminal payment is not connected\n- the device is busy for the time being (still processing a payment).'),
+ });
+ }
+
+ });
+ }
+
+ };
+
+ Registries.Component.extend(PaymentScreen, OverloadPaymentScreen);
+ return PaymentScreen;
+});
diff --git a/pos_odoo_driver_device_list/static/src/js/ProxyStatus.esm.js b/pos_odoo_driver_device_list/static/src/js/ProxyStatus.esm.js
new file mode 100644
index 0000000..aad9cc1
--- /dev/null
+++ b/pos_odoo_driver_device_list/static/src/js/ProxyStatus.esm.js
@@ -0,0 +1,37 @@
+// Copyright (C) 2024 - Today: GRAP (http://www.grap.coop)
+// @author: Sylvain LE GAL (https://twitter.com/legalsylvain)
+// License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+odoo.define("pos_odoo_driver_payment.ProxyStatus", function (require) {
+ var Registries = require("point_of_sale.Registries");
+ var ProxyStatus = require("point_of_sale.ProxyStatus");
+
+ const OverloadProxyStatus = (OriginalProxyStatus) =>
+ class extends OriginalProxyStatus {
+ _setStatus(newStatus) {
+ super._setStatus(newStatus);
+ if (
+ newStatus.status === "connected" &&
+ this.env.pos.config.iface_payment_terminal
+ ) {
+ var paymentStatus = newStatus.drivers.payment
+ ? newStatus.drivers.payment.status
+ : false;
+ if (
+ paymentStatus !== "connected" &&
+ paymentStatus !== "connecting"
+ ) {
+ if (this.state.msg) {
+ this.state.msg =
+ this.env._t("EPT") + " & " + this.state.msg;
+ } else {
+ this.state.msg = this.env._t("EPT Offline");
+ this.state.status = "warning";
+ }
+ }
+ }
+ }
+ };
+
+ Registries.Component.extend(ProxyStatus, OverloadProxyStatus);
+});
diff --git a/pos_odoo_driver_device_list/static/src/js/devices.esm.js b/pos_odoo_driver_device_list/static/src/js/devices.esm.js
new file mode 100644
index 0000000..0202690
--- /dev/null
+++ b/pos_odoo_driver_device_list/static/src/js/devices.esm.js
@@ -0,0 +1,23 @@
+// Copyright (C) 2024 - Today: GRAP (http://www.grap.coop)
+// @author: Sylvain LE GAL (https://twitter.com/legalsylvain)
+// License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+
+odoo.define("pos_odoo_driver_payment.devices", function (require) {
+
+ var ProxyDevice = require("point_of_sale.devices").ProxyDevice;
+
+ ProxyDevice.include({
+
+ payment_terminal_push_amount: function (payment_line) {
+ var data = {
+ amount: payment_line.amount,
+ currency_iso: this.pos.currency.name,
+ };
+ return this.message(
+ "payment_terminal_transaction_start",
+ {payment_info: JSON.stringify(data)}
+ )
+ },
+
+ });
+});
diff --git a/pos_odoo_driver_device_list/static/src/xml/PaymentScreenPaymentLines.xml b/pos_odoo_driver_device_list/static/src/xml/PaymentScreenPaymentLines.xml
new file mode 100644
index 0000000..1286a18
--- /dev/null
+++ b/pos_odoo_driver_device_list/static/src/xml/PaymentScreenPaymentLines.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pos_odoo_driver_device_list/views/view_pos_device.xml b/pos_odoo_driver_device_list/views/view_pos_device.xml
new file mode 100644
index 0000000..4893483
--- /dev/null
+++ b/pos_odoo_driver_device_list/views/view_pos_device.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+ pos.device
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/setup/.setuptools-odoo-make-default-ignore b/setup/.setuptools-odoo-make-default-ignore
new file mode 100644
index 0000000..207e615
--- /dev/null
+++ b/setup/.setuptools-odoo-make-default-ignore
@@ -0,0 +1,2 @@
+# addons listed in this file are ignored by
+# setuptools-odoo-make-default (one addon per line)
diff --git a/setup/README b/setup/README
new file mode 100644
index 0000000..a63d633
--- /dev/null
+++ b/setup/README
@@ -0,0 +1,2 @@
+To learn more about this directory, please visit
+https://pypi.python.org/pypi/setuptools-odoo
diff --git a/setup/pos_odoo_driver_device_list/odoo/addons/pos_odoo_driver_device_list b/setup/pos_odoo_driver_device_list/odoo/addons/pos_odoo_driver_device_list
new file mode 120000
index 0000000..0ddc385
--- /dev/null
+++ b/setup/pos_odoo_driver_device_list/odoo/addons/pos_odoo_driver_device_list
@@ -0,0 +1 @@
+../../../../pos_odoo_driver_device_list
\ No newline at end of file
diff --git a/setup/pos_odoo_driver_device_list/setup.py b/setup/pos_odoo_driver_device_list/setup.py
new file mode 100644
index 0000000..28c57bb
--- /dev/null
+++ b/setup/pos_odoo_driver_device_list/setup.py
@@ -0,0 +1,6 @@
+import setuptools
+
+setuptools.setup(
+ setup_requires=['setuptools-odoo'],
+ odoo_addon=True,
+)