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 | ecino | 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 + + + +
+ + + +Odoo Community Association + +
+

POS - Blind Session Closing

+ +

Beta License: AGPL-3 OCA/pos Translate me on Weblate Try me on Runboat

+

This module hides the expected amounts during POS session closing to +allow blind cash control.

+

Table of contents

+ +
+

Usage

+

To use this module and enable blind closing in the POS, follow these +steps:

+
    +
  1. Navigate to SettingsUsers & CompaniesUsers
  2. +
  3. Open the user who should be allowed to see the expected closing +amounts
  4. +
  5. In the Extra Rights tab, enable the group:
      +
    • Can see POS closing amounts
    • +
    +
  6. +
  7. Users with this group will be able to see the expected amounts +during the POS session closing.
  8. +
  9. Users without this group will perform a blind closing, +meaning:
      +
    • Expected cash amounts are hidden
    • +
    • Only counted amounts can be entered
    • +
    +
  10. +
+

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

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

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:

+

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/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 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --> -

Beta License: AGPL-3 OCA/pos Translate me on Weblate Try me on Runboat

+

Beta License: AGPL-3 OCA/pos Translate me on Weblate Try me on Runboat

This module hides the expected amounts during POS session closing to allow blind cash control.

Table of contents

@@ -424,7 +424,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.

@@ -442,6 +442,10 @@

Contributors

  • Bernat Obrador <bernat.obrador@nagarro.com>
  • +
  • Cloud Lotus: +
  • @@ -455,7 +459,7 @@

    Maintainers

    promote its widespread use.

    Current 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.

    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(), });