diff --git a/sale_product_identification_pos/README.rst b/sale_product_identification_pos/README.rst new file mode 100644 index 0000000000..e5b506ca9d --- /dev/null +++ b/sale_product_identification_pos/README.rst @@ -0,0 +1,147 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + +======================================= +Sale Product Identification Numbers Pos +======================================= + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:22a84d56fc0e509a813579268838fa0972e835f96492926b76512ea151a8bdf7 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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/19.0/sale_product_identification_pos + :alt: OCA/pos +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/pos-19-0/pos-19-0-sale_product_identification_pos + :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=19.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module allows you to validate IDs when confirming an order at the +point of sale. + +This module is based on sale_product_identification, so the contexts and +validations apply equally at the point of sale. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +Identification required at the point of sale +-------------------------------------------- + +1. Go to Point of Sale + +2. Open a session + +3. Add products that require identification; these are recognized by a + hazard symbol that appears next to the name. + + |PRODUCT_IDENTIFICATION_TITLE| + +4. If you do not select a partner and there are products in the order + with a required identification, the behavior depends on the + identification enforcement flag configured in General Settings / POS + configuration: + + - When enforcement is enabled, the POS blocks the sale and shows an + error that forces the cashier to select a customer before + continuing. + - When enforcement is disabled, the POS warns the cashier so the + order may proceedor may not continue after ID verification. + + |WITHOUT_PARTNER| + +5. If you select a partner and they do not meet the required + identification requirements, a message will be displayed with the + missing information. + + |IDENTIFICATION_MANDATORY| |DIALOG_IDENTIFICATION_MANDATORY| + +6. If the required IDs are validated correctly and optional IDs exist, a + window will be displayed for the user to validate if everything is + correct and if affirmative, the process continues normally. + +Offline behavior +~~~~~~~~~~~~~~~~ + +- If the browser detects that it is offline, the POS blocks sales for + products requiring identification whenever enforcement is enabled, + because validations cannot be confirmed against the server. + +- When enforcement is disabled and the POS temporarily loses connection + during validation, a warning dialog lists the affected products and + lets the cashier decide whether to continue without verification or + cancel. + + |IDENTIFICATION_NOT_MANDATORY| |DIALOG_IDENTIFICATION_NOT_MANDATORY| + +.. |PRODUCT_IDENTIFICATION_TITLE| image:: https://raw.githubusercontent.com/OCA/pos/19.0/sale_product_identification_pos/static/img/readme/PRODUCT_IDENTIFICATION_TITLE.png +.. |WITHOUT_PARTNER| image:: https://raw.githubusercontent.com/OCA/pos/19.0/sale_product_identification_pos/static/img/readme/WITHOUT_PARTNER.png +.. |IDENTIFICATION_MANDATORY| image:: https://raw.githubusercontent.com/OCA/pos/19.0/sale_product_identification_pos/static/img/readme/IDENTIFICATION_MANDATORY.png +.. |DIALOG_IDENTIFICATION_MANDATORY| image:: https://raw.githubusercontent.com/OCA/pos/19.0/sale_product_identification_pos/static/img/readme/DIALOG_IDENTIFICATION_MANDATORY.png +.. |IDENTIFICATION_NOT_MANDATORY| image:: https://raw.githubusercontent.com/OCA/pos/19.0/sale_product_identification_pos/static/img/readme/IDENTIFICATION_NOT_MANDATORY.png +.. |DIALOG_IDENTIFICATION_NOT_MANDATORY| image:: https://raw.githubusercontent.com/OCA/pos/19.0/sale_product_identification_pos/static/img/readme/DIALOG_IDENTIFICATION_NOT_MANDATORY.png + +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 +------- + +* Binhex + +Contributors +------------ + +- `Binhex `__: + + - Edilio Escalona Almira e.escalona@binhex.cloud + +- Ariel Barreiros (arielbarreiros96) + +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 `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/sale_product_identification_pos/__init__.py b/sale_product_identification_pos/__init__.py new file mode 100644 index 0000000000..0077c8866c --- /dev/null +++ b/sale_product_identification_pos/__init__.py @@ -0,0 +1,4 @@ +# Copyright 2025 Binhex +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import models diff --git a/sale_product_identification_pos/__manifest__.py b/sale_product_identification_pos/__manifest__.py new file mode 100644 index 0000000000..1fd286861a --- /dev/null +++ b/sale_product_identification_pos/__manifest__.py @@ -0,0 +1,23 @@ +# Copyright 2025 Binhex +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +{ + "name": "Sale Product Identification Numbers Pos", + "author": "Binhex,Odoo Community Association (OCA)", + "category": "Point Of Sale", + "website": "https://github.com/OCA/pos", + "version": "19.0.1.0.0", + "license": "AGPL-3", + "depends": ["point_of_sale", "sale_product_identification"], + "data": [ + "views/res_config_settings_views.xml", + ], + "assets": { + "point_of_sale._assets_pos": [ + "sale_product_identification_pos/static/src/**/*.esm.js", + "sale_product_identification_pos/static/src/**/*.xml", + ], + "web.assets_unit_tests": [ + "sale_product_identification_pos/static/tests/unit/**/*.js", + ], + }, +} diff --git a/sale_product_identification_pos/i18n/es.po b/sale_product_identification_pos/i18n/es.po new file mode 100644 index 0000000000..c2857b7fa9 --- /dev/null +++ b/sale_product_identification_pos/i18n/es.po @@ -0,0 +1,95 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sale_product_identification_pos +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-09-16 23:05+0000\n" +"PO-Revision-Date: 2025-09-16 23:05+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: sale_product_identification_pos +#. odoo-python +#: code:addons/sale_product_identification_pos/models/res_partner_id_number.py:0 +msgid "" +"%(message_head)s\n" +" %(identifications)s" +msgstr "" + +#. module: sale_product_identification_pos +#. odoo-javascript +#: code:addons/sale_product_identification_pos/static/src/app/store/pos_store.esm.js:0 +msgid "Cancel" +msgstr "Cancelar" + +#. module: sale_product_identification_pos +#. odoo-javascript +#: code:addons/sale_product_identification_pos/static/src/app/store/pos_store.esm.js:0 +msgid "Confirm" +msgstr "Confirmar" + +#. module: sale_product_identification_pos +#. odoo-javascript +#: code:addons/sale_product_identification_pos/static/src/app/store/pos_store.esm.js:0 +msgid "Identifications" +msgstr "Identificaciones" + +#. module: sale_product_identification_pos +#. odoo-javascript +#: code:addons/sale_product_identification_pos/static/src/app/models/pos_order_line.esm.js:0 +msgid "" +"Identifications:\n" +"%(categories)s" +msgstr "" +"Identificaciones:\n" +"%(categories)s" + +#. module: sale_product_identification_pos +#: model:ir.model,name:sale_product_identification_pos.model_res_partner_id_category +msgid "Partner ID Category" +msgstr "Categoría Empresa" + +#. module: sale_product_identification_pos +#: model:ir.model,name:sale_product_identification_pos.model_res_partner_id_number +msgid "Partner ID Number" +msgstr "Número empresa" + +#. module: sale_product_identification_pos +#: model:ir.model,name:sale_product_identification_pos.model_pos_session +msgid "Point of Sale Session" +msgstr "Sesión TPV" + +#. module: sale_product_identification_pos +#: model:ir.model,name:sale_product_identification_pos.model_product_template_id_category +msgid "Product Template Identification Category" +msgstr "" + +#. module: sale_product_identification_pos +#: model:ir.model,name:sale_product_identification_pos.model_product_product +msgid "Product Variant" +msgstr "Variante de producto" + +#. module: sale_product_identification_pos +#. odoo-python +#: code:addons/sale_product_identification_pos/models/res_partner_id_number.py:0 +msgid "" +"The following identifications are required to validate the order, please " +"verify." +msgstr "" +"Se requieren las siguientes identificaciones para validar el pedido. Por favor, verifique." + +#. module: sale_product_identification_pos +#. odoo-python +#: code:addons/sale_product_identification_pos/models/res_partner_id_number.py:0 +msgid "" +"The following identifications require verification, please validate before " +"continuing:" +msgstr "" +"Las siguientes identificaciones requieren verificación. Por favor, valide antes de continuar." diff --git a/sale_product_identification_pos/i18n/sale_product_identification_pos.pot b/sale_product_identification_pos/i18n/sale_product_identification_pos.pot new file mode 100644 index 0000000000..92686c2011 --- /dev/null +++ b/sale_product_identification_pos/i18n/sale_product_identification_pos.pot @@ -0,0 +1,95 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * sale_product_identification_pos +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-10-31 23:18+0000\n" +"PO-Revision-Date: 2025-10-31 23:18+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: sale_product_identification_pos +#. odoo-python +#: code:addons/sale_product_identification_pos/models/res_partner_id_number.py:0 +msgid "" +"%(message_head)s\n" +" %(identifications)s" +msgstr "" + +#. module: sale_product_identification_pos +#. odoo-javascript +#: code:addons/sale_product_identification_pos/static/src/app/store/pos_store.esm.js:0 +msgid "Cancel" +msgstr "Cancelar" + +#. module: sale_product_identification_pos +#. odoo-javascript +#: code:addons/sale_product_identification_pos/static/src/app/store/pos_store.esm.js:0 +msgid "Confirm" +msgstr "Confirmar" + +#. module: sale_product_identification_pos +#. odoo-javascript +#: code:addons/sale_product_identification_pos/static/src/app/store/pos_store.esm.js:0 +msgid "Identifications" +msgstr "Identificaciones" + +#. module: sale_product_identification_pos +#. odoo-javascript +#: code:addons/sale_product_identification_pos/static/src/app/models/pos_order_line.esm.js:0 +msgid "" +"Identifications:\n" +"%(categories)s" +msgstr "" +"Identificaciones:\n" +"%(categories)s" + +#. module: sale_product_identification_pos +#: model:ir.model,name:sale_product_identification_pos.model_res_partner_id_category +msgid "Partner ID Category" +msgstr "Categoría Empresa" + +#. module: sale_product_identification_pos +#: model:ir.model,name:sale_product_identification_pos.model_res_partner_id_number +msgid "Partner ID Number" +msgstr "Número empresa" + +#. module: sale_product_identification_pos +#: model:ir.model,name:sale_product_identification_pos.model_pos_session +msgid "Point of Sale Session" +msgstr "Sesión TPV" + +#. module: sale_product_identification_pos +#: model:ir.model,name:sale_product_identification_pos.model_product_template_id_category +msgid "Product Template Identification Category" +msgstr "" + +#. module: sale_product_identification_pos +#: model:ir.model,name:sale_product_identification_pos.model_product_product +msgid "Product Variant" +msgstr "Variante de producto" + +#. module: sale_product_identification_pos +#. odoo-python +#: code:addons/sale_product_identification_pos/models/res_partner_id_number.py:0 +msgid "" +"The following identifications are required to validate the order, please " +"verify." +msgstr "" +"Se requieren las siguientes identificaciones para validar el pedido. Por favor, verifique." + +#. module: sale_product_identification_pos +#. odoo-python +#: code:addons/sale_product_identification_pos/models/res_partner_id_number.py:0 +msgid "" +"The following identifications require verification, please validate before " +"continuing:" +msgstr "" +"Las siguientes identificaciones requieren verificación. Por favor, valide antes de continuar." diff --git a/sale_product_identification_pos/models/__init__.py b/sale_product_identification_pos/models/__init__.py new file mode 100644 index 0000000000..f34f5d2b8e --- /dev/null +++ b/sale_product_identification_pos/models/__init__.py @@ -0,0 +1,9 @@ +# Copyright 2025 Binhex +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import product_product +from . import pos_session +from . import product_template_id_category +from . import res_partner_id_category +from . import res_partner_id_number +from . import res_config_settings diff --git a/sale_product_identification_pos/models/pos_session.py b/sale_product_identification_pos/models/pos_session.py new file mode 100644 index 0000000000..bdb6a75776 --- /dev/null +++ b/sale_product_identification_pos/models/pos_session.py @@ -0,0 +1,39 @@ +"""Extend POS session payload for identification enforcement.""" + +# Copyright 2025 Binhex +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models +from odoo.tools import str2bool + + +class PosSession(models.Model): + _inherit = "pos.session" + + enforce_partner_identification = fields.Boolean( + compute="_compute_enforce_partner_identification", + readonly=True, + ) + + def _compute_enforce_partner_identification(self): + icp = self.env["ir.config_parameter"].sudo() + param_value = icp.get_param( + "sale_product_identification_pos.enforce_partner_identification", + default="False", + ) + enforce_identification = bool(str2bool(str(param_value))) + for session in self: + session.enforce_partner_identification = enforce_identification + + @api.model + def _load_pos_data_models(self, config_id): + models = super()._load_pos_data_models(config_id) + models += ["res.partner.id_category", "product.template.id_category"] + return models + + @api.model + def _load_pos_data_fields(self, config_id): + fields_list = super()._load_pos_data_fields(config_id) + if "enforce_partner_identification" not in fields_list: + fields_list.append("enforce_partner_identification") + return fields_list diff --git a/sale_product_identification_pos/models/product_product.py b/sale_product_identification_pos/models/product_product.py new file mode 100644 index 0000000000..6306d297b0 --- /dev/null +++ b/sale_product_identification_pos/models/product_product.py @@ -0,0 +1,15 @@ +# Copyright 2025 Binhex +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + + +from odoo import api, models + + +class ProductProduct(models.Model): + _inherit = "product.product" + + @api.model + def _load_pos_data_fields(self, config_id): + fields = super()._load_pos_data_fields(config_id) + fields += ["product_tmpl_category_ids", "required_identification"] + return fields diff --git a/sale_product_identification_pos/models/product_template_id_category.py b/sale_product_identification_pos/models/product_template_id_category.py new file mode 100644 index 0000000000..b30b19592e --- /dev/null +++ b/sale_product_identification_pos/models/product_template_id_category.py @@ -0,0 +1,14 @@ +# Copyright 2025 Binhex +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + + +from odoo import api, models + + +class ProductTemplateIdcategory(models.Model): + _name = "product.template.id_category" + _inherit = ["product.template.id_category", "pos.load.mixin"] + + @api.model + def _load_pos_data_fields(self, config): + return ["id", "category_id", "is_mandatory", "message"] diff --git a/sale_product_identification_pos/models/res_config_settings.py b/sale_product_identification_pos/models/res_config_settings.py new file mode 100644 index 0000000000..9292cbf2df --- /dev/null +++ b/sale_product_identification_pos/models/res_config_settings.py @@ -0,0 +1,18 @@ +# Copyright 2025 Binhex +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class ResConfigSettings(models.TransientModel): + _inherit = "res.config.settings" + + enforce_pos_partner_identification = fields.Boolean( + string="Enforce customer identification in POS", + config_parameter="sale_product_identification_pos.enforce_partner_identification", + help=( + "When enabled, POS payments always require system-backed " + "customer identification checks, even without a customer " + "selected on the order." + ), + ) diff --git a/sale_product_identification_pos/models/res_partner_id_category.py b/sale_product_identification_pos/models/res_partner_id_category.py new file mode 100644 index 0000000000..13efdda363 --- /dev/null +++ b/sale_product_identification_pos/models/res_partner_id_category.py @@ -0,0 +1,14 @@ +# Copyright 2025 Binhex +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + + +from odoo import api, models + + +class ResPartnerIdcategory(models.Model): + _name = "res.partner.id_category" + _inherit = ["res.partner.id_category", "pos.load.mixin"] + + @api.model + def _load_pos_data_fields(self, config): + return ["id", "code", "name"] diff --git a/sale_product_identification_pos/models/res_partner_id_number.py b/sale_product_identification_pos/models/res_partner_id_number.py new file mode 100644 index 0000000000..bbd4485d41 --- /dev/null +++ b/sale_product_identification_pos/models/res_partner_id_number.py @@ -0,0 +1,89 @@ +# Copyright 2025 Binhex +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + + +from odoo import models +from odoo.exceptions import ValidationError + + +class ResPartnerIdNumber(models.Model): + _inherit = "res.partner.id_number" + + def validate_identification_pos(self, **params): + identification_ids = self.env["res.partner.id_category"].browse( + params.get("identification_ids", []) + ) + product_ids = self.env["product.product"].browse(params.get("product_ids", [])) + product_templates = product_ids.mapped("product_tmpl_id") + partner = self.env["res.partner"].browse(params.get("partner_id")) + order_stub = ( + self.env["sale.order"] + .with_context(check_company=False) + .new({"partner_id": partner.id or False}) + ) + if product_templates: + try: + product_templates._eval_expression_identification(order_stub) + except ValidationError as error: + return { + "message": error.args[0], + "mandatory": True, + } + params.update( + { + "compare_identification_ids": identification_ids, + "product_template_ids": product_templates, + } + ) + has_partner = bool(params.get("partner_id")) + requested_mandatory = bool(params.get("mandatory", False)) + enforce_identification = params.get("enforce_partner_identification") + if enforce_identification is None: + enforce_identification = bool( + self.env["ir.config_parameter"] + .sudo() + .get_param( + "sale_product_identification_pos.enforce_partner_identification" + ) + ) + is_blocking = bool( + requested_mandatory and (has_partner or enforce_identification) + ) + if has_partner and requested_mandatory: + identifications = self.validate_identification(**params) + else: + identifications = identification_ids + if identifications: + message_head = self.env._( + "The following identifications are required to " + "validate the order, please verify." + ) + if not is_blocking: + message_head = self.env._( + "The following identifications require verification," + " please validate before continuing:" + ) + try: + message_body = self.message_error_identifications( + product_ids.mapped("product_tmpl_id").filtered( + lambda x: x.required_identification + and x.product_tmpl_category_ids + ), + identifications.ids, + required=params.get("mandatory", False), + ) + except ValidationError as error: + return { + "message": error.args[0], + "mandatory": True, + } + message = self.env._( + "%(message_head)s\n %(identifications)s", + message_head=message_head, + identifications=message_body, + ) + return { + "message": message, + "mandatory": is_blocking, + } + return True diff --git a/sale_product_identification_pos/pyproject.toml b/sale_product_identification_pos/pyproject.toml new file mode 100644 index 0000000000..4231d0cccb --- /dev/null +++ b/sale_product_identification_pos/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/sale_product_identification_pos/readme/CONTRIBUTORS.md b/sale_product_identification_pos/readme/CONTRIBUTORS.md new file mode 100644 index 0000000000..491ba1c06a --- /dev/null +++ b/sale_product_identification_pos/readme/CONTRIBUTORS.md @@ -0,0 +1,3 @@ +- [Binhex](https://www.binhex.cloud/): + - Edilio Escalona Almira +- Ariel Barreiros (arielbarreiros96) \ No newline at end of file diff --git a/sale_product_identification_pos/readme/DESCRIPTION.md b/sale_product_identification_pos/readme/DESCRIPTION.md new file mode 100644 index 0000000000..d23ab8eac2 --- /dev/null +++ b/sale_product_identification_pos/readme/DESCRIPTION.md @@ -0,0 +1,3 @@ +This module allows you to validate IDs when confirming an order at the point of sale. + +This module is based on sale_product_identification, so the contexts and validations apply equally at the point of sale. diff --git a/sale_product_identification_pos/readme/USAGE.md b/sale_product_identification_pos/readme/USAGE.md new file mode 100644 index 0000000000..cc11a73bda --- /dev/null +++ b/sale_product_identification_pos/readme/USAGE.md @@ -0,0 +1,37 @@ +Identification required at the point of sale +--------------------------------------- + +1. Go to Point of Sale +2. Open a session +3. Add products that require identification; these are recognized by a hazard symbol that appears next to the name. + + ![PRODUCT_IDENTIFICATION_TITLE](../static/img/readme/PRODUCT_IDENTIFICATION_TITLE.png) + +4. If you do not select a partner and there are products in the order with a required identification, the behavior + depends on the identification enforcement flag configured in General Settings / POS configuration: + + - When enforcement is enabled, the POS blocks the sale and shows an error that forces the cashier to select a + customer before continuing. + - When enforcement is disabled, the POS warns the cashier so the order may proceedor may not continue after ID verification. + + ![WITHOUT_PARTNER](../static/img/readme/WITHOUT_PARTNER.png) + +5. If you select a partner and they do not meet the required identification requirements, + a message will be displayed with the missing information. + + ![IDENTIFICATION_MANDATORY](../static/img/readme/IDENTIFICATION_MANDATORY.png) + ![DIALOG_IDENTIFICATION_MANDATORY](../static/img/readme/DIALOG_IDENTIFICATION_MANDATORY.png) + +6. If the required IDs are validated correctly and optional IDs exist, + a window will be displayed for the user to validate if everything is correct and if affirmative, + the process continues normally. + +### Offline behavior + +- If the browser detects that it is offline, the POS blocks sales for products requiring identification whenever + enforcement is enabled, because validations cannot be confirmed against the server. +- When enforcement is disabled and the POS temporarily loses connection during validation, a warning dialog lists the + affected products and lets the cashier decide whether to continue without verification or cancel. + + ![IDENTIFICATION_NOT_MANDATORY](../static/img/readme/IDENTIFICATION_NOT_MANDATORY.png) + ![DIALOG_IDENTIFICATION_NOT_MANDATORY](../static/img/readme/DIALOG_IDENTIFICATION_NOT_MANDATORY.png) diff --git a/sale_product_identification_pos/static/description/icon.png b/sale_product_identification_pos/static/description/icon.png new file mode 100644 index 0000000000..3a0328b516 Binary files /dev/null and b/sale_product_identification_pos/static/description/icon.png differ diff --git a/sale_product_identification_pos/static/description/index.html b/sale_product_identification_pos/static/description/index.html new file mode 100644 index 0000000000..13be867d50 --- /dev/null +++ b/sale_product_identification_pos/static/description/index.html @@ -0,0 +1,496 @@ + + + + + +README.rst + + + +
+ + + +Odoo Community Association + +
+

