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, +)