Skip to content
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
201 changes: 201 additions & 0 deletions pos_payment_pax_terminal_pywebdriver/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,201 @@
=============================
POS Payment PAX (pywebdriver)
=============================

..
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! This file is generated by oca-gen-addon-readme !!
!! changes will be overwritten. !!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:79503bce4f415229a1e017b0b843bb73d4d5d47b747b6812c3a88f821205b0b4
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png
:target: https://odoo-community.org/page/development-status
:alt: Beta
.. |badge2| image:: https://img.shields.io/badge/licence-LGPL--3-blue.png
:target: http://www.gnu.org/licenses/lgpl-3.0-standalone.html
:alt: License: LGPL-3
.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fpos-lightgray.png?logo=github
:target: https://github.com/OCA/pos/tree/18.0/pos_payment_pax_terminal_pywebdriver
:alt: OCA/pos
.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png
:target: https://translation.odoo-community.org/projects/pos-18-0/pos-18-0-pos_payment_pax_terminal_pywebdriver
:alt: Translate me on Weblate
.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png
:target: https://runboat.odoo-community.org/builds?repo=OCA/pos&target_branch=18.0
:alt: Try me on Runboat

|badge1| |badge2| |badge3| |badge4| |badge5|

Integrates **PAX payment terminals** with Odoo 18.0 Point of Sale via a
**local pywebdriver proxy** — designed for cloud-hosted Odoo where the
PAX terminal is only reachable on the store's local network.

|PAX payment method configuration|

How it works
------------

The module relays PAX terminal payments through a pywebdriver instance
running on the store PC:

::

Odoo POS (browser)
│ JSON-RPC silentCall
Odoo server (backend)
│ HTTP POST → /hw_proxy/pax/transaction_execute
pywebdriver (store PC, default port 8069)
│ HTTP GET (POS Link binary frame) → port 10009
PAX Terminal

Supported transactions:

================ ===========================
POS Link Command Description
================ ===========================
T00 DoSale Charge a card for a sale
T02 DoRefund Refund to a card
T04 DoVoid Void a previous transaction
================ ===========================

When to use this module
-----------------------

Use ``pos_payment_pax_terminal_pywebdriver`` when:

- Odoo is **cloud-hosted** and cannot reach the terminal's LAN IP
directly
- Chrome's **Local Network Access (LNA)** enforcement (v142+) blocks
direct browser-to-terminal calls

Use ``pos_payment_pax_terminal_redirect`` instead when Odoo is
on-premise and has direct TCP access to the terminal on port 10009.

.. |PAX payment method configuration| image:: https://raw.githubusercontent.com/OCA/pos/18.0/pos_payment_pax_terminal_pywebdriver/static/description/img/payment_method_pax.png

**Table of contents**

.. contents::
:local:

Installation
============

Prerequisites
-------------

- Odoo 18.0
- Python ``requests`` library (standard in Odoo installations)
- **pywebdriver** installed on the store PC with the PAX plugin enabled
- PAX terminal with **POS Link HTTP** mode enabled on the local network

Steps
-----

1. Install and start pywebdriver on the store PC. Ensure the PAX plugin
(``pax_driver.py``) is loaded and the terminal IP is reachable from
that PC.
2. Copy or clone the ``pos_payment_pax_terminal_pywebdriver`` directory
into your Odoo addons path (e.g. ``extra_addons/pos/``).
3. Restart the Odoo server to pick up the new module.
4. Go to **Apps**, search for **POS Payment PAX (pywebdriver)**, and
click **Install**.
5. Follow the `Configuration <CONFIGURATION.md>`__ guide to set up the
payment method.

pywebdriver setup
-----------------

|IoT / pywebdriver hardware proxy configuration|

The pywebdriver instance must expose the PAX endpoint at:

::

POST http://<store-pc-ip>:<port>/hw_proxy/pax/transaction_execute

The default pywebdriver port is **8069**. The PAX driver plugin must be
enabled in pywebdriver's configuration.

.. |IoT / pywebdriver hardware proxy configuration| image:: https://raw.githubusercontent.com/OCA/pos/18.0/pos_payment_pax_terminal_pywebdriver/static/description/img/iot_config.png

Usage
=====

Processing a payment
--------------------