Sale Product Identification Numbers Pos

+ +

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

+

This module allows you to validate IDs when confirming an order at the +point of sale.

+

This module is based on sale_product_identification, so the contexts and +validations apply equally at the point of sale.

+

Table of contents

+ +
+

Usage

+
+

Identification required at the point of sale

+
    +
  1. Go to Point of Sale

    +
  2. +
  3. Open a session

    +
  4. +
  5. Add products that require identification; these are recognized by a +hazard symbol that appears next to the name.

    +

    PRODUCT_IDENTIFICATION_TITLE

    +
  6. +
  7. If you do not select a partner and there are products in the order +with a required identification, the behavior depends on the +identification enforcement flag configured in General Settings / POS +configuration:

    +
      +
    • When enforcement is enabled, the POS blocks the sale and shows an +error that forces the cashier to select a customer before +continuing.
    • +
    • When enforcement is disabled, the POS warns the cashier so the +order may proceedor may not continue after ID verification.
    • +
    +

    WITHOUT_PARTNER

    +
  8. +
  9. If you select a partner and they do not meet the required +identification requirements, a message will be displayed with the +missing information.

    +

    IDENTIFICATION_MANDATORY DIALOG_IDENTIFICATION_MANDATORY

    +
  10. +
  11. If the required IDs are validated correctly and optional IDs exist, a +window will be displayed for the user to validate if everything is +correct and if affirmative, the process continues normally.

    +
  12. +
