Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[ADD] pos_odoo_driver_payment #2

Open
wants to merge 1 commit into
base: 16.0
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Empty file.
1 change: 1 addition & 0 deletions pos_odoo_driver_payment/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import models
35 changes: 35 additions & 0 deletions pos_odoo_driver_payment/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
# 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 - Telium Payment Terminal (odoo-pos-driver)",
"version": "16.0.1.0.0",
"category": "Point Of Sale",
"summary": "Communicate with Telium Payment Terminal"
" via odoo-pos-driver library",
"author": (
"Aurélien DUMAINE,"
"GRAP,"
"Akretion,"
"ACSONE SA/NV,"
"Odoo Community Association (OCA)"
),
"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_res_config_settings.xml",
"views/view_pos_payment_method.xml",
],
"installable": True,
}
96 changes: 96 additions & 0 deletions pos_odoo_driver_payment/i18n/fr.po
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * pos_odoo_driver_payment
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 16.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2024-09-10 22:50+0000\n"
"PO-Revision-Date: 2024-09-10 22:50+0000\n"
"Last-Translator: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"

#. module: pos_odoo_driver_payment
#: model:ir.model.fields,help:pos_odoo_driver_payment.field_pos_config__iface_payment_terminal
#: model:ir.model.fields,help:pos_odoo_driver_payment.field_res_config_settings__pos_iface_payment_terminal
msgid "A payment terminal is available on the Proxy"
msgstr "Un terminal de paiement est disponible via le proxy"

#. module: pos_odoo_driver_payment
#. odoo-javascript
#: code:addons/pos_odoo_driver_payment/static/src/js/PaymentScreen.esm.js:0
#, python-format
msgid "Communication failed"
msgstr "Echec de la communication"

#. module: pos_odoo_driver_payment
#: model:ir.model,name:pos_odoo_driver_payment.model_res_config_settings
msgid "Config Settings"
msgstr "Paramètres de configuration"

#. module: pos_odoo_driver_payment
#. odoo-javascript
#: code:addons/pos_odoo_driver_payment/static/src/js/ProxyStatus.esm.js:0
#, python-format
msgid "EPT"
msgstr "TPE"

#. module: pos_odoo_driver_payment
#. odoo-javascript
#: code:addons/pos_odoo_driver_payment/static/src/js/ProxyStatus.esm.js:0
#, python-format
msgid "EPT Offline"
msgstr "TPE hors ligne"

#. module: pos_odoo_driver_payment
#: model:ir.model.fields,field_description:pos_odoo_driver_payment.field_pos_payment_method__is_payment_terminal
msgid "Is Payment Terminal"
msgstr "Est un terminal de paiement"

#. module: pos_odoo_driver_payment
#: model:ir.model.fields,field_description:pos_odoo_driver_payment.field_pos_config__iface_payment_terminal
#: model:ir.model.fields,field_description:pos_odoo_driver_payment.field_res_config_settings__pos_iface_payment_terminal
#: model_terms:ir.ui.view,arch_db:pos_odoo_driver_payment.view_res_config_settings_form
msgid "Payment Terminal"
msgstr "Terminal de paiement"

#. module: pos_odoo_driver_payment
#: model:ir.model,name:pos_odoo_driver_payment.model_pos_config
msgid "Point of Sale Configuration"
msgstr "Configuration du point de vente"

#. module: pos_odoo_driver_payment
#: model:ir.model,name:pos_odoo_driver_payment.model_pos_payment_method
msgid "Point of Sale Payment Methods"
msgstr "Modes de paiement du point de vente"

#. module: pos_odoo_driver_payment
#: model:ir.model,name:pos_odoo_driver_payment.model_pos_session
msgid "Point of Sale Session"
msgstr "Session du point de vente"

#. module: pos_odoo_driver_payment
#. odoo-javascript
#: code:addons/pos_odoo_driver_payment/static/src/js/PaymentScreen.esm.js:0
#, python-format
msgid ""
"Possible reasons: \n"
"- the terminal payment is not connected\n"
"- the device is busy for the time being (still processing a payment)."
msgstr ""
"Raisons possibles: \n"
"- Le terminal de paiement n'est pas connecté\n"
"- Le périphérique est occupé pour le moment (déjà en train de traiter un paiement)"

#. module: pos_odoo_driver_payment
#. odoo-javascript
#: code:addons/pos_odoo_driver_payment/static/src/xml/PaymentScreenPaymentLines.xml:0
#: code:addons/pos_odoo_driver_payment/static/src/xml/PaymentScreenPaymentLines.xml:0
#, python-format
msgid "Send to Payment Terminal"
msgstr "Envoyer au terminal de paiement"
4 changes: 4 additions & 0 deletions pos_odoo_driver_payment/models/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
from . import pos_config
from . import res_config_settings
from . import pos_session
from . import pos_payment_method
23 changes: 23 additions & 0 deletions pos_odoo_driver_payment/models/pos_config.py
Original file line number Diff line number Diff line change
@@ -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).

from odoo import api, fields, models


class PosConfig(models.Model):
_inherit = "pos.config"