1. Open a POS session that has the **PAX (pywebdriver)** payment method
enabled.
2. Add items to an order and proceed to the **Payment** screen.
3. Select the **PAX Terminal (pywebdriver)** payment method and enter
the amount.
4. The terminal prompts the customer to swipe, insert, or tap their
card.
5. Once the customer completes the interaction, the POS automatically
marks the payment as **Done** and the order can be finalised.

Refunds
-------

Refunds work through the standard Odoo POS return flow. When a return
order is paid using this payment method, the module sends a **Return
(T00 type 02)** command to the terminal via pywebdriver.

Fast Payments
-------------

When **Fast Payments** is enabled (default), the payment request is sent
to the terminal as soon as the cashier selects the payment method — no
manual "Send" click is needed. Disable it to let the cashier verify the
amount first.

Bug Tracker
===========

Bugs are tracked on `GitHub Issues <https://github.com/OCA/pos/issues>`_.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us to smash it by providing a detailed and welcomed
`feedback <https://github.com/OCA/pos/issues/new?body=module:%20pos_payment_pax_terminal_pywebdriver%0Aversion:%2018.0%0A%0A**Steps%20to%20reproduce**%0A-%20...%0A%0A**Current%20behavior**%0A%0A**Expected%20behavior**>`_.

Do not contact contributors directly about support or help with technical issues.

Credits
=======

Authors
-------

* Trobz

Contributors
------------

- `Trobz <https://www.trobz.com>`__

- Phan Hong Phuc <phucph@trobz.com>

Maintainers
-----------

This module is maintained by the OCA.

.. image:: https://odoo-community.org/logo.png
:alt: Odoo Community Association
:target: https://odoo-community.org

OCA, or the Odoo Community Association, is a nonprofit organization whose
mission is to support the collaborative development of Odoo features and
promote its widespread use.

This module is part of the `OCA/pos <https://github.com/OCA/pos/tree/18.0/pos_payment_pax_terminal_pywebdriver>`_ project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
1 change: 1 addition & 0 deletions pos_payment_pax_terminal_pywebdriver/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from . import models
20 changes: 20 additions & 0 deletions pos_payment_pax_terminal_pywebdriver/__manifest__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"name": "POS Payment PAX (pywebdriver)",
"version": "18.0.1.0.0",
"category": "Point Of Sale",
"summary": "Integrate PAX terminals with Odoo POS via a local pywebdriver proxy",
"author": "Odoo Community Association (OCA), Trobz",
"website": "https://github.com/OCA/pos",
"license": "LGPL-3",
"depends": ["point_of_sale"],
"data": [
"views/pos_payment_method_views.xml",
],
"assets": {
"point_of_sale._assets_pos": [
"pos_payment_pax_terminal_pywebdriver/static/src/app/**/*",
"pos_payment_pax_terminal_pywebdriver/static/src/overrides/**/*",
],
},
"installable": True,
}
119 changes: 119 additions & 0 deletions pos_payment_pax_terminal_pywebdriver/i18n/fr.po
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * pos_payment_pax_terminal_pywebdriver
#
msgid ""
msgstr ""
"Project-Id-Version: Odoo Server 18.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-07-21 00:00+0000\n"
"PO-Revision-Date: 2026-07-21 00:00+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_payment_pax_terminal_pywebdriver
#. odoo-javascript
#: code:addons/pos_payment_pax_terminal_pywebdriver/static/src/app/payment_pax.esm.js:0
msgid "Cannot process a transaction with a non-positive amount."
msgstr "Impossible de traiter une transaction avec un montant non positif."

#. module: pos_payment_pax_terminal_pywebdriver
#. odoo-javascript
#: code:addons/pos_payment_pax_terminal_pywebdriver/static/src/app/payment_pax.esm.js:0
msgid "No PAX terminal IP is configured for this payment method. Set the Terminal IP field in the payment method settings."
msgstr "Aucune adresse IP de terminal PAX n'est configurée pour ce mode de paiement. Renseignez le champ IP du terminal dans les paramètres du mode de paiement."

#. module: pos_payment_pax_terminal_pywebdriver
#. odoo-javascript
#: code:addons/pos_payment_pax_terminal_pywebdriver/static/src/app/payment_pax.esm.js:0
msgid "Network error contacting the Odoo server."
msgstr "Erreur réseau lors du contact avec le serveur Odoo."