+
+

Offline behavior

+
    +
  • If the browser detects that it is offline, the POS blocks sales for +products requiring identification whenever enforcement is enabled, +because validations cannot be confirmed against the server.

    +
  • +
  • When enforcement is disabled and the POS temporarily loses connection +during validation, a warning dialog lists the affected products and +lets the cashier decide whether to continue without verification or +cancel.

    +

    IDENTIFICATION_NOT_MANDATORY DIALOG_IDENTIFICATION_NOT_MANDATORY

    +
  • +
+
+
+
+
+

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

+
    +
  • Binhex
  • +
+
+
+

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.

+

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/sale_product_identification_pos/static/img/readme/DIALOG_IDENTIFICATION_MANDATORY.png b/sale_product_identification_pos/static/img/readme/DIALOG_IDENTIFICATION_MANDATORY.png new file mode 100644 index 0000000000..20bf769d31 Binary files /dev/null and b/sale_product_identification_pos/static/img/readme/DIALOG_IDENTIFICATION_MANDATORY.png differ diff --git a/sale_product_identification_pos/static/img/readme/DIALOG_IDENTIFICATION_NOT_MANDATORY.png b/sale_product_identification_pos/static/img/readme/DIALOG_IDENTIFICATION_NOT_MANDATORY.png new file mode 100644 index 0000000000..3dcca6e5fd Binary files /dev/null and b/sale_product_identification_pos/static/img/readme/DIALOG_IDENTIFICATION_NOT_MANDATORY.png differ diff --git a/sale_product_identification_pos/static/img/readme/IDENTIFICATION_MANDATORY.png b/sale_product_identification_pos/static/img/readme/IDENTIFICATION_MANDATORY.png new file mode 100644 index 0000000000..fbced9d6b0 Binary files /dev/null and b/sale_product_identification_pos/static/img/readme/IDENTIFICATION_MANDATORY.png differ diff --git a/sale_product_identification_pos/static/img/readme/IDENTIFICATION_NOT_MANDATORY.png b/sale_product_identification_pos/static/img/readme/IDENTIFICATION_NOT_MANDATORY.png new file mode 100644 index 0000000000..b23f621a4b Binary files /dev/null and b/sale_product_identification_pos/static/img/readme/IDENTIFICATION_NOT_MANDATORY.png differ diff --git a/sale_product_identification_pos/static/img/readme/PRODUCT_IDENTIFICATION_TITLE.png b/sale_product_identification_pos/static/img/readme/PRODUCT_IDENTIFICATION_TITLE.png new file mode 100644 index 0000000000..67c0fd0a6e Binary files /dev/null and b/sale_product_identification_pos/static/img/readme/PRODUCT_IDENTIFICATION_TITLE.png differ diff --git a/sale_product_identification_pos/static/img/readme/REQUIRED_IDENTIFICATION.png b/sale_product_identification_pos/static/img/readme/REQUIRED_IDENTIFICATION.png new file mode 100644 index 0000000000..b709fa3579 Binary files /dev/null and b/sale_product_identification_pos/static/img/readme/REQUIRED_IDENTIFICATION.png differ diff --git a/sale_product_identification_pos/static/img/readme/WITHOUT_PARTNER.png b/sale_product_identification_pos/static/img/readme/WITHOUT_PARTNER.png new file mode 100644 index 0000000000..add5965389 Binary files /dev/null and b/sale_product_identification_pos/static/img/readme/WITHOUT_PARTNER.png differ diff --git a/sale_product_identification_pos/static/src/app/generic_components/orderline/orderline.xml b/sale_product_identification_pos/static/src/app/generic_components/orderline/orderline.xml new file mode 100644 index 0000000000..0acddf9c49 --- /dev/null +++ b/sale_product_identification_pos/static/src/app/generic_components/orderline/orderline.xml @@ -0,0 +1,17 @@ + + + + +