iface_payment_terminal = fields.Boolean(
"Payment Terminal",
help="A payment terminal is available on the Proxy",
compute="_compute_iface_payment_terminal",
store=True,
)

@api.depends("payment_method_ids.is_payment_terminal")
def _compute_iface_payment_terminal(self):
for config in self:
config.iface_payment_terminal = any(
config.mapped("payment_method_ids.is_payment_terminal")
)
11 changes: 11 additions & 0 deletions pos_odoo_driver_payment/models/pos_payment_method.py
Original file line number Diff line number Diff line change
@@ -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 PosPaymentMethod(models.Model):
_inherit = "pos.payment.method"

is_payment_terminal = fields.Boolean()
16 changes: 16 additions & 0 deletions pos_odoo_driver_payment/models/pos_session.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# 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 models


class PosSession(models.Model):
_inherit = "pos.session"

def _get_pos_ui_pos_config(self, params):
config = super()._get_pos_ui_pos_config(params)
config["use_proxy"] = config["use_proxy"] or (

Check warning on line 13 in pos_odoo_driver_payment/models/pos_session.py

View check run for this annotation

Codecov / codecov/patch

pos_odoo_driver_payment/models/pos_session.py#L12-L13

Added lines #L12 - L13 were not covered by tests
config["is_posbox"] and config["iface_payment_terminal"]
)
return config

Check warning on line 16 in pos_odoo_driver_payment/models/pos_session.py

View check run for this annotation

Codecov / codecov/patch

pos_odoo_driver_payment/models/pos_session.py#L16

Added line #L16 was not covered by tests
13 changes: 13 additions & 0 deletions pos_odoo_driver_payment/models/res_config_settings.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# 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 ResConfigSettings(models.TransientModel):
_inherit = "res.config.settings"

pos_iface_payment_terminal = fields.Boolean(
related="pos_config_id.iface_payment_terminal"
)
5 changes: 5 additions & 0 deletions pos_odoo_driver_payment/readme/CONFIGURE.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
* go to the "Point of Sale > Configuration > Payment Method"

* Check the option *Is Payment Terminal*

.. figure:: ../static/img/pos_payment_method_form.png
6 changes: 6 additions & 0 deletions pos_odoo_driver_payment/readme/CONTRIBUTORS.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
This module is a full refactor of the OCA V16 module ``pos_terminal_payment``.
Original authors and ideas are:

* Aurelien Dumaine
* Alexis de Lattre <[email protected]>
* Sylvain LE GAL (https://twitter.com/legalsylvain)
4 changes: 4 additions & 0 deletions pos_odoo_driver_payment/readme/DESCRIPTION.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
This module extends the Point of Sale odoo module, to add compatibility with the ``odoo-pos-driver``
python library, when using Telium Payment Terminal.

More information: https://pypi.org/project/odoo-pos-driver/
7 changes: 7 additions & 0 deletions pos_odoo_driver_payment/readme/USAGE.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
* Open the Point of sale

* make an order, and select a payment that is marked as "Is Payment Terminal"

* Click on the button "Send to Payment Terminal"

.. figure:: ../static/img/pos_front_end.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
7 changes: 7 additions & 0 deletions pos_odoo_driver_payment/static/src/css/pos.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
div.send-payment-terminal-button {
font-size: x-large;
padding: 8px;
margin: 8px;
border: 2px solid gray;
border-radius: 10px;
}
39 changes: 39 additions & 0 deletions pos_odoo_driver_payment/static/src/js/PaymentScreen.esm.js
Original file line number Diff line number Diff line change
@@ -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;
});
37 changes: 37 additions & 0 deletions pos_odoo_driver_payment/static/src/js/ProxyStatus.esm.js
Original file line number Diff line number Diff line change
@@ -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);
});
23 changes: 23 additions & 0 deletions pos_odoo_driver_payment/static/src/js/devices.esm.js
Original file line number Diff line number Diff line change
@@ -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)}
)
},

});
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<templates id="template" xml:space="preserve">

<t t-name="pos_odoo_driver_payment.PaymentScreenPaymentLines"
t-inherit="point_of_sale.PaymentScreenPaymentLines"
t-inherit-mode="extension" owl="1">
<xpath expr="//div[hasclass('payment-name')]" position="after">
<t t-if="line.payment_method.name == 'Bank'">
<div class="send-payment-terminal-button"
t-on-click="() => this.trigger('send-payment-terminal', { cid: line.cid })"
aria-label="Send to Payment Terminal"
title="Send to Payment Terminal">
<i class="fa fa-credit-card" />
<i class="fa fa-share-square" />
</div>
</t>
</xpath>
</t>

</templates>
19 changes: 19 additions & 0 deletions pos_odoo_driver_payment/views/view_pos_payment_method.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?xml version="1.0" ?>
<!--
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>

<record id="view_pos_payment_method_form" model="ir.ui.view">
<field name="model">pos.payment.method</field>
<field name="inherit_id" ref="point_of_sale.pos_payment_method_view_form" />
<field name="arch" type="xml">
<field name="journal_id" position="after">
<field name="is_payment_terminal"/>
</field>
</field>
</record>

</odoo>
Loading
Loading