#. module: pos_payment_pax_terminal_pywebdriver
#. odoo-javascript
#: code:addons/pos_payment_pax_terminal_pywebdriver/static/src/app/payment_pax.esm.js:0
msgid "PAX terminal declined: %(msg)s%(code)s"
msgstr "Terminal PAX refusé : %(msg)s%(code)s"

#. module: pos_payment_pax_terminal_pywebdriver
#. odoo-javascript
#: code:addons/pos_payment_pax_terminal_pywebdriver/static/src/app/payment_pax.esm.js:0
msgid "Unknown error from pywebdriver"
msgstr "Erreur inconnue de pywebdriver"

#. module: pos_payment_pax_terminal_pywebdriver
#. odoo-javascript
#: code:addons/pos_payment_pax_terminal_pywebdriver/static/src/app/payment_pax.esm.js:0
msgid "PAX Terminal Error"
msgstr "Erreur du terminal PAX"

#. module: pos_payment_pax_terminal_pywebdriver
#. odoo-javascript
#: code:addons/pos_payment_pax_terminal_pywebdriver/static/src/app/payment_pax.esm.js:0
msgid "OK"
msgstr "OK"

#. module: pos_payment_pax_terminal_pywebdriver
#. odoo-javascript
#: code:addons/pos_payment_pax_terminal_pywebdriver/static/src/app/payment_pax.esm.js:0
msgid "Payment declined"
msgstr "Paiement refusé"

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

#. module: pos_payment_pax_terminal_pywebdriver
#: model:ir.model.fields,field_description:pos_payment_pax_terminal_pywebdriver.field_pos_payment_method__pax_pw_terminal_ip
msgid "Terminal IP"
msgstr "IP du terminal"

#. module: pos_payment_pax_terminal_pywebdriver
#: model:ir.model.fields,field_description:pos_payment_pax_terminal_pywebdriver.field_pos_payment_method__pax_pw_terminal_port
msgid "Terminal Port"
msgstr "Port du terminal"

#. module: pos_payment_pax_terminal_pywebdriver
#: model:ir.model.fields,field_description:pos_payment_pax_terminal_pywebdriver.field_pos_payment_method__pax_pw_transaction_type
msgid "Default Transaction Type"
msgstr "Type de transaction par défaut"

#. module: pos_payment_pax_terminal_pywebdriver
#: model:ir.model.fields.selection,name:pos_payment_pax_terminal_pywebdriver.selection__pos_payment_method__pax_pw_transaction_type__01
msgid "Sale"
msgstr "Vente"

#. module: pos_payment_pax_terminal_pywebdriver
#: model:ir.model.fields.selection,name:pos_payment_pax_terminal_pywebdriver.selection__pos_payment_method__pax_pw_transaction_type__02
msgid "Return/Refund"
msgstr "Retour/Remboursement"

#. module: pos_payment_pax_terminal_pywebdriver
#: model:ir.model.fields.selection,name:pos_payment_pax_terminal_pywebdriver.selection__pos_payment_method__pax_pw_transaction_type__05
msgid "Auth Only"
msgstr "Autorisation uniquement"

#. module: pos_payment_pax_terminal_pywebdriver
#: model:ir.model.fields.selection,name:pos_payment_pax_terminal_pywebdriver.selection__pos_payment_method__pax_pw_transaction_type__06
msgid "Post-Auth"
msgstr "Post-autorisation"

#. module: pos_payment_pax_terminal_pywebdriver
#: model:ir.model.fields,field_description:pos_payment_pax_terminal_pywebdriver.field_pos_payment_method__pax_pw_timeout
msgid "Timeout (ms)"
msgstr "Délai d'attente (ms)"

#. module: pos_payment_pax_terminal_pywebdriver
#: model:ir.model.fields,field_description:pos_payment_pax_terminal_pywebdriver.field_pos_payment_method__pax_pw_use_https
msgid "Use HTTPS"
msgstr "Utiliser HTTPS"

#. module: pos_payment_pax_terminal_pywebdriver
#: model:ir.model.fields,field_description:pos_payment_pax_terminal_pywebdriver.field_pos_payment_method__pax_pw_fast_payments
msgid "Fast Payments"
msgstr "Paiements rapides"
Loading
Loading