From 9d8f86ac14c47fe2db2d87ee1bb7fec4f967b935 Mon Sep 17 00:00:00 2001 From: Pierre Verkest Date: Wed, 30 Mar 2022 02:37:40 +0200 Subject: [PATCH 01/15] [ADD] pos_customer_required_fields Ensure desired fields are collect on customer Pos Order --- pos_customer_required_fields/README.rst | 118 +++++ pos_customer_required_fields/__init__.py | 4 + pos_customer_required_fields/__manifest__.py | 27 + pos_customer_required_fields/i18n/fr.po | 65 +++ .../i18n/pos_customer_required_fields.pot | 61 +++ .../models/__init__.py | 5 + .../models/pos_config.py | 30 ++ .../models/res_partner.py | 27 + .../readme/CONFIGURE.rst | 8 + .../readme/CONTRIBUTORS.rst | 3 + .../readme/DESCRIPTION.rst | 7 + pos_customer_required_fields/readme/USAGE.rst | 13 + .../static/description/icon.png | Bin 0 -> 22874 bytes .../static/description/index.html | 462 ++++++++++++++++++ .../pos_customer_missing_fields.png | Bin 0 -> 17921 bytes .../static/description/pos_edit_customer.png | Bin 0 -> 47934 bytes .../static/src/css/pos.css | 10 + .../static/src/js/screens.js | 56 +++ .../static/src/xml/pos.xml | 15 + .../templates/assets.xml | 11 + .../tests/__init__.py | 4 + .../tests/test_res_partner.py | 110 +++++ .../views/view_pos_config.xml | 41 ++ 23 files changed, 1077 insertions(+) create mode 100644 pos_customer_required_fields/README.rst create mode 100644 pos_customer_required_fields/__init__.py create mode 100644 pos_customer_required_fields/__manifest__.py create mode 100644 pos_customer_required_fields/i18n/fr.po create mode 100644 pos_customer_required_fields/i18n/pos_customer_required_fields.pot create mode 100644 pos_customer_required_fields/models/__init__.py create mode 100644 pos_customer_required_fields/models/pos_config.py create mode 100644 pos_customer_required_fields/models/res_partner.py create mode 100644 pos_customer_required_fields/readme/CONFIGURE.rst create mode 100644 pos_customer_required_fields/readme/CONTRIBUTORS.rst create mode 100644 pos_customer_required_fields/readme/DESCRIPTION.rst create mode 100644 pos_customer_required_fields/readme/USAGE.rst create mode 100644 pos_customer_required_fields/static/description/icon.png create mode 100644 pos_customer_required_fields/static/description/index.html create mode 100644 pos_customer_required_fields/static/description/pos_customer_missing_fields.png create mode 100644 pos_customer_required_fields/static/description/pos_edit_customer.png create mode 100644 pos_customer_required_fields/static/src/css/pos.css create mode 100644 pos_customer_required_fields/static/src/js/screens.js create mode 100644 pos_customer_required_fields/static/src/xml/pos.xml create mode 100644 pos_customer_required_fields/templates/assets.xml create mode 100644 pos_customer_required_fields/tests/__init__.py create mode 100644 pos_customer_required_fields/tests/test_res_partner.py create mode 100644 pos_customer_required_fields/views/view_pos_config.xml diff --git a/pos_customer_required_fields/README.rst b/pos_customer_required_fields/README.rst new file mode 100644 index 0000000000..8707ef6d5d --- /dev/null +++ b/pos_customer_required_fields/README.rst @@ -0,0 +1,118 @@ +======================================== +Point Of Sale - Customer required fields +======================================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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-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/12.0/pos_customer_required_fields + :alt: OCA/pos +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/pos-12-0/pos-12-0-pos_customer_required_fields + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/184/12.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module enforce users to properly define customer fields +created from point of sale or used in pos order. + +From PoS config you will be able to define required fields. + +Using this module without `pos_customer_required` module you are +still able to create PoS order without customer. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +To define customer required field on PoS UI: + +#. Go to any PoS configuration *Point of Sale > Configuration > Point of Sale*. +#. Edit Partner required fields. + +.. warning:: + + Make sure to choose only `res.partner`'s fields present on the PoS UI. + +Usage +===== + +To create or edit partner from PoS + +#. Open PoS session +#. Click on client button +#. required filed are highlight (in green) + +.. figure:: https://raw.githubusercontent.com/OCA/pos/12.0/pos_customer_required_fields/static/description/pos_edit_customer.png + +If you choose an existing partner with missing informations +while validating the payment you will be ask to collect missing +customer informations. + +.. figure:: https://raw.githubusercontent.com/OCA/pos/12.0/pos_customer_required_fields/static/description/pos_customer_missing_fields.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 smashing it by providing a detailed and welcomed +`feedback `_. + +Do not contact contributors directly about support or help with technical issues. + +Credits +======= + +Authors +~~~~~~~ + +* Pierre Verkest + +Contributors +~~~~~~~~~~~~ + + `Moka Tourisme `_ + + * Pierre Verkest + +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-petrus-v| image:: https://github.com/petrus-v.png?size=40px + :target: https://github.com/petrus-v + :alt: petrus-v + +Current `maintainer `__: + +|maintainer-petrus-v| + +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_customer_required_fields/__init__.py b/pos_customer_required_fields/__init__.py new file mode 100644 index 0000000000..3eeeaef1c2 --- /dev/null +++ b/pos_customer_required_fields/__init__.py @@ -0,0 +1,4 @@ +# Copyright 2022 Moka Tourisme (https://www.mokatourisme.fr). +# @author Pierre Verkest +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from . import models diff --git a/pos_customer_required_fields/__manifest__.py b/pos_customer_required_fields/__manifest__.py new file mode 100644 index 0000000000..33f31b69eb --- /dev/null +++ b/pos_customer_required_fields/__manifest__.py @@ -0,0 +1,27 @@ +# Copyright 2022 Moka Tourisme (https://www.mokatourisme.fr). +# @author Pierre Verkest +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +{ + "name": "Point Of Sale - Customer required fields", + "summary": "Define customer required field used in PoS order.", + "version": "12.0.1.0.0", + "category": "Point of Sale", + "author": "Pierre Verkest, Odoo Community Association (OCA)", + "website": "https://github.com/OCA/pos", + "license": "AGPL-3", + "maintainers": [ + "petrus-v", + ], + "depends": [ + "point_of_sale", + ], + "data": [ + "templates/assets.xml", + "views/view_pos_config.xml", + ], + "qweb": [ + "static/src/xml/pos.xml", + ], + "demo": [], + "installable": True, +} diff --git a/pos_customer_required_fields/i18n/fr.po b/pos_customer_required_fields/i18n/fr.po new file mode 100644 index 0000000000..c7ccba511d --- /dev/null +++ b/pos_customer_required_fields/i18n/fr.po @@ -0,0 +1,65 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * pos_customer_required_fields +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.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_customer_required_fields +#: model:ir.model,name:pos_customer_required_fields.model_res_partner +msgid "Contact" +msgstr "Contact" + +#. module: pos_customer_required_fields +#: code:addons/pos_customer_required_fields/models/res_partner.py:24 +#, python-format +msgid "Following required field(s) is/are not set: %s." +msgstr "Le(s) champ(s) requis suivant n'est/ne sont pas renseigné(s) : %s." + +#. module: pos_customer_required_fields +#: model:ir.model.fields,help:pos_customer_required_fields.field_pos_config__res_partner_required_fields_ids +msgid "List of fields that are required while creating or updating a res partner from the point of sale." +msgstr "" +"Champs obligatoire lors de la création/modification d'un contact depuis " +"le point de vente (choisir uniquement parmis les champs disponible dans l'interface)." + +#. module: pos_customer_required_fields +#: model:ir.model.fields,field_description:pos_customer_required_fields.field_pos_config__res_partner_required_fields_ids +msgid "Partner required fields" +msgstr "Contact (client): champs requis" + +#. module: pos_customer_required_fields +#: model:ir.model.fields,field_description:pos_customer_required_fields.field_pos_config__res_partner_required_fields_names +msgid "Partner required fields name" +msgstr "Nom technique des champs requis" + +#. module: pos_customer_required_fields +#: model:ir.model,name:pos_customer_required_fields.model_pos_config +msgid "Point of Sale Configuration" +msgstr "Paramètrage du point de vente" + +#. module: pos_customer_required_fields +#: model:ir.model.fields,help:pos_customer_required_fields.field_pos_config__res_partner_required_fields_names +msgid "Technical fields to avoid adding ir.model.fields in pos model" +msgstr "Champ technique utilisé dans l'interface du point de vente" + +#. module: pos_customer_required_fields +#: model_terms:ir.ui.view,arch_db:pos_customer_required_fields.pos_config_view_form +msgid "This ensure following fields are set in partner while\n" +" creating from the pos order.\n" +"\n" +" Also if user pick an existing partner created in the\n" +" backend without that field, user will be prompt to\n" +" add that information." +msgstr "" +"Permet de verifier que l'ensemble des champs suivant sont définis " +"sur les clients des commandes de point de vente ainsi qu'à l'édition " +"ou création des clients depuis le point de vente." diff --git a/pos_customer_required_fields/i18n/pos_customer_required_fields.pot b/pos_customer_required_fields/i18n/pos_customer_required_fields.pot new file mode 100644 index 0000000000..f8105825c2 --- /dev/null +++ b/pos_customer_required_fields/i18n/pos_customer_required_fields.pot @@ -0,0 +1,61 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * pos_customer_required_fields +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 12.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_customer_required_fields +#: model:ir.model,name:pos_customer_required_fields.model_res_partner +msgid "Contact" +msgstr "" + +#. module: pos_customer_required_fields +#: code:addons/pos_customer_required_fields/models/res_partner.py:24 +#, python-format +msgid "Following required field(s) is/are not set: %s." +msgstr "" + +#. module: pos_customer_required_fields +#: model:ir.model.fields,help:pos_customer_required_fields.field_pos_config__res_partner_required_fields_ids +msgid "List of fields that are required while creating or updating a res partner from the point of sale." +msgstr "" + +#. module: pos_customer_required_fields +#: model:ir.model.fields,field_description:pos_customer_required_fields.field_pos_config__res_partner_required_fields_ids +msgid "Partner required fields" +msgstr "" + +#. module: pos_customer_required_fields +#: model:ir.model.fields,field_description:pos_customer_required_fields.field_pos_config__res_partner_required_fields_names +msgid "Partner required fields name" +msgstr "" + +#. module: pos_customer_required_fields +#: model:ir.model,name:pos_customer_required_fields.model_pos_config +msgid "Point of Sale Configuration" +msgstr "" + +#. module: pos_customer_required_fields +#: model:ir.model.fields,help:pos_customer_required_fields.field_pos_config__res_partner_required_fields_names +msgid "Technical fields to avoid adding ir.model.fields in pos model" +msgstr "" + +#. module: pos_customer_required_fields +#: model_terms:ir.ui.view,arch_db:pos_customer_required_fields.pos_config_view_form +msgid "This ensure following fields are set in partner while\n" +" creating from the pos order.\n" +"\n" +" Also if user pick an existing partner created in the\n" +" backend without that field, user will be prompt to\n" +" add that information." +msgstr "" + diff --git a/pos_customer_required_fields/models/__init__.py b/pos_customer_required_fields/models/__init__.py new file mode 100644 index 0000000000..2a70979df1 --- /dev/null +++ b/pos_customer_required_fields/models/__init__.py @@ -0,0 +1,5 @@ +# Copyright 2022 Moka Tourisme (https://www.mokatourisme.fr). +# @author Pierre Verkest +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from . import res_partner +from . import pos_config diff --git a/pos_customer_required_fields/models/pos_config.py b/pos_customer_required_fields/models/pos_config.py new file mode 100644 index 0000000000..e806f32666 --- /dev/null +++ b/pos_customer_required_fields/models/pos_config.py @@ -0,0 +1,30 @@ +# Copyright 2022 Moka Tourisme (https://www.mokatourisme.fr). +# @author Pierre Verkest +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import api, fields, models + + +class PosConfig(models.Model): + _inherit = "pos.config" + + res_partner_required_fields_ids = fields.Many2many( + "ir.model.fields", + string="Partner required fields", + domain=[("model", "=", "res.partner")], + help=( + "List of fields that are required while creating " + "or updating a res partner from the point of sale." + ), + ) + res_partner_required_fields_names = fields.Char( + string="Partner required fields name", + compute="_compute_res_partner_required_fields_names", + help="Technical fields to avoid adding ir.model.fields in pos model", + ) + + @api.depends("res_partner_required_fields_ids") + def _compute_res_partner_required_fields_names(self): + for config in self: + config.res_partner_required_fields_names = ",".join( + config.res_partner_required_fields_ids.mapped("name") + ) diff --git a/pos_customer_required_fields/models/res_partner.py b/pos_customer_required_fields/models/res_partner.py new file mode 100644 index 0000000000..a3c5a92308 --- /dev/null +++ b/pos_customer_required_fields/models/res_partner.py @@ -0,0 +1,27 @@ +# Copyright 2022 Moka Tourisme (https://www.mokatourisme.fr). +# @author Pierre Verkest +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from odoo import _, api, models +from odoo.exceptions import ValidationError + + +class PosOrder(models.Model): + _inherit = "res.partner" + + @api.model + def create_from_ui(self, partner_data): + """Ensure all fields required pos session fields to be set.""" + pos_config_id = partner_data.pop("pos_config_id") + partner_id = super().create_from_ui(partner_data) + partner = self.browse(partner_id) + pos_config = self.env["pos.config"].browse(int(pos_config_id)) + missing_fields = [] + for field in pos_config.res_partner_required_fields_ids: + if not getattr(partner, field.name): + missing_fields.append(field.field_description) + if missing_fields: + raise ValidationError( + _("Following required field(s) is/are not set: %s.") + % ", ".join(missing_fields) + ) + return partner_id diff --git a/pos_customer_required_fields/readme/CONFIGURE.rst b/pos_customer_required_fields/readme/CONFIGURE.rst new file mode 100644 index 0000000000..807520f29b --- /dev/null +++ b/pos_customer_required_fields/readme/CONFIGURE.rst @@ -0,0 +1,8 @@ +To define customer required field on PoS UI: + +#. Go to any PoS configuration *Point of Sale > Configuration > Point of Sale*. +#. Edit Partner required fields. + +.. warning:: + + Make sure to choose only `res.partner`'s fields present on the PoS UI. diff --git a/pos_customer_required_fields/readme/CONTRIBUTORS.rst b/pos_customer_required_fields/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000000..c0b5a0525b --- /dev/null +++ b/pos_customer_required_fields/readme/CONTRIBUTORS.rst @@ -0,0 +1,3 @@ + `Moka Tourisme `_ + + * Pierre Verkest \ No newline at end of file diff --git a/pos_customer_required_fields/readme/DESCRIPTION.rst b/pos_customer_required_fields/readme/DESCRIPTION.rst new file mode 100644 index 0000000000..f3ba571303 --- /dev/null +++ b/pos_customer_required_fields/readme/DESCRIPTION.rst @@ -0,0 +1,7 @@ +This module enforce users to properly define customer fields +created from point of sale or used in pos order. + +From PoS config you will be able to define required fields. + +Using this module without `pos_customer_required` module you are +still able to create PoS order without customer. diff --git a/pos_customer_required_fields/readme/USAGE.rst b/pos_customer_required_fields/readme/USAGE.rst new file mode 100644 index 0000000000..adb36b57e1 --- /dev/null +++ b/pos_customer_required_fields/readme/USAGE.rst @@ -0,0 +1,13 @@ +To create or edit partner from PoS + +#. Open PoS session +#. Click on client button +#. required filed are highlight (in green) + +.. figure:: ../static/description/pos_edit_customer.png + +If you choose an existing partner with missing informations +while validating the payment you will be ask to collect missing +customer informations. + +.. figure:: ../static/description/pos_customer_missing_fields.png diff --git a/pos_customer_required_fields/static/description/icon.png b/pos_customer_required_fields/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..65bf1a8d1a8c80db364852731175844fc26b905d GIT binary patch literal 22874 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 literal 0 HcmV?d00001 diff --git a/pos_customer_required_fields/static/description/index.html b/pos_customer_required_fields/static/description/index.html new file mode 100644 index 0000000000..aabd286445 --- /dev/null +++ b/pos_customer_required_fields/static/description/index.html @@ -0,0 +1,462 @@ + + + + + + +Point Of Sale - Customer required fields + + + + + + diff --git a/pos_customer_required_fields/static/description/pos_customer_missing_fields.png b/pos_customer_required_fields/static/description/pos_customer_missing_fields.png new file mode 100644 index 0000000000000000000000000000000000000000..25b77aa8039a119203bca1429e64b2369b15e2d2 GIT binary patch literal 17921 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 Bbo&4R literal 0 HcmV?d00001 diff --git a/pos_customer_required_fields/static/description/pos_edit_customer.png b/pos_customer_required_fields/static/description/pos_edit_customer.png new file mode 100644 index 0000000000000000000000000000000000000000..79a258937cf994c6baf296504fb0ffec3b26a6ac GIT binary patch literal 47934 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 literal 0 HcmV?d00001 diff --git a/pos_customer_required_fields/static/src/css/pos.css b/pos_customer_required_fields/static/src/css/pos.css new file mode 100644 index 0000000000..460b281532 --- /dev/null +++ b/pos_customer_required_fields/static/src/css/pos.css @@ -0,0 +1,10 @@ +/* + Copyright 2022 Moka Tourisme (https://www.mokatourisme.fr). + @author Pierre Verkest + License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +*/ +input:required { + background: rgb(110,200,155) !important; + color: white !important; + border: solid 2px rgb(110,200,155) !important; +} diff --git a/pos_customer_required_fields/static/src/js/screens.js b/pos_customer_required_fields/static/src/js/screens.js new file mode 100644 index 0000000000..0dfe8dfb9b --- /dev/null +++ b/pos_customer_required_fields/static/src/js/screens.js @@ -0,0 +1,56 @@ +/* + Copyright 2022 Moka Tourisme (https://www.mokatourisme.fr). + @author Pierre Verkest + License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + */ +odoo.define('pos_order_zipcode.screens', function (require) { + "use strict"; + + var screens = require('point_of_sale.screens'); + + screens.PaymentScreenWidget.include({ + missing_customer_fields: function(){ + const customer = this.pos.get_order().get_client(); + if(!customer){ + // In case customer is not required there are no missing fields + // there are some other check that ensure if customer is + // required or not, it's not the intent of this method to decide + return []; + } + return this.pos.config.res_partner_required_fields_names.split(",").filter( + function(name){ + if (!customer[name]){ + return true; + } + return false; + } + ) + }, + order_is_valid: function(force_validation) { + const missing_fields = this.missing_customer_fields(); + if (missing_fields.length > 0) { + this.gui.show_popup('error', { + 'title': _t('Missing customer data'), + 'body': _t('Some data on the customer you picked are missing. Use the customer screen to edit: ') + missing_fields, + }); + return false; + } + return this._super.apply(this, arguments); + }, + }); + + screens.ClientListScreenWidget.include({ + display_client_details: function(visibility,partner,clickpos){ + this._super.apply(this, arguments); + var inputs = this.$('div.client-details-contents input'); + if (visibility==='edit'){ + const required_fields = this.pos.config.res_partner_required_fields_names.split(","); + _.each(inputs, function(input_element){ + if(required_fields.indexOf(input_element.name)>=0){ + $(input_element).prop('required', true); + } + }); + } + } + }); +}); diff --git a/pos_customer_required_fields/static/src/xml/pos.xml b/pos_customer_required_fields/static/src/xml/pos.xml new file mode 100644 index 0000000000..8bd85107ee --- /dev/null +++ b/pos_customer_required_fields/static/src/xml/pos.xml @@ -0,0 +1,15 @@ + + + + + +
+ +
+
+
+
diff --git a/pos_customer_required_fields/templates/assets.xml b/pos_customer_required_fields/templates/assets.xml new file mode 100644 index 0000000000..c8260a5a84 --- /dev/null +++ b/pos_customer_required_fields/templates/assets.xml @@ -0,0 +1,11 @@ + + + + \ No newline at end of file diff --git a/pos_customer_required_fields/tests/__init__.py b/pos_customer_required_fields/tests/__init__.py new file mode 100644 index 0000000000..4c63f187b8 --- /dev/null +++ b/pos_customer_required_fields/tests/__init__.py @@ -0,0 +1,4 @@ +# Copyright 2022 Moka Tourisme (https://www.mokatourisme.fr). +# @author Pierre Verkest +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +from . import test_res_partner diff --git a/pos_customer_required_fields/tests/test_res_partner.py b/pos_customer_required_fields/tests/test_res_partner.py new file mode 100644 index 0000000000..64ae27966b --- /dev/null +++ b/pos_customer_required_fields/tests/test_res_partner.py @@ -0,0 +1,110 @@ +# Copyright 2022 Moka Tourisme (https://www.mokatourisme.fr). +# @author Pierre Verkest +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +import odoo +from odoo import fields +from odoo.exceptions import ValidationError + +from odoo.addons.point_of_sale.tests.common import TestPointOfSaleCommon + + +@odoo.tests.tagged("post_install", "-at_install") +class TestCreateResPartnerFromPointOfSaleControledFields(TestPointOfSaleCommon): + def setUp(self): + super().setUp() + self.ResPartner = self.env["res.partner"] + self.ModelFields = self.env["ir.model.fields"] + + def test_create_from_ui(self): + """ + Simulation of res.partner coming from the interface + """ + self.pos_config.open_session_cb() + + self.pos_config.res_partner_required_fields_ids = self.ModelFields.search( + [("model", "=", "res.partner"), ("name", "in", ["street", "zip"])] + ) + pos_res_partner_payload = { + "pos_config_id": str( + self.pos_config.id + ), # frontend input type hidden send as text + "barcode": False, + "city": False, + "country_id": "75", + "email": False, + "id": False, + "is_company": False, + "name": "Test Création", + "phone": False, + "property_product_pricelist": 1, + "street": "1r", + "vat": False, + "zip": "66888", + } + + # I create an order on an open session + partner = self.ResPartner.browse( + self.ResPartner.create_from_ui(pos_res_partner_payload) + ) + self.assertEqual(partner.street, "1r") + self.assertEqual(partner.zip, "66888") + + def test_create_from_ui_missing_field(self): + self.pos_config.open_session_cb() + + self.pos_config.res_partner_required_fields_ids = self.ModelFields.search( + [("model", "=", "res.partner"), ("name", "in", ["name", "zip"])] + ) + pos_res_partner_payload = { + "pos_config_id": self.pos_config.id, + "barcode": False, + "city": False, + "country_id": "75", + "email": False, + "id": False, + "is_company": False, + "name": "test création", + "phone": False, + "property_product_pricelist": 1, + "street": False, + "vat": False, + "zip": False, + } + with self.assertRaisesRegex( + ValidationError, r"Following required field\(s\) is/are not set: Zip" + ): + self.ResPartner.create_from_ui(pos_res_partner_payload) + + def test_update_existing_partner_missing_information(self): + + self.pos_config.open_session_cb() + partner = self.ResPartner.create( + { + "name": "test", + "zip": "22322", + } + ) + self.pos_config.res_partner_required_fields_ids = self.ModelFields.search( + [("model", "=", "res.partner"), ("name", "in", ["phone", "zip"])] + ) + pos_res_partner_payload = { + "pos_config_id": self.pos_config.id, + "barcode": False, + "city": False, + "country_id": "75", + "email": False, + "firstname": "test", + "id": partner.id, + "is_company": False, + "lastname": "création", + "name": "test création", + "phone": False, + "property_product_pricelist": 1, + "street": False, + "vat": False, + "zip": False, + } + with self.assertRaisesRegex( + ValidationError, r"Following required field\(s\) is/are not set: Phone, Zip" + ): + self.ResPartner.create_from_ui(pos_res_partner_payload) diff --git a/pos_customer_required_fields/views/view_pos_config.xml b/pos_customer_required_fields/views/view_pos_config.xml new file mode 100644 index 0000000000..9c9363d9df --- /dev/null +++ b/pos_customer_required_fields/views/view_pos_config.xml @@ -0,0 +1,41 @@ + + + + + pos.config + + + + +
+
+
+
+
+
+
+
From e0262fdb5730fc8bdcae2261e6f74a376b88550f Mon Sep 17 00:00:00 2001 From: Pierre Verkest Date: Wed, 30 Mar 2022 02:43:03 +0200 Subject: [PATCH 02/15] add missing license and last callage return --- pos_customer_required_fields/templates/assets.xml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pos_customer_required_fields/templates/assets.xml b/pos_customer_required_fields/templates/assets.xml index c8260a5a84..e1086c6426 100644 --- a/pos_customer_required_fields/templates/assets.xml +++ b/pos_customer_required_fields/templates/assets.xml @@ -1,4 +1,9 @@ + - \ No newline at end of file + From 9e20e84e17571821a48a70424e55d0f76d46218d Mon Sep 17 00:00:00 2001 From: Pierre Verkest Date: Wed, 30 Mar 2022 09:38:44 +0200 Subject: [PATCH 03/15] styling --- pos_customer_required_fields/readme/CONTRIBUTORS.rst | 2 +- pos_customer_required_fields/tests/test_res_partner.py | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/pos_customer_required_fields/readme/CONTRIBUTORS.rst b/pos_customer_required_fields/readme/CONTRIBUTORS.rst index c0b5a0525b..71921392e8 100644 --- a/pos_customer_required_fields/readme/CONTRIBUTORS.rst +++ b/pos_customer_required_fields/readme/CONTRIBUTORS.rst @@ -1,3 +1,3 @@ `Moka Tourisme `_ - * Pierre Verkest \ No newline at end of file + * Pierre Verkest diff --git a/pos_customer_required_fields/tests/test_res_partner.py b/pos_customer_required_fields/tests/test_res_partner.py index 64ae27966b..853c05d371 100644 --- a/pos_customer_required_fields/tests/test_res_partner.py +++ b/pos_customer_required_fields/tests/test_res_partner.py @@ -2,7 +2,6 @@ # @author Pierre Verkest # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). import odoo -from odoo import fields from odoo.exceptions import ValidationError from odoo.addons.point_of_sale.tests.common import TestPointOfSaleCommon From 033022e982644190cdccb517af97f30e4a2c2dd7 Mon Sep 17 00:00:00 2001 From: Pierre Verkest Date: Wed, 30 Mar 2022 15:17:13 +0200 Subject: [PATCH 04/15] [FIX]remove custom group in view definition --- pos_customer_required_fields/views/view_pos_config.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/pos_customer_required_fields/views/view_pos_config.xml b/pos_customer_required_fields/views/view_pos_config.xml index 9c9363d9df..dbad321823 100644 --- a/pos_customer_required_fields/views/view_pos_config.xml +++ b/pos_customer_required_fields/views/view_pos_config.xml @@ -8,7 +8,6 @@ pos.config - Date: Fri, 1 Apr 2022 14:41:28 +0000 Subject: [PATCH 05/15] [UPD] Update pos_customer_required_fields.pot --- .../i18n/pos_customer_required_fields.pot | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/pos_customer_required_fields/i18n/pos_customer_required_fields.pot b/pos_customer_required_fields/i18n/pos_customer_required_fields.pot index f8105825c2..79438d3878 100644 --- a/pos_customer_required_fields/i18n/pos_customer_required_fields.pot +++ b/pos_customer_required_fields/i18n/pos_customer_required_fields.pot @@ -29,6 +29,13 @@ msgstr "" msgid "List of fields that are required while creating or updating a res partner from the point of sale." msgstr "" +#. module: pos_customer_required_fields +#. openerp-web +#: code:addons/pos_customer_required_fields/static/src/js/screens.js:33 +#, python-format +msgid "Missing customer data" +msgstr "" + #. module: pos_customer_required_fields #: model:ir.model.fields,field_description:pos_customer_required_fields.field_pos_config__res_partner_required_fields_ids msgid "Partner required fields" @@ -44,6 +51,13 @@ msgstr "" msgid "Point of Sale Configuration" msgstr "" +#. module: pos_customer_required_fields +#. openerp-web +#: code:addons/pos_customer_required_fields/static/src/js/screens.js:34 +#, python-format +msgid "Some data on the customer you picked are missing. Use the customer screen to edit: " +msgstr "" + #. module: pos_customer_required_fields #: model:ir.model.fields,help:pos_customer_required_fields.field_pos_config__res_partner_required_fields_names msgid "Technical fields to avoid adding ir.model.fields in pos model" From 58a958c277e2e19c2447fcdde1bbc6179b44774f Mon Sep 17 00:00:00 2001 From: OCA-git-bot Date: Fri, 1 Apr 2022 14:57:13 +0000 Subject: [PATCH 06/15] [UPD] README.rst --- pos_customer_required_fields/static/description/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pos_customer_required_fields/static/description/index.html b/pos_customer_required_fields/static/description/index.html index aabd286445..0b6148c1e2 100644 --- a/pos_customer_required_fields/static/description/index.html +++ b/pos_customer_required_fields/static/description/index.html @@ -3,7 +3,7 @@ - + Point Of Sale - Customer required fields
+

