From 7e2272102fb9d03bebf0f38da1314ae40033652b Mon Sep 17 00:00:00 2001 From: Sylvain LE GAL Date: Tue, 10 Sep 2024 19:30:05 +0200 Subject: [PATCH] [ADD] pos_odoo_driver_device_list --- pos_odoo_driver_device_list/README.rst | 0 pos_odoo_driver_device_list/__init__.py | 1 + pos_odoo_driver_device_list/__manifest__.py | 25 +++++++++++ pos_odoo_driver_device_list/i18n/fr.po | 0 .../models/__init__.py | 2 + .../models/pos_config.py | 11 +++++ .../models/pos_device.py | 30 ++++++++++++++ .../readme/CONTRIBUTORS.rst | 1 + .../readme/DESCRIPTION.rst | 4 ++ pos_odoo_driver_device_list/readme/USAGE.rst | 9 ++++ .../static/description/pos_front_end.png | Bin 0 -> 4922 bytes .../description/pos_payment_method_form.png | Bin 0 -> 10157 bytes .../static/src/css/pos.css | 7 ++++ .../static/src/js/PaymentScreen.esm.js | 39 ++++++++++++++++++ .../static/src/js/ProxyStatus.esm.js | 37 +++++++++++++++++ .../static/src/js/devices.esm.js | 23 +++++++++++ .../src/xml/PaymentScreenPaymentLines.xml | 20 +++++++++ .../views/view_pos_device.xml | 25 +++++++++++ setup/.setuptools-odoo-make-default-ignore | 2 + setup/README | 2 + .../odoo/addons/pos_odoo_driver_device_list | 1 + setup/pos_odoo_driver_device_list/setup.py | 6 +++ 22 files changed, 245 insertions(+) create mode 100644 pos_odoo_driver_device_list/README.rst create mode 100644 pos_odoo_driver_device_list/__init__.py create mode 100644 pos_odoo_driver_device_list/__manifest__.py create mode 100644 pos_odoo_driver_device_list/i18n/fr.po create mode 100644 pos_odoo_driver_device_list/models/__init__.py create mode 100644 pos_odoo_driver_device_list/models/pos_config.py create mode 100644 pos_odoo_driver_device_list/models/pos_device.py create mode 100644 pos_odoo_driver_device_list/readme/CONTRIBUTORS.rst create mode 100644 pos_odoo_driver_device_list/readme/DESCRIPTION.rst create mode 100644 pos_odoo_driver_device_list/readme/USAGE.rst create mode 100644 pos_odoo_driver_device_list/static/description/pos_front_end.png create mode 100644 pos_odoo_driver_device_list/static/description/pos_payment_method_form.png create mode 100644 pos_odoo_driver_device_list/static/src/css/pos.css create mode 100644 pos_odoo_driver_device_list/static/src/js/PaymentScreen.esm.js create mode 100644 pos_odoo_driver_device_list/static/src/js/ProxyStatus.esm.js create mode 100644 pos_odoo_driver_device_list/static/src/js/devices.esm.js create mode 100644 pos_odoo_driver_device_list/static/src/xml/PaymentScreenPaymentLines.xml create mode 100644 pos_odoo_driver_device_list/views/view_pos_device.xml create mode 100644 setup/.setuptools-odoo-make-default-ignore create mode 100644 setup/README create mode 120000 setup/pos_odoo_driver_device_list/odoo/addons/pos_odoo_driver_device_list create mode 100644 setup/pos_odoo_driver_device_list/setup.py 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 0000000000000000000000000000000000000000..56f4ce2dd67133fa288b5aff6283f25d9463ca51 GIT binary patch literal 4922 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 P7(iWFN2x}^>f`?d!$Af+fE(%m5PC5 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 literal 0 HcmV?d00001 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, +)