From 351febb96d983aae1f7056a153c652f3926d6c44 Mon Sep 17 00:00:00 2001
From: Roberto
Date: Tue, 23 Jun 2026 04:35:46 -0600
Subject: [PATCH 1/3] [MIG] POS - Blind Session Closing module to hide cash
control details during closing
---
README.md | 1 +
pos_blind_session_closing/README.rst | 122 +++++
pos_blind_session_closing/__init__.py | 0
pos_blind_session_closing/__manifest__.py | 23 +
pos_blind_session_closing/i18n/es_MX.po | 22 +
pos_blind_session_closing/i18n/it.po | 22 +
.../i18n/pos_blind_session_closing.pot | 19 +
pos_blind_session_closing/pyproject.toml | 3 +
.../readme/CONTRIBUTORS.md | 4 +
.../readme/DESCRIPTION.md | 1 +
pos_blind_session_closing/readme/USAGE.md | 19 +
.../security/security.xml | 7 +
.../static/description/icon.png | Bin 0 -> 9455 bytes
.../static/description/index.html | 465 ++++++++++++++++++
.../static/src/js/closing_popup.esm.js | 14 +
.../static/src/js/pos_store.esm.js | 16 +
.../static/src/xml/closing_popup.xml | 35 ++
.../pos_blind_session_closing_tour.esm.js | 90 ++++
pos_blind_session_closing/tests/__init__.py | 1 +
.../tests/test_pos_blind_session_closing.py | 51 ++
20 files changed, 915 insertions(+)
create mode 100644 pos_blind_session_closing/README.rst
create mode 100644 pos_blind_session_closing/__init__.py
create mode 100644 pos_blind_session_closing/__manifest__.py
create mode 100644 pos_blind_session_closing/i18n/es_MX.po
create mode 100644 pos_blind_session_closing/i18n/it.po
create mode 100644 pos_blind_session_closing/i18n/pos_blind_session_closing.pot
create mode 100644 pos_blind_session_closing/pyproject.toml
create mode 100644 pos_blind_session_closing/readme/CONTRIBUTORS.md
create mode 100644 pos_blind_session_closing/readme/DESCRIPTION.md
create mode 100644 pos_blind_session_closing/readme/USAGE.md
create mode 100644 pos_blind_session_closing/security/security.xml
create mode 100644 pos_blind_session_closing/static/description/icon.png
create mode 100644 pos_blind_session_closing/static/description/index.html
create mode 100644 pos_blind_session_closing/static/src/js/closing_popup.esm.js
create mode 100644 pos_blind_session_closing/static/src/js/pos_store.esm.js
create mode 100644 pos_blind_session_closing/static/src/xml/closing_popup.xml
create mode 100644 pos_blind_session_closing/static/tests/tours/pos_blind_session_closing_tour.esm.js
create mode 100644 pos_blind_session_closing/tests/__init__.py
create mode 100644 pos_blind_session_closing/tests/test_pos_blind_session_closing.py
diff --git a/README.md b/README.md
index 477288a0fc..0ebebcdf21 100644
--- a/README.md
+++ b/README.md
@@ -21,6 +21,7 @@ Available addons
----------------
addon | version | maintainers | summary
--- | --- | --- | ---
+[pos_blind_session_closing](pos_blind_session_closing/) | 19.0.1.0.0 | | POS Edit Order Line
[pos_edit_order_line](pos_edit_order_line/) | 19.0.1.0.0 | | POS Edit Order Line
[pos_partner_birthdate](pos_partner_birthdate/) | 19.0.1.0.0 |
| Adds the birthdate in the customer screen of POS
diff --git a/pos_blind_session_closing/README.rst b/pos_blind_session_closing/README.rst
new file mode 100644
index 0000000000..cf483fc1de
--- /dev/null
+++ b/pos_blind_session_closing/README.rst
@@ -0,0 +1,122 @@
+.. image:: https://odoo-community.org/readme-banner-image
+ :target: https://odoo-community.org/get-involved?utm_source=readme
+ :alt: Odoo Community Association
+
+===========================
+POS - Blind Session Closing
+===========================
+
+..
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !! This file is generated by oca-gen-addon-readme !!
+ !! changes will be overwritten. !!
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ !! source digest: sha256:2a7aca22c7b565d46f5420abf05aad0b86d93fead3916e79900b677759189ba6
+ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+.. |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/license-AGPL--3-blue.png
+ :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
+ :alt: License: AGPL-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_blind_session_closing
+ :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_blind_session_closing
+ :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|
+
+This module hides the expected amounts during POS session closing to
+allow blind cash control.
+
+**Table of contents**
+
+.. contents::
+ :local:
+
+Usage
+=====
+
+To use this module and enable blind closing in the POS, follow these
+steps:
+
+1. Navigate to **Settings** → **Users & Companies** → **Users**
+
+2. Open the user who should be allowed to see the expected closing
+ amounts
+
+3. In the **Extra Rights** tab, enable the group:
+
+ - **Can see POS closing amounts**
+
+4. Users **with this group** will be able to see the expected amounts
+ during the POS session closing.
+
+5. Users **without this group** will perform a **blind closing**,
+ meaning:
+
+ - Expected cash amounts are hidden
+ - Only counted amounts can be entered
+
+**Notes:**
+
+- This allows managers or supervisors to see the expected totals while
+ regular cashiers perform a blind cash count.
+- The feature applies to the **POS closing popup** when ending a
+ session.
+
+Bug Tracker
+===========
+
+Bugs are tracked on `GitHub 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 `_.
+
+Do not contact contributors directly about support or help with technical issues.
+
+Credits
+=======
+
+Authors
+-------
+
+* APSL-Nagarro
+
+Contributors
+------------
+
+- `APSL-Nagarro `__:
+
+ - Bernat Obrador
+
+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.
+
+.. |maintainer-BernatObrador| image:: https://github.com/BernatObrador.png?size=40px
+ :target: https://github.com/BernatObrador
+ :alt: BernatObrador
+
+Current `maintainer `__:
+
+|maintainer-BernatObrador|
+
+This module is part of the `OCA/pos `_ project on GitHub.
+
+You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/pos_blind_session_closing/__init__.py b/pos_blind_session_closing/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/pos_blind_session_closing/__manifest__.py b/pos_blind_session_closing/__manifest__.py
new file mode 100644
index 0000000000..a6d2b926e6
--- /dev/null
+++ b/pos_blind_session_closing/__manifest__.py
@@ -0,0 +1,23 @@
+{
+ "name": "POS - Blind Session Closing",
+ "version": "19.0.1.0.0",
+ "summary": "Hide cash control details in the closing popup",
+ "category": "Point of Sale",
+ "author": "APSL-Nagarro, Odoo Community Association (OCA)",
+ "website": "https://github.com/OCA/pos",
+ "license": "AGPL-3",
+ "maintainers": ["BernatObrador"],
+ "depends": ["point_of_sale"],
+ "data": [
+ "security/security.xml",
+ ],
+ "assets": {
+ "point_of_sale._assets_pos": [
+ "pos_blind_session_closing/static/src/**/*",
+ ],
+ "web.assets_tests": [
+ "pos_blind_session_closing/static/tests/tours/pos_blind_session_closing_tour.esm.js",
+ ],
+ },
+ "installable": True,
+}
diff --git a/pos_blind_session_closing/i18n/es_MX.po b/pos_blind_session_closing/i18n/es_MX.po
new file mode 100644
index 0000000000..d1c0dc6f43
--- /dev/null
+++ b/pos_blind_session_closing/i18n/es_MX.po
@@ -0,0 +1,22 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * pos_blind_session_closing
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 18.0\n"
+"Report-Msgid-Bugs-To: \n"
+"PO-Revision-Date: 2026-04-08 12:45+0000\n"
+"Last-Translator: roberto \n"
+"Language-Team: none\n"
+"Language: es_MX\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 5.15.2\n"
+
+#. module: pos_blind_session_closing
+#: model:res.groups,name:pos_blind_session_closing.group_pos_close_session_amounts
+msgid "Can see POS closing amounts"
+msgstr "Puede ver el monto de cierre del PDV"
diff --git a/pos_blind_session_closing/i18n/it.po b/pos_blind_session_closing/i18n/it.po
new file mode 100644
index 0000000000..f82d2afa77
--- /dev/null
+++ b/pos_blind_session_closing/i18n/it.po
@@ -0,0 +1,22 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * pos_blind_session_closing
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 18.0\n"
+"Report-Msgid-Bugs-To: \n"
+"PO-Revision-Date: 2026-04-08 12:45+0000\n"
+"Last-Translator: mymage \n"
+"Language-Team: none\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: nplurals=2; plural=n != 1;\n"
+"X-Generator: Weblate 5.15.2\n"
+
+#. module: pos_blind_session_closing
+#: model:res.groups,name:pos_blind_session_closing.group_pos_close_session_amounts
+msgid "Can see POS closing amounts"
+msgstr "Può vedere i valori di chiusura del POS"
diff --git a/pos_blind_session_closing/i18n/pos_blind_session_closing.pot b/pos_blind_session_closing/i18n/pos_blind_session_closing.pot
new file mode 100644
index 0000000000..38bad7a4bd
--- /dev/null
+++ b/pos_blind_session_closing/i18n/pos_blind_session_closing.pot
@@ -0,0 +1,19 @@
+# Translation of Odoo Server.
+# This file contains the translation of the following modules:
+# * pos_blind_session_closing
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Odoo Server 19.0\n"
+"Report-Msgid-Bugs-To: \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_blind_session_closing
+#: model:res.groups,name:pos_blind_session_closing.group_pos_close_session_amounts
+msgid "Can see POS closing amounts"
+msgstr ""
diff --git a/pos_blind_session_closing/pyproject.toml b/pos_blind_session_closing/pyproject.toml
new file mode 100644
index 0000000000..4231d0cccb
--- /dev/null
+++ b/pos_blind_session_closing/pyproject.toml
@@ -0,0 +1,3 @@
+[build-system]
+requires = ["whool"]
+build-backend = "whool.buildapi"
diff --git a/pos_blind_session_closing/readme/CONTRIBUTORS.md b/pos_blind_session_closing/readme/CONTRIBUTORS.md
new file mode 100644
index 0000000000..fec74215a9
--- /dev/null
+++ b/pos_blind_session_closing/readme/CONTRIBUTORS.md
@@ -0,0 +1,4 @@
+- [APSL-Nagarro](https://apsl.tech):
+ - Bernat Obrador \<\>
+- [Cloud Lotus](https://cloudlotus.net):
+ - Roberto Cifuentes \<\>
diff --git a/pos_blind_session_closing/readme/DESCRIPTION.md b/pos_blind_session_closing/readme/DESCRIPTION.md
new file mode 100644
index 0000000000..e7b7037abe
--- /dev/null
+++ b/pos_blind_session_closing/readme/DESCRIPTION.md
@@ -0,0 +1 @@
+This module hides the expected amounts during POS session closing to allow blind cash control.
\ No newline at end of file
diff --git a/pos_blind_session_closing/readme/USAGE.md b/pos_blind_session_closing/readme/USAGE.md
new file mode 100644
index 0000000000..f8225b5271
--- /dev/null
+++ b/pos_blind_session_closing/readme/USAGE.md
@@ -0,0 +1,19 @@
+To use this module and enable blind closing in the POS, follow these steps:
+
+1. Navigate to **Settings** → **Users & Companies** → **Users**
+
+2. Open the user who should be allowed to see the expected closing amounts
+
+3. In the **Extra Rights** tab, enable the group:
+ - **Can see POS closing amounts**
+
+4. Users **with this group** will be able to see the expected amounts during the POS session closing.
+
+5. Users **without this group** will perform a **blind closing**, meaning:
+ - Expected cash amounts are hidden
+ - Only counted amounts can be entered
+
+**Notes:**
+
+- This allows managers or supervisors to see the expected totals while regular cashiers perform a blind cash count.
+- The feature applies to the **POS closing popup** when ending a session.
diff --git a/pos_blind_session_closing/security/security.xml b/pos_blind_session_closing/security/security.xml
new file mode 100644
index 0000000000..e39fd7db87
--- /dev/null
+++ b/pos_blind_session_closing/security/security.xml
@@ -0,0 +1,7 @@
+
+
+
+ Can see POS closing amounts
+
+
+
diff --git a/pos_blind_session_closing/static/description/icon.png b/pos_blind_session_closing/static/description/icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d
GIT binary patch
literal 9455
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
z
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
Xviia!U7SGha1wx#SCgwmn*{w2TRX*I
literal 0
HcmV?d00001
diff --git a/pos_blind_session_closing/static/description/index.html b/pos_blind_session_closing/static/description/index.html
new file mode 100644
index 0000000000..5cbb133434
--- /dev/null
+++ b/pos_blind_session_closing/static/description/index.html
@@ -0,0 +1,465 @@
+
+
+
+
+
+README.rst
+
+
+
+
+
+
+
+
+
+
+
POS - Blind Session Closing
+
+

+
This module hides the expected amounts during POS session closing to
+allow blind cash control.
+
Table of contents
+
+
+
+
To use this module and enable blind closing in the POS, follow these
+steps:
+
+- Navigate to Settings → Users & Companies → Users
+- Open the user who should be allowed to see the expected closing
+amounts
+- In the Extra Rights tab, enable the group:
+- Can see POS closing amounts
+
+
+- Users with this group will be able to see the expected amounts
+during the POS session closing.
+- Users without this group will perform a blind closing,
+meaning:
+- Expected cash amounts are hidden
+- Only counted amounts can be entered
+
+
+
+
Notes:
+
+- This allows managers or supervisors to see the expected totals while
+regular cashiers perform a blind cash count.
+- The feature applies to the POS closing popup when ending a
+session.
+
+
+
+
+
Bugs are tracked on GitHub 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.
+
Do not contact contributors directly about support or help with technical issues.
+
+
+
+
+
+
+
+
This module is maintained by the OCA.
+
+
+
+
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.
+
Current maintainer:
+

+
This module is part of the OCA/pos project on GitHub.
+
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
+
+
+
+
+
+
diff --git a/pos_blind_session_closing/static/src/js/closing_popup.esm.js b/pos_blind_session_closing/static/src/js/closing_popup.esm.js
new file mode 100644
index 0000000000..d1d1e67512
--- /dev/null
+++ b/pos_blind_session_closing/static/src/js/closing_popup.esm.js
@@ -0,0 +1,14 @@
+/**
+ * Copyright 2026 Bernat Obrador APSL-Nagarro
+ * License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+ */
+
+import {ClosePosPopup} from "@point_of_sale/app/components/popups/closing_popup/closing_popup";
+import {patch} from "@web/core/utils/patch";
+
+patch(ClosePosPopup.prototype, {
+ setup() {
+ super.setup(...arguments);
+ this.canSeeClosingAmounts = this.pos.canSeeClosingAmounts;
+ },
+});
diff --git a/pos_blind_session_closing/static/src/js/pos_store.esm.js b/pos_blind_session_closing/static/src/js/pos_store.esm.js
new file mode 100644
index 0000000000..cb7cd533de
--- /dev/null
+++ b/pos_blind_session_closing/static/src/js/pos_store.esm.js
@@ -0,0 +1,16 @@
+/**
+ * Copyright 2026 Bernat Obrador APSL-Nagarro
+ * License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
+ */
+import {PosStore} from "@point_of_sale/app/services/pos_store";
+import {patch} from "@web/core/utils/patch";
+import {user} from "@web/core/user";
+
+patch(PosStore.prototype, {
+ async processServerData() {
+ await super.processServerData(...arguments);
+ this.canSeeClosingAmounts = await user.hasGroup(
+ "pos_blind_session_closing.group_pos_close_session_amounts"
+ );
+ },
+});
diff --git a/pos_blind_session_closing/static/src/xml/closing_popup.xml b/pos_blind_session_closing/static/src/xml/closing_popup.xml
new file mode 100644
index 0000000000..9ef12291b5
--- /dev/null
+++ b/pos_blind_session_closing/static/src/xml/closing_popup.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+ this.canSeeClosingAmounts
+
+
+
+ this.canSeeClosingAmounts
+
+
+
+ this.canSeeClosingAmounts
+
+
+
+ this.canSeeClosingAmounts
+
+
+
diff --git a/pos_blind_session_closing/static/tests/tours/pos_blind_session_closing_tour.esm.js b/pos_blind_session_closing/static/tests/tours/pos_blind_session_closing_tour.esm.js
new file mode 100644
index 0000000000..3dad0a0ee0
--- /dev/null
+++ b/pos_blind_session_closing/static/tests/tours/pos_blind_session_closing_tour.esm.js
@@ -0,0 +1,90 @@
+/* global document */
+import * as Chrome from "@point_of_sale/../tests/pos/tours/utils/chrome_util";
+import * as Dialog from "@point_of_sale/../tests/generic_helpers/dialog_util";
+
+import {registry} from "@web/core/registry";
+
+const CLOSE_POS_POPUP = ".close-pos-popup, .modal-dialog";
+const TOTAL_ORDERS = ".total-orders";
+const PAYMENT_METHODS_OVERVIEW = ".payment-methods-overview";
+
+const CLONE_BUTTON = "button.icon.fa.fa-clone.btn.btn-secondary";
+const SECONDARY_BUTTON = "button.button.icon.btn.btn-secondary";
+
+function openClosePosPopup() {
+ return [
+ Chrome.startPoS(),
+ Dialog.confirm("Open Register"),
+ Chrome.clickMenuOption("Close Register"),
+ {
+ trigger: CLOSE_POS_POPUP,
+ },
+ ];
+}
+
+registry
+ .category("web_tour.tours")
+ .add("pos_blind_session_closing_visible_for_manager", {
+ steps: () =>
+ [
+ ...openClosePosPopup(),
+
+ {
+ trigger: TOTAL_ORDERS,
+ },
+ {
+ trigger: PAYMENT_METHODS_OVERVIEW,
+ },
+ {
+ trigger: CLONE_BUTTON,
+ },
+ {
+ trigger: SECONDARY_BUTTON,
+ },
+ ].flat(),
+ });
+
+registry
+ .category("web_tour.tours")
+ .add("pos_blind_session_closing_hidden_for_cashier", {
+ steps: () =>
+ [
+ ...openClosePosPopup(),
+
+ {
+ trigger: CLOSE_POS_POPUP,
+ run: function () {
+ const root =
+ document.querySelector(CLOSE_POS_POPUP) || document;
+
+ const totalOrders = root.querySelector(TOTAL_ORDERS);
+ const paymentOverview = root.querySelector(
+ PAYMENT_METHODS_OVERVIEW
+ );
+ const cloneButton = root.querySelector(CLONE_BUTTON);
+ const secondaryButton = root.querySelector(SECONDARY_BUTTON);
+
+ if (totalOrders) {
+ throw new Error(
+ "The total orders section should be hidden for users without closing visibility rights."
+ );
+ }
+ if (paymentOverview) {
+ throw new Error(
+ "The payment methods overview should be hidden for users without closing visibility rights."
+ );
+ }
+ if (cloneButton) {
+ throw new Error(
+ "The clone/details button should be hidden for users without closing visibility rights."
+ );
+ }
+ if (secondaryButton) {
+ throw new Error(
+ "The secondary closing action button should be hidden for users without closing visibility rights."
+ );
+ }
+ },
+ },
+ ].flat(),
+ });
diff --git a/pos_blind_session_closing/tests/__init__.py b/pos_blind_session_closing/tests/__init__.py
new file mode 100644
index 0000000000..875253ee6d
--- /dev/null
+++ b/pos_blind_session_closing/tests/__init__.py
@@ -0,0 +1 @@
+from . import test_pos_blind_session_closing
diff --git a/pos_blind_session_closing/tests/test_pos_blind_session_closing.py b/pos_blind_session_closing/tests/test_pos_blind_session_closing.py
new file mode 100644
index 0000000000..c94d25b30b
--- /dev/null
+++ b/pos_blind_session_closing/tests/test_pos_blind_session_closing.py
@@ -0,0 +1,51 @@
+from odoo.tests import tagged
+
+from odoo.addons.point_of_sale.tests.test_frontend import TestPointOfSaleHttpCommon
+
+
+@tagged("post_install", "-at_install")
+class TestPosBlindClosing(TestPointOfSaleHttpCommon):
+ def _create_user(self, login, groups):
+ return (
+ self.env["res.users"]
+ .with_context(no_reset_password=True)
+ .create(
+ {
+ "name": login,
+ "login": login,
+ "email": f"{login}@example.com",
+ "group_ids": [(6, 0, groups)],
+ }
+ )
+ )
+
+ def test_blind_closing_hidden_for_cashier(self):
+ base_user = self.env.ref("base.group_user").id
+ pos_user_group = self.env.ref("point_of_sale.group_pos_user").id
+
+ user = self._create_user(
+ "pos_cashier_blind_closing_test",
+ [base_user, pos_user_group],
+ )
+
+ self.start_pos_tour(
+ "pos_blind_session_closing_hidden_for_cashier",
+ login=user.login,
+ )
+
+ def test_blind_closing_visible_for_authorized_user(self):
+ base_user = self.env.ref("base.group_user").id
+ pos_user_group = self.env.ref("point_of_sale.group_pos_user").id
+ can_see_closing_amounts = self.env.ref(
+ "pos_blind_session_closing.group_pos_close_session_amounts"
+ ).id
+
+ user = self._create_user(
+ "pos_manager_blind_closing_test",
+ [base_user, pos_user_group, can_see_closing_amounts],
+ )
+
+ self.start_pos_tour(
+ "pos_blind_session_closing_visible_for_manager",
+ login=user.login,
+ )
From f13606aba4d8e555cc11700f676e874079145a24 Mon Sep 17 00:00:00 2001
From: Roberto
Date: Tue, 23 Jun 2026 04:44:30 -0600
Subject: [PATCH 2/3] Update README and HTML documentation for POS - Blind
Session Closing module to reflect version 19.0, including badge links and
feedback URLs. Minor formatting adjustments in security.xml.
---
pos_blind_session_closing/README.rst | 14 +++++++++-----
pos_blind_session_closing/security/security.xml | 5 ++++-
.../static/description/index.html | 10 +++++++---
3 files changed, 20 insertions(+), 9 deletions(-)
diff --git a/pos_blind_session_closing/README.rst b/pos_blind_session_closing/README.rst
index cf483fc1de..59e3d6faac 100644
--- a/pos_blind_session_closing/README.rst
+++ b/pos_blind_session_closing/README.rst
@@ -21,13 +21,13 @@ POS - Blind Session Closing
:target: http://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-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_blind_session_closing
+ :target: https://github.com/OCA/pos/tree/19.0/pos_blind_session_closing
: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_blind_session_closing
+ :target: https://translation.odoo-community.org/projects/pos-19-0/pos-19-0-pos_blind_session_closing
: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
+ :target: https://runboat.odoo-community.org/builds?repo=OCA/pos&target_branch=19.0
:alt: Try me on Runboat
|badge1| |badge2| |badge3| |badge4| |badge5|
@@ -77,7 +77,7 @@ Bug Tracker
Bugs are tracked on `GitHub 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 `_.
+`feedback `_.
Do not contact contributors directly about support or help with technical issues.
@@ -96,6 +96,10 @@ Contributors
- Bernat Obrador
+- `Cloud Lotus `__:
+
+ - Roberto Cifuentes
+
Maintainers
-----------
@@ -117,6 +121,6 @@ Current `maintainer `__:
|maintainer-BernatObrador|
-This module is part of the `OCA/pos `_ project on GitHub.
+This module is part of the `OCA/pos `_ project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
diff --git a/pos_blind_session_closing/security/security.xml b/pos_blind_session_closing/security/security.xml
index e39fd7db87..87f995873c 100644
--- a/pos_blind_session_closing/security/security.xml
+++ b/pos_blind_session_closing/security/security.xml
@@ -2,6 +2,9 @@
Can see POS closing amounts
-
+
diff --git a/pos_blind_session_closing/static/description/index.html b/pos_blind_session_closing/static/description/index.html
index 5cbb133434..997d52513e 100644
--- a/pos_blind_session_closing/static/description/index.html
+++ b/pos_blind_session_closing/static/description/index.html
@@ -374,7 +374,7 @@ POS - Blind Session Closing
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!! source digest: sha256:2a7aca22c7b565d46f5420abf05aad0b86d93fead3916e79900b677759189ba6
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
-

+

This module hides the expected amounts during POS session closing to
allow blind cash control.
Table of contents
@@ -424,7 +424,7 @@
Bugs are tracked on GitHub 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.
+feedback.
Do not contact contributors directly about support or help with technical issues.
@@ -455,7 +459,7 @@
promote its widespread use.
Current maintainer:

-
This module is part of the OCA/pos project on GitHub.
+
This module is part of the OCA/pos project on GitHub.
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
From 25c5a1f3164a1698174212d3814432963de59bdc Mon Sep 17 00:00:00 2001
From: Roberto
Date: Tue, 23 Jun 2026 04:52:59 -0600
Subject: [PATCH 3/3] Add Chrome.endTour() calls to test tour script for POS -
Blind Session Closing module
---
.../static/tests/tours/pos_blind_session_closing_tour.esm.js | 2 ++
1 file changed, 2 insertions(+)
diff --git a/pos_blind_session_closing/static/tests/tours/pos_blind_session_closing_tour.esm.js b/pos_blind_session_closing/static/tests/tours/pos_blind_session_closing_tour.esm.js
index 3dad0a0ee0..e62ccb36bb 100644
--- a/pos_blind_session_closing/static/tests/tours/pos_blind_session_closing_tour.esm.js
+++ b/pos_blind_session_closing/static/tests/tours/pos_blind_session_closing_tour.esm.js
@@ -41,6 +41,7 @@ registry
{
trigger: SECONDARY_BUTTON,
},
+ Chrome.endTour(),
].flat(),
});
@@ -86,5 +87,6 @@ registry
}
},
},
+ Chrome.endTour(),
].flat(),
});