Point Of Sale - Customer required fields

+ + +

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

+

This module enforce users to properly define customer fields +created from point of sale or used in pos order.

+

From PoS config you will be able to define required fields.

+

Using this module without pos_customer_required module you are +still able to create PoS order without customer.

+

Table of contents

+ +
+

Configuration

+

To define customer required field on PoS UI:

+
    +
  1. Go to any PoS configuration Point of Sale > Configuration > Point of Sale.
  2. +
  3. Edit Partner required fields.
  4. +
+
+

Warning

+

Make sure to choose only res.partner’s fields present on the PoS UI.

+
+
+
+

Usage

+

To create or edit partner from PoS

+
    +
  1. Open PoS session
  2. +
  3. Click on client button
  4. +
  5. required filed are highlight (in green)
  6. +
+
+https://raw.githubusercontent.com/OCA/pos/12.0/pos_customer_required_fields/static/description/pos_edit_customer.png +
+

If you choose an existing partner with missing informations +while validating the payment you will be ask to collect missing +customer informations.

+
+https://raw.githubusercontent.com/OCA/pos/12.0/pos_customer_required_fields/static/description/pos_customer_missing_fields.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 smashing it by providing a detailed and welcomed +feedback.

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • Pierre Verkest
  • +
+
+
+

Contributors

+
+

Moka Tourisme

+
+ +
+
+
+
+

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:

+

petrus-v

+

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.

+
+
+