From acc8c11b6e696adda9d99c69eada4867380cee7b Mon Sep 17 00:00:00 2001 From: Yoshi Tashiro Date: Thu, 18 Jul 2024 14:49:02 +0000 Subject: [PATCH 1/3] [3715][ADD] base_tier_validation --- base_tier_validation/README.rst | 256 +++++ base_tier_validation/__init__.py | 4 + base_tier_validation/__manifest__.py | 44 + base_tier_validation/data/mail_data.xml | 43 + .../i18n/base_tier_validation.pot | 862 ++++++++++++++++ base_tier_validation/i18n/es.po | 930 +++++++++++++++++ base_tier_validation/i18n/es_MX.po | 916 +++++++++++++++++ base_tier_validation/i18n/fr.po | 936 +++++++++++++++++ base_tier_validation/i18n/it.po | 953 +++++++++++++++++ base_tier_validation/i18n/nl_NL.po | 937 +++++++++++++++++ base_tier_validation/i18n/sv.po | 937 +++++++++++++++++ base_tier_validation/i18n/tr.po | 908 +++++++++++++++++ base_tier_validation/i18n/zh_CN.po | 900 ++++++++++++++++ base_tier_validation/models/__init__.py | 8 + .../models/res_config_settings.py | 14 + base_tier_validation/models/res_users.py | 63 ++ .../models/tier_definition.py | 107 ++ base_tier_validation/models/tier_review.py | 140 +++ .../models/tier_validation.py | 774 ++++++++++++++ .../models/tier_validation_exception.py | 92 ++ base_tier_validation/readme/CONFIGURE.rst | 28 + base_tier_validation/readme/CONTRIBUTORS.rst | 10 + base_tier_validation/readme/DESCRIPTION.rst | 13 + base_tier_validation/readme/HISTORY.rst | 91 ++ base_tier_validation/readme/ROADMAP.rst | 20 + .../security/ir.model.access.csv | 7 + .../security/tier_validation_security.xml | 19 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 604 +++++++++++ .../static/src/js/ir_model.esm.js | 29 + .../static/src/js/main.esm.js | 7 + .../static/src/js/review_group_view.esm.js | 51 + .../static/src/js/review_groups.esm.js | 52 + .../src/js/review_notification_handler.esm.js | 26 + .../src/js/reviewer_menu_container.esm.js | 25 + .../static/src/js/reviewer_menu_view.esm.js | 29 + .../static/src/js/systray.esm.js | 104 ++ .../static/src/js/systray_service.esm.js | 17 + .../static/src/js/tier_review_widget.esm.js | 36 + .../static/src/scss/review.scss | 41 + .../static/src/scss/systray.scss | 143 +++ .../src/xml/reviewer_menu_container.xml | 8 + .../static/src/xml/systray.xml | 97 ++ .../static/src/xml/tier_review_template.xml | 119 +++ .../templates/tier_validation_templates.xml | 107 ++ base_tier_validation/tests/__init__.py | 4 + base_tier_validation/tests/common.py | 92 ++ .../tests/test_tier_validation.py | 959 ++++++++++++++++++ .../tests/tier_validation_tester.py | 59 ++ .../views/res_config_settings_views.xml | 83 ++ .../views/tier_definition_view.xml | 158 +++ .../views/tier_review_view.xml | 25 + .../views/tier_validation_exception_view.xml | 124 +++ base_tier_validation/wizard/__init__.py | 3 + base_tier_validation/wizard/comment_wizard.py | 25 + .../wizard/comment_wizard_view.xml | 26 + .../odoo/addons/base_tier_validation | 1 + setup/base_tier_validation/setup.py | 6 + 58 files changed, 13072 insertions(+) create mode 100644 base_tier_validation/README.rst create mode 100644 base_tier_validation/__init__.py create mode 100644 base_tier_validation/__manifest__.py create mode 100644 base_tier_validation/data/mail_data.xml create mode 100644 base_tier_validation/i18n/base_tier_validation.pot create mode 100644 base_tier_validation/i18n/es.po create mode 100644 base_tier_validation/i18n/es_MX.po create mode 100644 base_tier_validation/i18n/fr.po create mode 100644 base_tier_validation/i18n/it.po create mode 100644 base_tier_validation/i18n/nl_NL.po create mode 100644 base_tier_validation/i18n/sv.po create mode 100644 base_tier_validation/i18n/tr.po create mode 100644 base_tier_validation/i18n/zh_CN.po create mode 100644 base_tier_validation/models/__init__.py create mode 100644 base_tier_validation/models/res_config_settings.py create mode 100644 base_tier_validation/models/res_users.py create mode 100644 base_tier_validation/models/tier_definition.py create mode 100644 base_tier_validation/models/tier_review.py create mode 100644 base_tier_validation/models/tier_validation.py create mode 100644 base_tier_validation/models/tier_validation_exception.py create mode 100644 base_tier_validation/readme/CONFIGURE.rst create mode 100644 base_tier_validation/readme/CONTRIBUTORS.rst create mode 100644 base_tier_validation/readme/DESCRIPTION.rst create mode 100644 base_tier_validation/readme/HISTORY.rst create mode 100644 base_tier_validation/readme/ROADMAP.rst create mode 100644 base_tier_validation/security/ir.model.access.csv create mode 100644 base_tier_validation/security/tier_validation_security.xml create mode 100644 base_tier_validation/static/description/icon.png create mode 100644 base_tier_validation/static/description/index.html create mode 100644 base_tier_validation/static/src/js/ir_model.esm.js create mode 100644 base_tier_validation/static/src/js/main.esm.js create mode 100644 base_tier_validation/static/src/js/review_group_view.esm.js create mode 100644 base_tier_validation/static/src/js/review_groups.esm.js create mode 100644 base_tier_validation/static/src/js/review_notification_handler.esm.js create mode 100644 base_tier_validation/static/src/js/reviewer_menu_container.esm.js create mode 100644 base_tier_validation/static/src/js/reviewer_menu_view.esm.js create mode 100644 base_tier_validation/static/src/js/systray.esm.js create mode 100644 base_tier_validation/static/src/js/systray_service.esm.js create mode 100644 base_tier_validation/static/src/js/tier_review_widget.esm.js create mode 100644 base_tier_validation/static/src/scss/review.scss create mode 100644 base_tier_validation/static/src/scss/systray.scss create mode 100644 base_tier_validation/static/src/xml/reviewer_menu_container.xml create mode 100644 base_tier_validation/static/src/xml/systray.xml create mode 100644 base_tier_validation/static/src/xml/tier_review_template.xml create mode 100644 base_tier_validation/templates/tier_validation_templates.xml create mode 100644 base_tier_validation/tests/__init__.py create mode 100644 base_tier_validation/tests/common.py create mode 100644 base_tier_validation/tests/test_tier_validation.py create mode 100644 base_tier_validation/tests/tier_validation_tester.py create mode 100644 base_tier_validation/views/res_config_settings_views.xml create mode 100644 base_tier_validation/views/tier_definition_view.xml create mode 100644 base_tier_validation/views/tier_review_view.xml create mode 100644 base_tier_validation/views/tier_validation_exception_view.xml create mode 100644 base_tier_validation/wizard/__init__.py create mode 100644 base_tier_validation/wizard/comment_wizard.py create mode 100644 base_tier_validation/wizard/comment_wizard_view.xml create mode 120000 setup/base_tier_validation/odoo/addons/base_tier_validation create mode 100644 setup/base_tier_validation/setup.py diff --git a/base_tier_validation/README.rst b/base_tier_validation/README.rst new file mode 100644 index 00000000..07d04a39 --- /dev/null +++ b/base_tier_validation/README.rst @@ -0,0 +1,256 @@ +==================== +Base Tier Validation +==================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:63bf2b0b14c3e9aba79d5e35651801a5d7172339b1265297c4712d5647b65494 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Mature-brightgreen.png + :target: https://odoo-community.org/page/development-status + :alt: Mature +.. |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%2Fserver--ux-lightgray.png?logo=github + :target: https://github.com/OCA/server-ux/tree/16.0/base_tier_validation + :alt: OCA/server-ux +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/server-ux-16-0/server-ux-16-0-base_tier_validation + :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/server-ux&target_branch=16.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +Validating some operations is a common need across different areas in a company +and sometimes it also involves several people and stages in the process. With +this module you will be able to define your custom validation workflows for +any Odoo document. + +This module does not provide a functionality by itself but an abstract model +to implement a validation process based on tiers on other models (e.g. +purchase orders, sales orders, budgets, expenses...). + +**Note:** To be able to use this module in a new model you will need some +development. + +See `purchase_tier_validation `_ as an example of implementation. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +To configure Tier Validations, you need to: + +#. Go to *Settings > Technical > Tier Validations > Tier Definition*. +#. Create as many tiers as you want for any model having tier validation + functionality. + +**Note:** + +* If check *Notify Reviewers on Creation*, all possible reviewers will be notified by email when this definition is triggered. +* If check *Comment*, reviewers can comment after click Validate or Reject. +* If check *Approve by sequence*, reviewers is forced to review by specified sequence. + + +To configure Tier Validation Exceptions, you need to: + +#. Go to *Settings > Technical > Tier Validations > Tier Validation Exceptions*. +#. Create as many tiers validation exceptions as you want for any model + having tier validation functionality. +#. Add desired fields to be checked in *Fields*. +#. Add desired groups that can use this Exception in *Groups*. +#. You must check *Write under Validation*, *Write after Validation* or both. + +**Note:** + +* If you don't create any exception, the Validated record will be readonly and cannot be modified. +* If check *Write under Validation*, records will be able to be modified only in the defined fields when the Validation process is ongoing. +* If check *Write after Validation*, records will be able to be modified only in the defined fields when the Validation process is finished. +* If check *Write after Validation* and *Write under Validation*, records will be able to be modified defined fields always. + +Known issues / Roadmap +====================== + +This is the list of known issues for this module. Any proposal for improvement will +be very valuable. + +* **Issue:** + + When using `approve_sequence` option in any tier.definition there can be inconsistencies + in the systray notifications. + + **Description:** + + Field `can_review` in tier.review is used to filter out, in the systray notifications, + the reviews a user can approve. This `can_review` field is updated **in the database** + in method `review_user_count`, this can make it very inconsistent for databases + with a lot of users and recurring updates that can change the expected behavior. + +* **Migration to 15.0:** + + The parameter _tier_validation_manual_config will become False, on 14.0, the default + value is True, as the change is applied after the migration. In order to use the new + behavior we need to modify the value on our expected model. + +Changelog +========= + +14.0.1.0.0 (2020-11-19) +~~~~~~~~~~~~~~~~~~~~~~~ + +Migrated to Odoo 14. + +13.0.1.2.2 (2020-08-30) +~~~~~~~~~~~~~~~~~~~~~~~ + +Fixes: + +- When using approve_sequence option in any tier.definition there can be inconsistencies in the systray notifications +- When using approve_sequence, still not approve only the needed sequence, but also other sequence for the same approver + +12.0.3.3.1 (2019-12-02) +~~~~~~~~~~~~~~~~~~~~~~~ + +Fixes: + +- Show comment on Reviews Table. +- Edit notification with approve_sequence. + +12.0.3.3.0 (2019-11-27) +~~~~~~~~~~~~~~~~~~~~~~~ + +New features: + +- Add comment on Reviews Table. +- Approve by sequence. + +12.0.3.2.1 (2019-11-26) +~~~~~~~~~~~~~~~~~~~~~~~ + +Fixes: + +- Remove message_subscribe_users + +12.0.3.2.0 (2019-11-25) +~~~~~~~~~~~~~~~~~~~~~~~ + +New features: + +- Notify reviewers + +12.0.3.1.0 (2019-07-08) +~~~~~~~~~~~~~~~~~~~~~~~ + +Fixes: + +- Singleton error + +12.0.3.0.0 (2019-12-02) +~~~~~~~~~~~~~~~~~~~~~~~ + +Fixes: + +- Edit Reviews Table + +12.0.2.1.0 (2019-05-29) +~~~~~~~~~~~~~~~~~~~~~~~ + +Fixes: + +- Edit drop-down style width and position + +12.0.2.0.0 (2019-05-28) +~~~~~~~~~~~~~~~~~~~~~~~ + +New features: + +- Pass parameters as functions. +- Add Systray. + +12.0.1.0.0 (2019-02-18) +~~~~~~~~~~~~~~~~~~~~~~~ + +Migrated to Odoo 12. + +11.0.1.0.0 (2018-05-09) +~~~~~~~~~~~~~~~~~~~~~~~ + +Migrated to Odoo 11. + +10.0.1.0.0 (2018-03-26) +~~~~~~~~~~~~~~~~~~~~~~~ + +Migrated to Odoo 10. + +9.0.1.0.0 (2017-12-02) +~~~~~~~~~~~~~~~~~~~~~~~ + +First version. + +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 +~~~~~~~ + +* ForgeFlow + +Contributors +~~~~~~~~~~~~ + +* Lois Rilo +* Naglis Jonaitis +* Adrià Gil Sorribes +* Pimolnat Suntian +* Pedro Gonzalez +* Kitti U. +* Saran Lim. +* Evan Soh +* Manuel Regidor +* Eduardo de Miguel + +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-LoisRForgeFlow| image:: https://github.com/LoisRForgeFlow.png?size=40px + :target: https://github.com/LoisRForgeFlow + :alt: LoisRForgeFlow + +Current `maintainer `__: + +|maintainer-LoisRForgeFlow| + +This module is part of the `OCA/server-ux `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/base_tier_validation/__init__.py b/base_tier_validation/__init__.py new file mode 100644 index 00000000..93aa2c1f --- /dev/null +++ b/base_tier_validation/__init__.py @@ -0,0 +1,4 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import models +from . import wizard diff --git a/base_tier_validation/__manifest__.py b/base_tier_validation/__manifest__.py new file mode 100644 index 00000000..42dc65cb --- /dev/null +++ b/base_tier_validation/__manifest__.py @@ -0,0 +1,44 @@ +# Copyright 2017-19 ForgeFlow S.L. (https://www.forgeflow.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +{ + "name": "Base Tier Validation", + "summary": "Implement a validation process based on tiers.", + "version": "16.0.2.1.0", + "development_status": "Mature", + "maintainers": ["LoisRForgeFlow"], + "category": "Tools", + "website": "https://github.com/OCA/server-ux", + "author": "ForgeFlow, Odoo Community Association (OCA)", + "license": "AGPL-3", + "application": False, + "installable": True, + "depends": ["mail"], + "data": [ + "data/mail_data.xml", + "security/ir.model.access.csv", + "security/tier_validation_security.xml", + "views/res_config_settings_views.xml", + "views/tier_definition_view.xml", + "views/tier_review_view.xml", + "views/tier_validation_exception_view.xml", + "wizard/comment_wizard_view.xml", + "templates/tier_validation_templates.xml", + ], + "assets": { + "web.assets_backend": [ + "/base_tier_validation/static/src/scss/systray.scss", + "/base_tier_validation/static/src/scss/review.scss", + "/base_tier_validation/static/src/js/main.esm.js", + "/base_tier_validation/static/src/js/ir_model.esm.js", + "/base_tier_validation/static/src/js/systray_service.esm.js", + "/base_tier_validation/static/src/js/systray.esm.js", + "/base_tier_validation/static/src/js/review_groups.esm.js", + "/base_tier_validation/static/src/js/reviewer_menu_view.esm.js", + "/base_tier_validation/static/src/js/tier_review_widget.esm.js", + "/base_tier_validation/static/src/js/review_group_view.esm.js", + "/base_tier_validation/static/src/js/reviewer_menu_container.esm.js", + "/base_tier_validation/static/src/js/review_notification_handler.esm.js", + "/base_tier_validation/static/src/xml/**/*", + ], + }, +} diff --git a/base_tier_validation/data/mail_data.xml b/base_tier_validation/data/mail_data.xml new file mode 100644 index 00000000..8207bc4c --- /dev/null +++ b/base_tier_validation/data/mail_data.xml @@ -0,0 +1,43 @@ + + + + Tier Validation Requested + + + + + + Tier Validation Accepted Notification + + + + + + Tier Validation Rejected Notification + + + + + + Tier Validation Restarted + + + + + diff --git a/base_tier_validation/i18n/base_tier_validation.pot b/base_tier_validation/i18n/base_tier_validation.pot new file mode 100644 index 00000000..e8274154 --- /dev/null +++ b/base_tier_validation/i18n/base_tier_validation.pot @@ -0,0 +1,862 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_tier_validation +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.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: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#, python-format +msgid "0 Pending" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid " This Record needs to be validated." +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid " Operation has been rejected." +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid " Operation has been validated!" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Name" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Bypassed, if previous tier was validated by same reviewer" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review has been requested by %s." +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was accepted" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was accepted. (%s)" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was rejected by %(user)s. (%(comment)s)" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was rejected by %s." +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A validation process is still open for at least one record." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__active +msgid "Active" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#, python-format +msgid "Activity" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "All" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_validation_exception__group_ids +msgid "Allowed groups to use this Tier Validation Exception" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__group +msgid "Any user in a specific group" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Apply On" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__approve_sequence +msgid "Approval order by the specified sequence number" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__approve_sequence_bypass +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__approve_sequence_bypass +msgid "Approve Sequence Bypass" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__approve_sequence +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__approve_sequence +msgid "Approve by sequence" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__approved +msgid "Approved" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Archived" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation_exception.py:0 +#, python-format +msgid "" +"At least one of these fields must be checked! Write under Validation, Write " +"after Validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence_bypass +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__approve_sequence_bypass +msgid "" +"Bypassed (auto validated), if previous tier was validated by same reviewer" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__can_review +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__can_review +msgid "Can Review" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__can_review +msgid "" +"Can review will be marked if the review is pending and the\n" +" approve sequence has been achieved" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +msgid "Cancel" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__has_comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__has_comment +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +#, python-format +msgid "Comment" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_comment_wizard +msgid "Comment Wizard" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__comment +msgid "Comments" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__company_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__company_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__company_id +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Company" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "Create a new Validation Exception!" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__create_uid +msgid "Created by" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__create_date +msgid "Created on" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_type +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__definition_id +msgid "Definition" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_domain +msgid "Definition Domain" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__name +#, python-format +msgid "Description" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__display_name +msgid "Display Name" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_status +msgid "Display Status" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__definition_type__domain +msgid "Domain" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__done_by +msgid "Done By" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#, python-format +msgid "Done by" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__field +msgid "Field in related record" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__field_ids +msgid "Fields" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +#, python-format +msgid "Group %s" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "Group By" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__group_ids +msgid "Groups" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__has_comment +msgid "Has Comment" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__id +msgid "ID" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_create +msgid "" +"If set, all possible reviewers will be notified by email when this " +"definition is triggered." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_accepted +msgid "" +"If set, reviewers will be notified by email when a review related to this " +"definition is accepted." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_rejected +msgid "" +"If set, reviewers will be notified by email when a review related to this " +"definition is rejected." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_restarted +msgid "" +"If set, reviewers will be notified by email when a reviews related to this " +"definition are restarted." +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "It's fully validated" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "It's in the validation process" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard____last_update +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition____last_update +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review____last_update +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception____last_update +msgid "Last Modified on" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__write_date +msgid "Last Updated on" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_name +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Model" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "More Options" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__name +msgid "Name" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__need_validation +msgid "Need Validation" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_definition.py:0 +#, python-format +msgid "New Tier Validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__next_review +msgid "Next Review" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "Next: %s" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#, python-format +msgid "No reviews to do." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_accepted +msgid "Notify Reviewers on Accepted" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_create +msgid "Notify Reviewers on Creation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_rejected +msgid "Notify Reviewers on Rejected" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_restarted +msgid "Notify Reviewers on Restarted" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "" +"Once created, you can decide which fields you want to be editable when the " +"record:" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "Operation has been rejected." +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "Operation has been validated!" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Option to forward a tier validation to other reviewer, and backward" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Option to use python formula to get reviewers and find documents" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__pending +#, python-format +msgid "Pending" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model_id +msgid "Referenced Model" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Reject" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__rejected +msgid "Rejected" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__rejected_message +msgid "Rejected Message" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__res_id +msgid "Related Document ID" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__model +msgid "Related Document Model" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Request Validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__requested_by +msgid "Requested By" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#, python-format +msgid "Requested by" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_id +msgid "Res" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_model +msgid "Res Model" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Restart Validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__review_ids +msgid "Review" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_id +msgid "Reviewer" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_field_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_field_id +msgid "Reviewer field" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_group_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_group_id +msgid "Reviewer group" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_ids +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__reviewer_ids +msgid "Reviewers" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_res_users__review_ids +#, python-format +msgid "Reviews" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__sequence +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence +#, python-format +msgid "Sequence" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__individual +msgid "Specific user" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__status +#, python-format +msgid "Status" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "The review has been reset by %s." +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +#, python-format +msgid "There are no res.users in the selected field" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "This %s needs to be validated" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "" +"This action needs to be validated for at least one record. \n" +"Please request a validation." +msgstr "" + +#. module: base_tier_validation +#: model:ir.actions.act_window,name:base_tier_validation.tier_definition_action +#: model:ir.model,name:base_tier_validation.model_tier_definition +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_definition +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Tier Definition" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_formula +msgid "Tier Formula" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_forward +msgid "Tier Forward & Backward" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_review +msgid "Tier Review" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Tier Validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation +msgid "Tier Validation (abstract)" +msgstr "" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_accepted +msgid "Tier Validation Accepted Notification" +msgstr "" + +#. module: base_tier_validation +#: model:ir.actions.act_window,name:base_tier_validation.tier_validation_exception_action +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_validation_exception +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_form +msgid "Tier Validation Exception" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation_exception +msgid "Tier Validation Exceptions" +msgstr "" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_rejected +msgid "Tier Validation Rejected Notification" +msgstr "" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested +msgid "Tier Validation Requested" +msgstr "" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_restarted +msgid "Tier Validation Restarted" +msgstr "" + +#. module: base_tier_validation +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_confirmation +msgid "Tier Validations" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__to_validate_message +msgid "To Validate Message" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__todo_by +msgid "Todo By" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#, python-format +msgid "Todo by" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_users +msgid "User" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__valid_model_field_ids +msgid "Valid Model Field" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__valid_reviewer_field_ids +msgid "Valid Reviewer Field" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Validate" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__validate_reject +msgid "Validate Reject" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__validated +msgid "Validated" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validated_message +msgid "Validated Message" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__review_type +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__review_type +msgid "Validated by" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewed_date +#, python-format +msgid "Validation Date" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewed_formated_date +msgid "Validation Formated Date" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validation_status +msgid "Validation Status" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__review_ids +msgid "Validations" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__no +msgid "Without validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_after_validation +msgid "Write after Validation" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Write after validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_under_validation +msgid "Write under Validation" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Write under validation" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "" +"You are not allowed to write those fields after validation.\n" +"- %(not_allowed_fields)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields)s" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "" +"You are not allowed to write those fields under validation.\n" +"- %(not_allowed_fields)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields)s" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "e.g. Tier Validation for..." +msgstr "" diff --git a/base_tier_validation/i18n/es.po b/base_tier_validation/i18n/es.po new file mode 100644 index 00000000..d838810b --- /dev/null +++ b/base_tier_validation/i18n/es.po @@ -0,0 +1,930 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_tier_validation +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-07-05 07:53+0000\n" +"PO-Revision-Date: 2024-07-05 09:54+0200\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 3.4.4\n" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#, python-format +msgid "0 Pending" +msgstr "0 Pendientes" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid " This Record needs to be validated." +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid " Operation has been rejected." +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid " Operation has been validated!" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Name" +msgstr "Nombre" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Bypassed, if previous tier was validated by same reviewer" +msgstr "" +"Omitido, si el nivel anterior fue validado por el mismo revisor" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review has been requested by %s." +msgstr "Una revisión fue solicitada por %s." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was accepted" +msgstr "Una revisión fue aceptada" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was accepted. (%s)" +msgstr "Una revisión fue aceptada. (%s)" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was rejected by %(user)s. (%(comment)s)" +msgstr "%(user)s rechazó una reseña. %(comment)s" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was rejected by %s." +msgstr "Una revisión fue rechaza por %s." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A validation process is still open for at least one record." +msgstr "Un proceso de validación está aún abierto para al menos un registro." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__active +msgid "Active" +msgstr "Activo" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#, python-format +msgid "Activity" +msgstr "Actividades" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "All" +msgstr "Todos" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_validation_exception__group_ids +msgid "Allowed groups to use this Tier Validation Exception" +msgstr "Grupos permitidos para utilizar esta Excepción de Validación de Nivel" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__group +msgid "Any user in a specific group" +msgstr "Cualquier usuario de un grupo específico" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Apply On" +msgstr "Aplicar en" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__approve_sequence +msgid "Approval order by the specified sequence number" +msgstr "Orden de aprobación por el número de secuencia especificado" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__approve_sequence_bypass +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__approve_sequence_bypass +msgid "Approve Sequence Bypass" +msgstr "Aprobar Omisión de Secuencia" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__approve_sequence +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__approve_sequence +msgid "Approve by sequence" +msgstr "Aprobar por secuencia" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__approved +msgid "Approved" +msgstr "Aprobado" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Archived" +msgstr "Archivado" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation_exception.py:0 +#, python-format +msgid "" +"At least one of these fields must be checked! Write under Validation, Write " +"after Validation" +msgstr "" +"¡Al menos uno de estos campos debe estar marcado! Escribir en Validación, " +"Escribir después de Validación" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence_bypass +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__approve_sequence_bypass +msgid "" +"Bypassed (auto validated), if previous tier was validated by same reviewer" +msgstr "" +"Omitido (validado automático), si el mismo revisor validó el nivel anterior" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__can_review +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__can_review +msgid "Can Review" +msgstr "Puede revisar" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__can_review +msgid "" +"Can review will be marked if the review is pending and the\n" +" approve sequence has been achieved" +msgstr "" +"Puede revisar será establecido si la revisión está pendiente y la\n" +" secuencia de aprobación se ha alcanzado" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +msgid "Cancel" +msgstr "Cancelar" + +#. module: base_tier_validation +#. odoo-javascript +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__has_comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__has_comment +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +#, python-format +msgid "Comment" +msgstr "Comentar" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_comment_wizard +msgid "Comment Wizard" +msgstr "Wizard Comentario" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__comment +msgid "Comments" +msgstr "Comentarios" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__company_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__company_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__company_id +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Company" +msgstr "Compañía" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_config_settings +msgid "Config Settings" +msgstr "Opciones de configuración" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "Create a new Validation Exception!" +msgstr "¡Crea una nueva Excepción de Validación!" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__create_date +msgid "Created on" +msgstr "Creado en" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_type +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__definition_id +msgid "Definition" +msgstr "Definición" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_domain +msgid "Definition Domain" +msgstr "Dominio de definición" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__name +#, python-format +msgid "Description" +msgstr "Descripción" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__display_name +msgid "Display Name" +msgstr "Nombre mostrado" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_status +msgid "Display Status" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__definition_type__domain +msgid "Domain" +msgstr "Dominio" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__done_by +msgid "Done By" +msgstr "Hecho Por" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#, python-format +msgid "Done by" +msgstr "Hecho Por" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__field +msgid "Field in related record" +msgstr "Campo en el registro relacionado" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__field_ids +msgid "Fields" +msgstr "Campos" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +#, python-format +msgid "Group %s" +msgstr "Grupo %s" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "Group By" +msgstr "Agrupar por" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__group_ids +msgid "Groups" +msgstr "Grupos" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__has_comment +msgid "Has Comment" +msgstr "Ha comentado" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__id +msgid "ID" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_create +msgid "" +"If set, all possible reviewers will be notified by email when this " +"definition is triggered." +msgstr "" +"Si se establece, todos los posibles revisores serán notificados por correo " +"electrónico cuando se active esta definición." + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_accepted +msgid "" +"If set, reviewers will be notified by email when a review related to this " +"definition is accepted." +msgstr "" +"Si está establecido, los revisores serán notificados por email cuando una " +"revisión relativa a ésta definición es aceptada." + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_rejected +msgid "" +"If set, reviewers will be notified by email when a review related to this " +"definition is rejected." +msgstr "" +"Si está establecido, los revisores serán notificados por email cuando una " +"revisión relativa a ésta definición es rechazada." + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_restarted +msgid "" +"If set, reviewers will be notified by email when a reviews related to this " +"definition are restarted." +msgstr "" +"Si está establecido, los revisores serán notificados por email cuando una " +"revisión relativa a ésta definición se ha reiniciado." + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "It's fully validated" +msgstr "Completamente Validado" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "It's in the validation process" +msgstr "Está en proceso de Validación" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard____last_update +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition____last_update +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review____last_update +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception____last_update +msgid "Last Modified on" +msgstr "Última modificación en" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__write_uid +msgid "Last Updated by" +msgstr "Última actualización de" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__write_date +msgid "Last Updated on" +msgstr "Última actualización en" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_name +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Model" +msgstr "Modelo" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "More Options" +msgstr "Más opciones" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__name +msgid "Name" +msgstr "Nombre" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__need_validation +msgid "Need Validation" +msgstr "Necesita validación" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_definition.py:0 +#, python-format +msgid "New Tier Validation" +msgstr "Nueva Validación de Nivel" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__next_review +msgid "Next Review" +msgstr "Siguiente Revisión" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "Next: %s" +msgstr "Siguiente: %s" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#, python-format +msgid "No reviews to do." +msgstr "No hay revisiones a realizar." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_accepted +msgid "Notify Reviewers on Accepted" +msgstr "Notificar revisores cuando se Acepta" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_create +msgid "Notify Reviewers on Creation" +msgstr "Notificar a los revisores en la creación" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_rejected +msgid "Notify Reviewers on Rejected" +msgstr "Notificar revisores cuando se Rechaza" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_restarted +msgid "Notify Reviewers on Restarted" +msgstr "Notificar revisores cuando se Reinicia" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "" +"Once created, you can decide which fields you want to be editable when the " +"record:" +msgstr "" +"Una vez creada, puedes decidir qué campos quieres que sean editables en el " +"registro:" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "Operation has been rejected." +msgstr "La operación ha sido rechazada." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "Operation has been validated!" +msgstr "¡La operación ha sido validada!" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Option to forward a tier validation to other reviewer, and backward" +msgstr "" +"Opción de reenviar una validación de nivel a otro revisor, y hacia atrás" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Option to use python formula to get reviewers and find documents" +msgstr "" +"Opción de utilizar una fórmula python para obtener revisores y encontrar " +"documentos" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__pending +#, python-format +msgid "Pending" +msgstr "Pendiente" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model_id +msgid "Referenced Model" +msgstr "Modelo referenciado" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Reject" +msgstr "Rechazar" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__rejected +msgid "Rejected" +msgstr "Rechazado" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__rejected_message +msgid "Rejected Message" +msgstr "Mensaje rechazado" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__res_id +msgid "Related Document ID" +msgstr "ID del Documento Relacionado" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__model +msgid "Related Document Model" +msgstr "Modelo del Documento Relacionado" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Request Validation" +msgstr "Solicitar validación" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__requested_by +msgid "Requested By" +msgstr "Solicitado Por" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#, python-format +msgid "Requested by" +msgstr "Solicitado Por" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_id +msgid "Res" +msgstr "Recurso" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_model +msgid "Res Model" +msgstr "Modelo Res" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Restart Validation" +msgstr "Reiniciar la Validación" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__review_ids +msgid "Review" +msgstr "Revisor" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_id +msgid "Reviewer" +msgstr "Revisor" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_field_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_field_id +msgid "Reviewer field" +msgstr "Campo revisor" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_group_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_group_id +msgid "Reviewer group" +msgstr "Grupo revisor" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_ids +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__reviewer_ids +msgid "Reviewers" +msgstr "Revisores" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_res_users__review_ids +#, python-format +msgid "Reviews" +msgstr "Revisiones" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__sequence +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence +#, python-format +msgid "Sequence" +msgstr "Secuencia" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__individual +msgid "Specific user" +msgstr "Usuario específico" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__status +#, python-format +msgid "Status" +msgstr "Estado" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "The review has been reset by %s." +msgstr "La revisión ha sido reiniciada por %s." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +#, python-format +msgid "There are no res.users in the selected field" +msgstr "No hay res.usuarios en el campo seleccionado" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "This %s needs to be validated" +msgstr "Este %s necesita ser validado" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "" +"This action needs to be validated for at least one record. \n" +"Please request a validation." +msgstr "" +"Esta acción necesita ser validada para algún registro.\n" +"Por favor, solicita una validación." + +#. module: base_tier_validation +#: model:ir.actions.act_window,name:base_tier_validation.tier_definition_action +#: model:ir.model,name:base_tier_validation.model_tier_definition +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_definition +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Tier Definition" +msgstr "Definición de Nivel" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_formula +msgid "Tier Formula" +msgstr "Fórmula de niveles" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_forward +msgid "Tier Forward & Backward" +msgstr "Nivel hacia delante y hacia atrás" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_review +msgid "Tier Review" +msgstr "Revisión de Nivel" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Tier Validation" +msgstr "Validación por niveles" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation +msgid "Tier Validation (abstract)" +msgstr "Validaciones de Nivel (abstracto)" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_accepted +msgid "Tier Validation Accepted Notification" +msgstr "Notificación de Validación de Nivel Aceptada" + +#. module: base_tier_validation +#: model:ir.actions.act_window,name:base_tier_validation.tier_validation_exception_action +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_validation_exception +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_form +msgid "Tier Validation Exception" +msgstr "Excepción de Validación del Tier" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation_exception +msgid "Tier Validation Exceptions" +msgstr "Excepciones de Validación del Tier" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_rejected +msgid "Tier Validation Rejected Notification" +msgstr "Validación de nivel Notificación rechazada" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested +msgid "Tier Validation Requested" +msgstr "Validación de nivel solicitada" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_restarted +msgid "Tier Validation Restarted" +msgstr "Validación de nivel reiniciada" + +#. module: base_tier_validation +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_confirmation +msgid "Tier Validations" +msgstr "Validaciones de Nivel" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__to_validate_message +msgid "To Validate Message" +msgstr "Para validar el mensaje" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__todo_by +msgid "Todo By" +msgstr "Por hacer por" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#, python-format +msgid "Todo by" +msgstr "Para hacer por" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_users +msgid "User" +msgstr "Usuario" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__valid_model_field_ids +msgid "Valid Model Field" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__valid_reviewer_field_ids +msgid "Valid Reviewer Field" +msgstr "Campo Revisor válido" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Validate" +msgstr "Validar" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__validate_reject +msgid "Validate Reject" +msgstr "Validar Rechazar" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__validated +msgid "Validated" +msgstr "Validado" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validated_message +msgid "Validated Message" +msgstr "Mensaje Validado" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__review_type +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__review_type +msgid "Validated by" +msgstr "Validado por" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewed_date +#, python-format +msgid "Validation Date" +msgstr "Fecha de Validación" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewed_formated_date +msgid "Validation Formated Date" +msgstr "Fecha de Validación Formateada" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validation_status +msgid "Validation Status" +msgstr "Estado de validación" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__review_ids +msgid "Validations" +msgstr "Validaciones" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__no +msgid "Without validation" +msgstr "Sin validación" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_after_validation +msgid "Write after Validation" +msgstr "Escritura tras Validación" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Write after validation" +msgstr "Escritura tras validación" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_under_validation +msgid "Write under Validation" +msgstr "Escritura mientras Validación" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Write under validation" +msgstr "Escritura mientras validación" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "" +"You are not allowed to write those fields after validation.\n" +"- %(not_allowed_fields)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields)s" +msgstr "" +"No puedes escribir estos campos tras una validación.\n" +"- %(not_allowed_fields)s\n" +"\n" +"Solo estos campos pueden ser modificados:\n" +"- %(allowed_fields)s" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "" +"You are not allowed to write those fields under validation.\n" +"- %(not_allowed_fields)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields)s" +msgstr "" +"No puedes escribir estos campos mientras está validándose.\n" +"- %(not_allowed_fields)s\n" +"\n" +"Solo estos campos pueden ser modificados:\n" +"- %(allowed_fields)s" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "e.g. Tier Validation for..." +msgstr "ej. Validación de Nivel por..." + +#~ msgid "" +#~ "\n" +#~ " This Record needs to be\n" +#~ " validated." +#~ msgstr "" +#~ "\n" +#~ " Este registro debe ser\n" +#~ " validado." + +#~ msgid "" +#~ "\n" +#~ " Operation has been\n" +#~ " rejected\n" +#~ " ." +#~ msgstr "" +#~ "\n" +#~ " La operación ha sido\n" +#~ " rechazada\n" +#~ " ." + +#~ msgid "" +#~ "\n" +#~ " Operation has been\n" +#~ " validated\n" +#~ " !" +#~ msgstr "" +#~ "\n" +#~ " La operación ha sido\n" +#~ " validada\n" +#~ " !" + +#~ msgid "Tier" +#~ msgstr "Secuencia" diff --git a/base_tier_validation/i18n/es_MX.po b/base_tier_validation/i18n/es_MX.po new file mode 100644 index 00000000..b39c7105 --- /dev/null +++ b/base_tier_validation/i18n/es_MX.po @@ -0,0 +1,916 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_tier_validation +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2021-08-16 22:50+0000\n" +"Last-Translator: Jesús Alan Ramos Rodríguez \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 4.3.2\n" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#, python-format +msgid "0 Pending" +msgstr "0 Pendientes" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid " This Record needs to be validated." +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid " Operation has been rejected." +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid " Operation has been validated!" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Name" +msgstr "Nombre" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Bypassed, if previous tier was validated by same reviewer" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review has been requested by %s." +msgstr "%s ha solicitado una revisión." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was accepted" +msgstr "Se aceptó una revisión" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was accepted. (%s)" +msgstr "Se aceptó una revisión. (%s)" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was rejected by %(user)s. (%(comment)s)" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was rejected by %s." +msgstr "%s rechazó una revisión." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A validation process is still open for at least one record." +msgstr "" +"Todavía hay un proceso de validación abierto para al menos un registro." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__active +msgid "Active" +msgstr "Activo" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#, python-format +msgid "Activity" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "All" +msgstr "Todos" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_validation_exception__group_ids +msgid "Allowed groups to use this Tier Validation Exception" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__group +msgid "Any user in a specific group" +msgstr "Cualquier usuario de un grupo específico" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Apply On" +msgstr "Aplicar en" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__approve_sequence +msgid "Approval order by the specified sequence number" +msgstr "Orden de aprobación por el número de secuencia especificado" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__approve_sequence_bypass +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__approve_sequence_bypass +msgid "Approve Sequence Bypass" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__approve_sequence +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__approve_sequence +msgid "Approve by sequence" +msgstr "Aprobar por secuencia" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__approved +msgid "Approved" +msgstr "Aprobado" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Archived" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation_exception.py:0 +#, python-format +msgid "" +"At least one of these fields must be checked! Write under Validation, Write " +"after Validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence_bypass +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__approve_sequence_bypass +msgid "" +"Bypassed (auto validated), if previous tier was validated by same reviewer" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__can_review +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__can_review +msgid "Can Review" +msgstr "Puede revisar" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__can_review +msgid "" +"Can review will be marked if the review is pending and the\n" +" approve sequence has been achieved" +msgstr "" +"Puede revisar se marcará si la revisión está pendiente y\n" +" se ha logrado aprobar la secuencia" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +msgid "Cancel" +msgstr "Cancelado" + +#. module: base_tier_validation +#. odoo-javascript +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__has_comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__has_comment +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +#, python-format +msgid "Comment" +msgstr "Comentario" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_comment_wizard +msgid "Comment Wizard" +msgstr "Asistente de comentarios" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__comment +msgid "Comments" +msgstr "Comentarios" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__company_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__company_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__company_id +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Company" +msgstr "Empresa" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "Create a new Validation Exception!" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__create_date +msgid "Created on" +msgstr "Creado en" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_type +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__definition_id +msgid "Definition" +msgstr "Definición de Nivel" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_domain +msgid "Definition Domain" +msgstr "Dominio de definición" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__name +#, python-format +msgid "Description" +msgstr "Descripción" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__display_name +msgid "Display Name" +msgstr "Nombre mostrado" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_status +msgid "Display Status" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__definition_type__domain +msgid "Domain" +msgstr "Dominio" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__done_by +msgid "Done By" +msgstr "Realizado por" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#, python-format +msgid "Done by" +msgstr "Realizado por" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__field +msgid "Field in related record" +msgstr "Campo en registro relacionado" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__field_ids +msgid "Fields" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +#, python-format +msgid "Group %s" +msgstr "Grupo %s" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "Group By" +msgstr "Agrupar por" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__group_ids +msgid "Groups" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__has_comment +msgid "Has Comment" +msgstr "Tiene comentario" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__id +msgid "ID" +msgstr "Identificación" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_create +msgid "" +"If set, all possible reviewers will be notified by email when this " +"definition is triggered." +msgstr "" +"Si se establece, todos los posibles revisores serán notificados por correo " +"electrónico cuando se active esta definición." + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_accepted +msgid "" +"If set, reviewers will be notified by email when a review related to this " +"definition is accepted." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_rejected +msgid "" +"If set, reviewers will be notified by email when a review related to this " +"definition is rejected." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_restarted +msgid "" +"If set, reviewers will be notified by email when a reviews related to this " +"definition are restarted." +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "It's fully validated" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "It's in the validation process" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard____last_update +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition____last_update +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review____last_update +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception____last_update +msgid "Last Modified on" +msgstr "Última modificación el" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__write_uid +msgid "Last Updated by" +msgstr "Última modificación por" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__write_date +msgid "Last Updated on" +msgstr "Última modificación en" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_name +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Model" +msgstr "Modelo" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "More Options" +msgstr "Más opciones" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__name +msgid "Name" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__need_validation +msgid "Need Validation" +msgstr "Necesita validación" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_definition.py:0 +#, python-format +msgid "New Tier Validation" +msgstr "Nueva Definición de Nivel" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__next_review +msgid "Next Review" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "Next: %s" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#, python-format +msgid "No reviews to do." +msgstr "No hay revisiones que hacer." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_accepted +msgid "Notify Reviewers on Accepted" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_create +msgid "Notify Reviewers on Creation" +msgstr "Notificar a los revisores sobre la creación" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_rejected +msgid "Notify Reviewers on Rejected" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_restarted +msgid "Notify Reviewers on Restarted" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "" +"Once created, you can decide which fields you want to be editable when the " +"record:" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "Operation has been rejected." +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "Operation has been validated!" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Option to forward a tier validation to other reviewer, and backward" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Option to use python formula to get reviewers and find documents" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__pending +#, python-format +msgid "Pending" +msgstr "Pendiente" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model_id +msgid "Referenced Model" +msgstr "Modelo referenciado" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Reject" +msgstr "Rechazar" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__rejected +msgid "Rejected" +msgstr "Rechazado" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__rejected_message +msgid "Rejected Message" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__res_id +msgid "Related Document ID" +msgstr "ID de documento relacionado" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__model +msgid "Related Document Model" +msgstr "Modelo de documento relacionado" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Request Validation" +msgstr "Solicitar Validación" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__requested_by +msgid "Requested By" +msgstr "Solicitado por" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#, python-format +msgid "Requested by" +msgstr "Solicitado por" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_id +msgid "Res" +msgstr "Res" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_model +msgid "Res Model" +msgstr "Modelo Res" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Restart Validation" +msgstr "Reiniciar la validación" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__review_ids +msgid "Review" +msgstr "Revisión" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_id +msgid "Reviewer" +msgstr "Evaluador" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_field_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_field_id +msgid "Reviewer field" +msgstr "Campo de revisor" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_group_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_group_id +msgid "Reviewer group" +msgstr "Grupo de revisores" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_ids +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__reviewer_ids +msgid "Reviewers" +msgstr "Revisores" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_res_users__review_ids +#, python-format +msgid "Reviews" +msgstr "Comentarios" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__sequence +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence +#, python-format +msgid "Sequence" +msgstr "Secuencia" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__individual +msgid "Specific user" +msgstr "Usuario específico" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__status +#, python-format +msgid "Status" +msgstr "Estatus" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "The review has been reset by %s." +msgstr "%s ha restablecido la revisión." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +#, python-format +msgid "There are no res.users in the selected field" +msgstr "No hay res.users en el campo seleccionado" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "This %s needs to be validated" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "" +"This action needs to be validated for at least one record. \n" +"Please request a validation." +msgstr "" +"Esta acción debe validarse para al menos un registro.\n" +"Solicite una validación." + +#. module: base_tier_validation +#: model:ir.actions.act_window,name:base_tier_validation.tier_definition_action +#: model:ir.model,name:base_tier_validation.model_tier_definition +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_definition +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Tier Definition" +msgstr "Definición de Nivel" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_formula +msgid "Tier Formula" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_forward +msgid "Tier Forward & Backward" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_review +msgid "Tier Review" +msgstr "Revisión de niveles" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Tier Validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation +msgid "Tier Validation (abstract)" +msgstr "Validación de nivel (resumen)" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_accepted +msgid "Tier Validation Accepted Notification" +msgstr "Notificación de validación de nivel aceptada" + +#. module: base_tier_validation +#: model:ir.actions.act_window,name:base_tier_validation.tier_validation_exception_action +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_validation_exception +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_form +msgid "Tier Validation Exception" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation_exception +msgid "Tier Validation Exceptions" +msgstr "" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_rejected +msgid "Tier Validation Rejected Notification" +msgstr "Notificación de rechazo de validación de nivel" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested +msgid "Tier Validation Requested" +msgstr "Validación de nivel solicitada" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_restarted +msgid "Tier Validation Restarted" +msgstr "Se reinició la validación de nivel" + +#. module: base_tier_validation +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_confirmation +msgid "Tier Validations" +msgstr "Validaciones de nivel" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__to_validate_message +msgid "To Validate Message" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__todo_by +msgid "Todo By" +msgstr "Por Hacer por" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#, python-format +msgid "Todo by" +msgstr "Por Hacer por" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_users +msgid "User" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__valid_model_field_ids +msgid "Valid Model Field" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__valid_reviewer_field_ids +msgid "Valid Reviewer Field" +msgstr "Campo de revisor válido" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Validate" +msgstr "Validar" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__validate_reject +msgid "Validate Reject" +msgstr "Validar Rechazar" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__validated +msgid "Validated" +msgstr "Validado" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validated_message +msgid "Validated Message" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__review_type +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__review_type +msgid "Validated by" +msgstr "Validado por" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewed_date +#, python-format +msgid "Validation Date" +msgstr "Fecha de validación" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewed_formated_date +msgid "Validation Formated Date" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validation_status +msgid "Validation Status" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__review_ids +msgid "Validations" +msgstr "Validaciones" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__no +msgid "Without validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_after_validation +msgid "Write after Validation" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Write after validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_under_validation +msgid "Write under Validation" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Write under validation" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "" +"You are not allowed to write those fields after validation.\n" +"- %(not_allowed_fields)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields)s" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "" +"You are not allowed to write those fields under validation.\n" +"- %(not_allowed_fields)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields)s" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "e.g. Tier Validation for..." +msgstr "p.ej. Validación de nivel para ..." + +#~ msgid "" +#~ "\n" +#~ " This Record needs to be\n" +#~ " validated." +#~ msgstr "" +#~ "\n" +#~ " Este registro necesita ser\n" +#~ " validado." + +#~ msgid "" +#~ "\n" +#~ " Operation has been\n" +#~ " rejected\n" +#~ " ." +#~ msgstr "" +#~ "\n" +#~ " La operación ha sido\n" +#~ " rechazada\n" +#~ " ." + +#~ msgid "" +#~ "\n" +#~ " Operation has been\n" +#~ " validated\n" +#~ " !" +#~ msgstr "" +#~ "\n" +#~ " ¡La operación ha sido\n" +#~ " validada\n" +#~ " !" + +#, python-format +#~ msgid "The operation is under validation." +#~ msgstr "La operación está en proceso de validación." + +#, python-format +#~ msgid "Activities" +#~ msgstr "Actividades" + +#~ msgid "Users" +#~ msgstr "Usuarios" + +#~ msgid "A review was rejected by {}. ({})" +#~ msgstr "{} rechazó una revisión. ({})" diff --git a/base_tier_validation/i18n/fr.po b/base_tier_validation/i18n/fr.po new file mode 100644 index 00000000..12624ce8 --- /dev/null +++ b/base_tier_validation/i18n/fr.po @@ -0,0 +1,936 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_tier_validation +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-07-04 09:47+0000\n" +"Last-Translator: Pierre-François Teyssier \n" +"Language-Team: none\n" +"Language: fr\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 4.17\n" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#, python-format +msgid "0 Pending" +msgstr "0 en attente" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid " This Record needs to be validated." +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid " Operation has been rejected." +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid " Operation has been validated!" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Name" +msgstr "Nom" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Bypassed, if previous tier was validated by same reviewer" +msgstr "" +"Contourné, si le niveau précédent a été validé par le même réviseur" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review has been requested by %s." +msgstr "Une revue a été demandée par %s." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was accepted" +msgstr "Une revue a été acceptée" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was accepted. (%s)" +msgstr "Une revue a été acceptée. (%s)" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was rejected by %(user)s. (%(comment)s)" +msgstr "Une revue a été refusée par %(user)s. (%(comment)s)" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was rejected by %s." +msgstr "Une revue a été refusée par %s." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A validation process is still open for at least one record." +msgstr "" +"Un processus de validation est toujours en cours pour au moins un " +"enregistrement." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__active +msgid "Active" +msgstr "Actif" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#, python-format +msgid "Activity" +msgstr "Activité" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "All" +msgstr "Tout" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_validation_exception__group_ids +msgid "Allowed groups to use this Tier Validation Exception" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__group +msgid "Any user in a specific group" +msgstr "Tout utilisateur d'un groupe spécifique" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Apply On" +msgstr "Appliquer sur" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__approve_sequence +msgid "Approval order by the specified sequence number" +msgstr "Ordre d'approbation suivant le numéro de séquence spécifié" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__approve_sequence_bypass +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__approve_sequence_bypass +msgid "Approve Sequence Bypass" +msgstr "Contournement de l'ordre d'approbation" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__approve_sequence +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__approve_sequence +msgid "Approve by sequence" +msgstr "Approuver dans l'ordre" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__approved +msgid "Approved" +msgstr "Approuvé" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Archived" +msgstr "Archivé" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation_exception.py:0 +#, python-format +msgid "" +"At least one of these fields must be checked! Write under Validation, Write " +"after Validation" +msgstr "" +"Au moins un de ces champs doit être sélectionné ! Écrire avant la " +"validation, Écrire après la validation" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence_bypass +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__approve_sequence_bypass +msgid "" +"Bypassed (auto validated), if previous tier was validated by same reviewer" +msgstr "" +"Controuné (auto validé), si le niveau précédent a été validé par le même " +"réviseur" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__can_review +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__can_review +msgid "Can Review" +msgstr "Revue possible" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__can_review +msgid "" +"Can review will be marked if the review is pending and the\n" +" approve sequence has been achieved" +msgstr "" +"La revue est marquée possible lorsqu'elle est en attente et\n" +" qu'une séquence d'approbation a été effectuée" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +msgid "Cancel" +msgstr "Annuler" + +#. module: base_tier_validation +#. odoo-javascript +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__has_comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__has_comment +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +#, python-format +msgid "Comment" +msgstr "Commentaire" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_comment_wizard +msgid "Comment Wizard" +msgstr "Assistant de saisie de commentaire" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__comment +msgid "Comments" +msgstr "Commentaires" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__company_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__company_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__company_id +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Company" +msgstr "Société" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_config_settings +msgid "Config Settings" +msgstr "Paramètres de configuration" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "Create a new Validation Exception!" +msgstr "Créer une nouvelle exception de validation !" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__create_uid +msgid "Created by" +msgstr "Créé par" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__create_date +msgid "Created on" +msgstr "Créé le" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_type +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__definition_id +msgid "Definition" +msgstr "Définition" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_domain +msgid "Definition Domain" +msgstr "Domaine de la définition" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__name +#, python-format +msgid "Description" +msgstr "Description" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__display_name +msgid "Display Name" +msgstr "Nom d'affichage" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_status +msgid "Display Status" +msgstr "Afficher les statuts" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__definition_type__domain +msgid "Domain" +msgstr "Domaine" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__done_by +msgid "Done By" +msgstr "Fait par" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#, python-format +msgid "Done by" +msgstr "Fait par" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__field +msgid "Field in related record" +msgstr "Champ dans l'enregistrement rattaché" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__field_ids +msgid "Fields" +msgstr "Champs" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +#, python-format +msgid "Group %s" +msgstr "Groupe %s" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "Group By" +msgstr "Regrouper par" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__group_ids +msgid "Groups" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__has_comment +msgid "Has Comment" +msgstr "Avec commentaire" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__id +msgid "ID" +msgstr "ID" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_create +msgid "" +"If set, all possible reviewers will be notified by email when this " +"definition is triggered." +msgstr "" +"Avec cette option, tous les réviseurs autorisés seront notifiés par email " +"lors du déclenchement de cette définition." + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_accepted +msgid "" +"If set, reviewers will be notified by email when a review related to this " +"definition is accepted." +msgstr "" +"Si défini, les réviseurs seront notifiés par email quand une revue liée à " +"cette définition est acceptée." + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_rejected +msgid "" +"If set, reviewers will be notified by email when a review related to this " +"definition is rejected." +msgstr "" +"Si défini, les réviseurs seront notifiés par email quand une revue liée à " +"cette définition est rejetée." + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_restarted +msgid "" +"If set, reviewers will be notified by email when a reviews related to this " +"definition are restarted." +msgstr "" +"Si défini, les réviseurs seront notifiés par email quand une revue liée à " +"cette définition est recommencée." + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "It's fully validated" +msgstr "Entièrement validé" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "It's in the validation process" +msgstr "En cours de processus de validation" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard____last_update +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition____last_update +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review____last_update +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception____last_update +msgid "Last Modified on" +msgstr "Dernière modification le" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__write_uid +msgid "Last Updated by" +msgstr "Dernière mise à jour par" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__write_date +msgid "Last Updated on" +msgstr "Dernière mise à jour le" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_name +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Model" +msgstr "Modèle" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "More Options" +msgstr "Plus d'options" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__name +msgid "Name" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__need_validation +msgid "Need Validation" +msgstr "Validation requise" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_definition.py:0 +#, python-format +msgid "New Tier Validation" +msgstr "Nouveau niveau de validation" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__next_review +msgid "Next Review" +msgstr "Revue suivante" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "Next: %s" +msgstr "Suivante : %s" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#, python-format +msgid "No reviews to do." +msgstr "Aucune revue n'est nécessaire." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_accepted +msgid "Notify Reviewers on Accepted" +msgstr "Notiifer les réviseurs à l'acceptation" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_create +msgid "Notify Reviewers on Creation" +msgstr "Notifier les réviseurs à la création" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_rejected +msgid "Notify Reviewers on Rejected" +msgstr "Notifier les réviseurs au refus" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_restarted +msgid "Notify Reviewers on Restarted" +msgstr "Notifier les révisieurs au redémarrage" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "" +"Once created, you can decide which fields you want to be editable when the " +"record:" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "Operation has been rejected." +msgstr "L'opération a été rejetée." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "Operation has been validated!" +msgstr "L'opération a été validée !" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Option to forward a tier validation to other reviewer, and backward" +msgstr "" +"Option pour transmettre le niveau de validation à un autre réviseur, et " +"inversement" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Option to use python formula to get reviewers and find documents" +msgstr "" +"Option pour utiliser une formule python pour calculer les réviseurs et " +"déterminer les enregistrements" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__pending +#, python-format +msgid "Pending" +msgstr "En attente" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model_id +msgid "Referenced Model" +msgstr "Modèle rattaché" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Reject" +msgstr "Rejeter" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__rejected +msgid "Rejected" +msgstr "Rejeté" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__rejected_message +msgid "Rejected Message" +msgstr "Message de rejet" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__res_id +msgid "Related Document ID" +msgstr "ID de l'enregistrement rattaché" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__model +msgid "Related Document Model" +msgstr "Modèle de l'enregistrement rattaché" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Request Validation" +msgstr "Demander validation" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__requested_by +msgid "Requested By" +msgstr "Demandé par" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#, python-format +msgid "Requested by" +msgstr "Demandé par" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_id +msgid "Res" +msgstr "Enregistrement" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_model +msgid "Res Model" +msgstr "Modèle de l'enregistrement" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Restart Validation" +msgstr "Recommencer la validation" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__review_ids +msgid "Review" +msgstr "Revue" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_id +msgid "Reviewer" +msgstr "Réviseur" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_field_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_field_id +msgid "Reviewer field" +msgstr "Champ du réviseur" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_group_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_group_id +msgid "Reviewer group" +msgstr "Groupe des réviseurs" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_ids +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__reviewer_ids +msgid "Reviewers" +msgstr "Réviseurs" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_res_users__review_ids +#, python-format +msgid "Reviews" +msgstr "Revues" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__sequence +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence +#, python-format +msgid "Sequence" +msgstr "Séquence" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__individual +msgid "Specific user" +msgstr "Utilisateur spécifique" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__status +#, python-format +msgid "Status" +msgstr "Statut" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "The review has been reset by %s." +msgstr "Cette revue a été réinitialisée par %s." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +#, python-format +msgid "There are no res.users in the selected field" +msgstr "Le champ sélectionné ne référence pas des res.users" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "This %s needs to be validated" +msgstr "%s : Cet enregistrement requiert une validation" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "" +"This action needs to be validated for at least one record. \n" +"Please request a validation." +msgstr "" +"Cette action requiert une validation pour au moins un des enregistrements. \n" +"Veuillez demander cette validation." + +#. module: base_tier_validation +#: model:ir.actions.act_window,name:base_tier_validation.tier_definition_action +#: model:ir.model,name:base_tier_validation.model_tier_definition +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_definition +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Tier Definition" +msgstr "Définition de niveau" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_formula +msgid "Tier Formula" +msgstr "Formules sur les niveaux" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_forward +msgid "Tier Forward & Backward" +msgstr "Délégation des niveaux" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_review +msgid "Tier Review" +msgstr "Revue d'un niveau" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Tier Validation" +msgstr "Validation par niveau" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation +msgid "Tier Validation (abstract)" +msgstr "Validation d'un niveau (modèle abstrait)" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_accepted +msgid "Tier Validation Accepted Notification" +msgstr "Validation par niveau - Notification - Acceptée" + +#. module: base_tier_validation +#: model:ir.actions.act_window,name:base_tier_validation.tier_validation_exception_action +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_validation_exception +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_form +msgid "Tier Validation Exception" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation_exception +msgid "Tier Validation Exceptions" +msgstr "" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_rejected +msgid "Tier Validation Rejected Notification" +msgstr "Validation par niveau - Notification - Rejetée" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested +msgid "Tier Validation Requested" +msgstr "Validation par niveau - Demandée" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_restarted +msgid "Tier Validation Restarted" +msgstr "Validation par niveau - Redémarrée" + +#. module: base_tier_validation +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_confirmation +msgid "Tier Validations" +msgstr "Validations par niveau" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__to_validate_message +msgid "To Validate Message" +msgstr "Message de demande de validation" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__todo_by +msgid "Todo By" +msgstr "À faire par" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#, python-format +msgid "Todo by" +msgstr "À faire par" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_users +msgid "User" +msgstr "Utilisateur" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__valid_model_field_ids +msgid "Valid Model Field" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__valid_reviewer_field_ids +msgid "Valid Reviewer Field" +msgstr "Champs réviseur valides" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Validate" +msgstr "Valider" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__validate_reject +msgid "Validate Reject" +msgstr "Validation / Rejet" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__validated +msgid "Validated" +msgstr "Validé" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validated_message +msgid "Validated Message" +msgstr "Message de validation" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__review_type +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__review_type +msgid "Validated by" +msgstr "Validé par" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewed_date +#, python-format +msgid "Validation Date" +msgstr "Date de validation" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewed_formated_date +msgid "Validation Formated Date" +msgstr "Date de validation formatée" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validation_status +msgid "Validation Status" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__review_ids +msgid "Validations" +msgstr "Validations" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__no +msgid "Without validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_after_validation +msgid "Write after Validation" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Write after validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_under_validation +msgid "Write under Validation" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Write under validation" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "" +"You are not allowed to write those fields after validation.\n" +"- %(not_allowed_fields)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields)s" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "" +"You are not allowed to write those fields under validation.\n" +"- %(not_allowed_fields)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields)s" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "e.g. Tier Validation for..." +msgstr "par ex Niveau de validation pour..." + +#~ msgid "" +#~ "\n" +#~ " This Record needs to be\n" +#~ " validated." +#~ msgstr "" +#~ "\n" +#~ " Cet enregistrement.\n" +#~ " requiert une validation." + +#~ msgid "" +#~ "\n" +#~ " Operation has been\n" +#~ " rejected\n" +#~ " ." +#~ msgstr "" +#~ "\n" +#~ " L'opération a été\n" +#~ " rejetée\n" +#~ " ." + +#~ msgid "" +#~ "\n" +#~ " Operation has been\n" +#~ " validated\n" +#~ " !" +#~ msgstr "" +#~ "\n" +#~ " L'opération a été\n" +#~ " validée\n" +#~ " !" + +#, python-format +#~ msgid "The operation is under validation." +#~ msgstr "Cette opération est en cours de validation." + +#, python-format +#~ msgid "Activities" +#~ msgstr "Activités" + +#~ msgid "Users" +#~ msgstr "Utilisateurs" + +#~ msgid "A review was rejected by {}. ({})" +#~ msgstr "Une vérification a été refusée par {}. ({})" + +#~ msgid "Any user in a specific group." +#~ msgstr "Tout utilisateur d'un groupe spécifique." diff --git a/base_tier_validation/i18n/it.po b/base_tier_validation/i18n/it.po new file mode 100644 index 00000000..0eb8634e --- /dev/null +++ b/base_tier_validation/i18n/it.po @@ -0,0 +1,953 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_tier_validation +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-07-18 09:58+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.6.2\n" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#, python-format +msgid "0 Pending" +msgstr "0 in attesa" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid " This Record needs to be validated." +msgstr " Il record deve essere validato." + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid " Operation has been rejected." +msgstr " L'operazione è stata rifiutata." + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid " Operation has been validated!" +msgstr " L'operazione è stata validata!" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Name" +msgstr "Nome" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Bypassed, if previous tier was validated by same reviewer" +msgstr "" +"Aggirato, se il livello precedente è stato validato dallo stesso " +"revisore" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review has been requested by %s." +msgstr "Un'approvazione è stata richiesta da %s." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was accepted" +msgstr "Un'approvazione è stata accettata" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was accepted. (%s)" +msgstr "Un'approvazione è stata accettata. (%s)" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was rejected by %(user)s. (%(comment)s)" +msgstr "È stata rifiutata una revisione da %(user)s. (%(comment)s)" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was rejected by %s." +msgstr "Una revisione è stata rifiutata da %s." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A validation process is still open for at least one record." +msgstr "Un processo di approvazione è ancora aperto per almeno un record." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__active +msgid "Active" +msgstr "Attivo" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#, python-format +msgid "Activity" +msgstr "Attività" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "All" +msgstr "Tutto" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_validation_exception__group_ids +msgid "Allowed groups to use this Tier Validation Exception" +msgstr "Grupi autorizzati ad utilizzare questa eccezione validazione livello" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__group +msgid "Any user in a specific group" +msgstr "Qualunque utente in un gruppo specifico" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Apply On" +msgstr "Applica a" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__approve_sequence +msgid "Approval order by the specified sequence number" +msgstr "Ordine di approvazione specificato da numero sequenza" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__approve_sequence_bypass +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__approve_sequence_bypass +msgid "Approve Sequence Bypass" +msgstr "Approva salto sequenza" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__approve_sequence +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__approve_sequence +msgid "Approve by sequence" +msgstr "Approva in sequenza" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__approved +msgid "Approved" +msgstr "Approvato" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Archived" +msgstr "In archivio" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation_exception.py:0 +#, python-format +msgid "" +"At least one of these fields must be checked! Write under Validation, Write " +"after Validation" +msgstr "" +"Almeno uno di questi campi deve essere selezionato! Scrivi in valutazione, " +"Scrivi dopo validazione" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence_bypass +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__approve_sequence_bypass +msgid "" +"Bypassed (auto validated), if previous tier was validated by same reviewer" +msgstr "" +"Saltato (auto validato), se il livello precedente è stato validato dallo " +"stesso revisore" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__can_review +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__can_review +msgid "Can Review" +msgstr "Può revisionare" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__can_review +msgid "" +"Can review will be marked if the review is pending and the\n" +" approve sequence has been achieved" +msgstr "" +"\"Può approvare\" sarà attivo se l'approvazione è in sospeso e la\n" +" sequenza di approvazione è archiviata" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +msgid "Cancel" +msgstr "Annulla" + +#. module: base_tier_validation +#. odoo-javascript +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__has_comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__has_comment +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +#, python-format +msgid "Comment" +msgstr "Commento" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_comment_wizard +msgid "Comment Wizard" +msgstr "Procedura guidata commento" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__comment +msgid "Comments" +msgstr "Commenti" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__company_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__company_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__company_id +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Company" +msgstr "Azienda" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_config_settings +msgid "Config Settings" +msgstr "Impostazioni configurazione" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "Create a new Validation Exception!" +msgstr "Crea una nuova eccezione di validazione!" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__create_uid +msgid "Created by" +msgstr "Creato da" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__create_date +msgid "Created on" +msgstr "Creato il" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_type +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__definition_id +msgid "Definition" +msgstr "Definizione" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_domain +msgid "Definition Domain" +msgstr "Dominio Definizione" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__name +#, python-format +msgid "Description" +msgstr "Descrizione" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__display_name +msgid "Display Name" +msgstr "Nome visualizzato" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_status +msgid "Display Status" +msgstr "Visualizza stato" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__definition_type__domain +msgid "Domain" +msgstr "Dominio" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__done_by +msgid "Done By" +msgstr "Eseguito Da" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#, python-format +msgid "Done by" +msgstr "Eseguito da" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__field +msgid "Field in related record" +msgstr "Campo in record collegato" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__field_ids +msgid "Fields" +msgstr "Campi" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +#, python-format +msgid "Group %s" +msgstr "Gruppo %s" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "Group By" +msgstr "Raggruppa per" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__group_ids +msgid "Groups" +msgstr "Gruppi" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__has_comment +msgid "Has Comment" +msgstr "Ha commenti" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__id +msgid "ID" +msgstr "ID" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_create +msgid "" +"If set, all possible reviewers will be notified by email when this " +"definition is triggered." +msgstr "" +"Se impostata, tutti i possibili revisori saranno avvisati via e-mail quando " +"la definizione è attivata." + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_accepted +msgid "" +"If set, reviewers will be notified by email when a review related to this " +"definition is accepted." +msgstr "" +"Se impostata, i revisori verranno avvisati con e-mail quando una revisione " +"relativa a questa definizione viene accettata." + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_rejected +msgid "" +"If set, reviewers will be notified by email when a review related to this " +"definition is rejected." +msgstr "" +"Se impostata, i revisori verranno avvisati con e-mail quando una revisione " +"relativa a questa definizione viene respinta." + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_restarted +msgid "" +"If set, reviewers will be notified by email when a reviews related to this " +"definition are restarted." +msgstr "" +"Se impostata, i revisori verranno avvisati con e-mail quando una revisione " +"relativa a questa definizione viene riavviata." + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "It's fully validated" +msgstr "Completamente validato" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "It's in the validation process" +msgstr "È nel processo di validazione" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard____last_update +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition____last_update +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review____last_update +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception____last_update +msgid "Last Modified on" +msgstr "Ultima modifica il" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__write_uid +msgid "Last Updated by" +msgstr "Ultimo aggiornamento di" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__write_date +msgid "Last Updated on" +msgstr "Ultimo aggiornamento il" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_name +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Model" +msgstr "Modello" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "More Options" +msgstr "Più Opzioni" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__name +msgid "Name" +msgstr "Nome" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__need_validation +msgid "Need Validation" +msgstr "Richiede conferma" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_definition.py:0 +#, python-format +msgid "New Tier Validation" +msgstr "Nuovo Livello Approvazione" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__next_review +msgid "Next Review" +msgstr "Prossima revisione" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "Next: %s" +msgstr "Prossimo: %s" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#, python-format +msgid "No reviews to do." +msgstr "Nessuna approvazione da fare." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_accepted +msgid "Notify Reviewers on Accepted" +msgstr "Notifica revisori all'accettazione" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_create +msgid "Notify Reviewers on Creation" +msgstr "Notifica Approvatori su Creazione" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_rejected +msgid "Notify Reviewers on Rejected" +msgstr "Notifica revisori quando respinta" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_restarted +msgid "Notify Reviewers on Restarted" +msgstr "Notifica revisori al riavvio" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "" +"Once created, you can decide which fields you want to be editable when the " +"record:" +msgstr "" +"Una volta creato, si può decidere quali campi si vogliono modificare quando " +"il record:" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "Operation has been rejected." +msgstr "L'operazione è stata rifiutata." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "Operation has been validated!" +msgstr "L'operazione è stata validata!" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Option to forward a tier validation to other reviewer, and backward" +msgstr "" +"Opzione per inoltrare una approvazione ad un altro approvatore e ritorno" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Option to use python formula to get reviewers and find documents" +msgstr "" +"Opzione per usare una formula python per ottenere revisori e trovare " +"documenti" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__pending +#, python-format +msgid "Pending" +msgstr "In attesa" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model_id +msgid "Referenced Model" +msgstr "Modello referenziato" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Reject" +msgstr "Rifiuta" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__rejected +msgid "Rejected" +msgstr "Rifiutato" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__rejected_message +msgid "Rejected Message" +msgstr "Messaggio di rifiuto" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__res_id +msgid "Related Document ID" +msgstr "ID documento correlato" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__model +msgid "Related Document Model" +msgstr "Modello documento correlato" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Request Validation" +msgstr "Richiedi validazione" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__requested_by +msgid "Requested By" +msgstr "Richiesta da" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#, python-format +msgid "Requested by" +msgstr "Richiesta da" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_id +msgid "Res" +msgstr "Res" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_model +msgid "Res Model" +msgstr "Modello res" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Restart Validation" +msgstr "Riavvia validazione" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__review_ids +msgid "Review" +msgstr "Approvazione" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_id +msgid "Reviewer" +msgstr "Revisore" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_field_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_field_id +msgid "Reviewer field" +msgstr "Campo approvatore" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_group_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_group_id +msgid "Reviewer group" +msgstr "Gruppo revisore" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_ids +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__reviewer_ids +msgid "Reviewers" +msgstr "Revisori" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_res_users__review_ids +#, python-format +msgid "Reviews" +msgstr "Revisioni" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__sequence +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence +#, python-format +msgid "Sequence" +msgstr "Sequenza" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__individual +msgid "Specific user" +msgstr "Utente specifico" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__status +#, python-format +msgid "Status" +msgstr "Stato" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "The review has been reset by %s." +msgstr "L'approvazione è stata riavviata da %s." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +#, python-format +msgid "There are no res.users in the selected field" +msgstr "Non ci sono res.users nel campo selezionato" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "This %s needs to be validated" +msgstr "Questo %s deve essere approvato" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "" +"This action needs to be validated for at least one record. \n" +"Please request a validation." +msgstr "" +"Questa azione richiede di essere approvata per almeno un record.\n" +"Prego richiedere un'approvazione." + +#. module: base_tier_validation +#: model:ir.actions.act_window,name:base_tier_validation.tier_definition_action +#: model:ir.model,name:base_tier_validation.model_tier_definition +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_definition +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Tier Definition" +msgstr "Definizione livello" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_formula +msgid "Tier Formula" +msgstr "Formula livello" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_forward +msgid "Tier Forward & Backward" +msgstr "Aumente e riduci livello" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_review +msgid "Tier Review" +msgstr "Revisione livello" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Tier Validation" +msgstr "Conferma livello" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation +msgid "Tier Validation (abstract)" +msgstr "Validazione livello (sintesi)" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_accepted +msgid "Tier Validation Accepted Notification" +msgstr "Notifica accettazione livello approvazione" + +#. module: base_tier_validation +#: model:ir.actions.act_window,name:base_tier_validation.tier_validation_exception_action +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_validation_exception +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_form +msgid "Tier Validation Exception" +msgstr "Eccezione validazione livello" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation_exception +msgid "Tier Validation Exceptions" +msgstr "Eccezioni validazione livello" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_rejected +msgid "Tier Validation Rejected Notification" +msgstr "Notifica rifiuto livello approvazione" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested +msgid "Tier Validation Requested" +msgstr "Approvazione livello richiesta" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_restarted +msgid "Tier Validation Restarted" +msgstr "Approvazione Riavviata" + +#. module: base_tier_validation +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_confirmation +msgid "Tier Validations" +msgstr "Livelli di Approvazione" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__to_validate_message +msgid "To Validate Message" +msgstr "Messaggio per 'Da validare'" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__todo_by +msgid "Todo By" +msgstr "Incaricati" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#, python-format +msgid "Todo by" +msgstr "Incaricati" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_users +msgid "User" +msgstr "Utente" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__valid_model_field_ids +msgid "Valid Model Field" +msgstr "Campo modello valido" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__valid_reviewer_field_ids +msgid "Valid Reviewer Field" +msgstr "Campo revisore valido" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Validate" +msgstr "Approva" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__validate_reject +msgid "Validate Reject" +msgstr "Rifiuta Approvazione" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__validated +msgid "Validated" +msgstr "Approvato" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validated_message +msgid "Validated Message" +msgstr "Messaggio per 'Validato'" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__review_type +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__review_type +msgid "Validated by" +msgstr "Validato da" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewed_date +#, python-format +msgid "Validation Date" +msgstr "Data approvazione" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewed_formated_date +msgid "Validation Formated Date" +msgstr "Data formattata validazione" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validation_status +msgid "Validation Status" +msgstr "Stato validazione" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__review_ids +msgid "Validations" +msgstr "Validazioni" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__no +msgid "Without validation" +msgstr "Senza validazione" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_after_validation +msgid "Write after Validation" +msgstr "Scrivi dopo validazione" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Write after validation" +msgstr "Scrivi dopo validazione" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_under_validation +msgid "Write under Validation" +msgstr "Scrivi in validazione" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Write under validation" +msgstr "Scrivi in validazione" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "" +"You are not allowed to write those fields after validation.\n" +"- %(not_allowed_fields)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields)s" +msgstr "" +"Non si è abilitati a scrivere questi campi dopo la validazione.\n" +"- %(not_allowed_fields)s\n" +"\n" +"Solo questi campi possono essere modificati:\n" +"- %(allowed_fields)s" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "" +"You are not allowed to write those fields under validation.\n" +"- %(not_allowed_fields)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields)s" +msgstr "" +"Non si è abilitati a modificare questi campi in validazione.\n" +"- %(not_allowed_fields)s\n" +"\n" +"Solo questi campi possono essere modificati:\n" +"- %(allowed_fields)s" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "e.g. Tier Validation for..." +msgstr "es. Validazione livello per ..." + +#~ msgid "" +#~ "\n" +#~ " This Record needs to be\n" +#~ " validated." +#~ msgstr "" +#~ "\n" +#~ " Questo Record necessita di\n" +#~ " approvazione." + +#~ msgid "" +#~ "\n" +#~ " Operation has been\n" +#~ " rejected\n" +#~ " ." +#~ msgstr "" +#~ "\n" +#~ " L'operazione è stata\n" +#~ " rifiutata\n" +#~ " ." + +#~ msgid "" +#~ "\n" +#~ " Operation has been\n" +#~ " validated\n" +#~ " !" +#~ msgstr "" +#~ "\n" +#~ " L'operazione è stata\n" +#~ " approvata\n" +#~ " !" + +#~ msgid "Model" +#~ msgstr "Modello" + +#, python-format +#~ msgid "" +#~ "The model already exists for this company with this Write Validation " +#~ "configuration!" +#~ msgstr "" +#~ "Il modello esiste già per questa azienda con questa configurazione di " +#~ "scrittura validazione!" + +#, python-format +#~ msgid "The operation is under validation." +#~ msgstr "L'operazione è sotto approvazione." + +#, python-format +#~ msgid "Activities" +#~ msgstr "Attività" + +#~ msgid "Users" +#~ msgstr "Utenti" + +#~ msgid "A review was rejected by {}. ({})" +#~ msgstr "Un'approvazione è stata rifiutata da {}. ({})" diff --git a/base_tier_validation/i18n/nl_NL.po b/base_tier_validation/i18n/nl_NL.po new file mode 100644 index 00000000..f4022116 --- /dev/null +++ b/base_tier_validation/i18n/nl_NL.po @@ -0,0 +1,937 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_tier_validation +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 13.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-01-07 01:59+0000\n" +"Last-Translator: Bosd \n" +"Language-Team: none\n" +"Language: nl_NL\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 4.17\n" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#, python-format +msgid "0 Pending" +msgstr "0 In afwachting" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid " This Record needs to be validated." +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid " Operation has been rejected." +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid " Operation has been validated!" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Name" +msgstr "Naam" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Bypassed, if previous tier was validated by same reviewer" +msgstr "" +"Overslaan, als het vorige niveau door dezelfde beoordelaar is " +"gevalideerd" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review has been requested by %s." +msgstr "Een beoordeling is aangevraagd door %s." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was accepted" +msgstr "Een beoordeling is geaccepteerd" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was accepted. (%s)" +msgstr "Een beoordeling is geaccepteerd. (%s)" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was rejected by %(user)s. (%(comment)s)" +msgstr "Een validatie is afgewezen door %(user)s. (%(comment)s)" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was rejected by %s." +msgstr "Een beoordeling is afgewezen door %s." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A validation process is still open for at least one record." +msgstr "Er is nog steeds een validatieproces open voor ten minste één record." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__active +msgid "Active" +msgstr "Actief" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#, python-format +msgid "Activity" +msgstr "Activiteit" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "All" +msgstr "Alle" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_validation_exception__group_ids +msgid "Allowed groups to use this Tier Validation Exception" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__group +msgid "Any user in a specific group" +msgstr "Elke gebruiker in een specifieke groep" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Apply On" +msgstr "Toepassen op" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__approve_sequence +msgid "Approval order by the specified sequence number" +msgstr "Goedkeuringsvolgorde op basis van het opgegeven volgnummer" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__approve_sequence_bypass +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__approve_sequence_bypass +msgid "Approve Sequence Bypass" +msgstr "Beoordeel volgorde omzeilen" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__approve_sequence +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__approve_sequence +msgid "Approve by sequence" +msgstr "Goedkeuren op volgorde" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__approved +msgid "Approved" +msgstr "Goedgekeurd" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Archived" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation_exception.py:0 +#, python-format +msgid "" +"At least one of these fields must be checked! Write under Validation, Write " +"after Validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence_bypass +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__approve_sequence_bypass +msgid "" +"Bypassed (auto validated), if previous tier was validated by same reviewer" +msgstr "" +"Overgeslagen (automatisch gevalideerd), als het vorige niveau door dezelfde " +"beoordelaar is gevalideerd" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__can_review +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__can_review +msgid "Can Review" +msgstr "Kan beoordelen" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__can_review +msgid "" +"Can review will be marked if the review is pending and the\n" +" approve sequence has been achieved" +msgstr "" +"Kan beoordelen wordt gemarkeerd als de beoordeling in behandeling is en de\n" +" goedkeuringssequentie is bereikt" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +msgid "Cancel" +msgstr "Annuleer" + +#. module: base_tier_validation +#. odoo-javascript +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__has_comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__has_comment +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +#, python-format +msgid "Comment" +msgstr "Opmerking" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_comment_wizard +msgid "Comment Wizard" +msgstr "Opmerking Wizard" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__comment +msgid "Comments" +msgstr "Opmerkingen" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__company_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__company_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__company_id +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Company" +msgstr "Bedrijf" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_config_settings +#, fuzzy +msgid "Config Settings" +msgstr "Configuratie Instellingen" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "Create a new Validation Exception!" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__create_uid +msgid "Created by" +msgstr "Bedrijf" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__create_date +msgid "Created on" +msgstr "Aangemaakt door" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_type +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__definition_id +msgid "Definition" +msgstr "Definitie" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_domain +msgid "Definition Domain" +msgstr "Definitiedomein" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__name +#, python-format +msgid "Description" +msgstr "Omschrijving" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__display_name +msgid "Display Name" +msgstr "Weergavenaam" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_status +msgid "Display Status" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__definition_type__domain +msgid "Domain" +msgstr "Domein" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__done_by +msgid "Done By" +msgstr "Gedaan door" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#, python-format +msgid "Done by" +msgstr "Gedaan door" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__field +msgid "Field in related record" +msgstr "Veld in verwante record" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__field_ids +msgid "Fields" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +#, python-format +msgid "Group %s" +msgstr "Groep %s" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "Group By" +msgstr "Groeperen op" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__group_ids +msgid "Groups" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__has_comment +msgid "Has Comment" +msgstr "Heeft commentaar" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__id +msgid "ID" +msgstr "ID" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_create +msgid "" +"If set, all possible reviewers will be notified by email when this " +"definition is triggered." +msgstr "" +"Indien ingesteld, worden alle mogelijke reviewers per e-mail op de hoogte " +"gebracht wanneer deze definitie wordt geactiveerd." + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_accepted +msgid "" +"If set, reviewers will be notified by email when a review related to this " +"definition is accepted." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_rejected +msgid "" +"If set, reviewers will be notified by email when a review related to this " +"definition is rejected." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_restarted +msgid "" +"If set, reviewers will be notified by email when a reviews related to this " +"definition are restarted." +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "It's fully validated" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "It's in the validation process" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard____last_update +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition____last_update +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review____last_update +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception____last_update +msgid "Last Modified on" +msgstr "Laatst gewijzigd op" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__write_uid +msgid "Last Updated by" +msgstr "Laatst bijgewerkt door" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__write_date +msgid "Last Updated on" +msgstr "Laatst bijgewerkt op" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_name +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Model" +msgstr "Model" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "More Options" +msgstr "Meer Opties" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__name +msgid "Name" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__need_validation +msgid "Need Validation" +msgstr "Validatie nodig" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_definition.py:0 +#, python-format +msgid "New Tier Validation" +msgstr "Nieuwe Tier-validatie" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__next_review +msgid "Next Review" +msgstr "Volgende Beoordeling" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "Next: %s" +msgstr "Volgende: %s" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#, python-format +msgid "No reviews to do." +msgstr "Geen beoordelingen te doen." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_accepted +msgid "Notify Reviewers on Accepted" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_create +msgid "Notify Reviewers on Creation" +msgstr "Informeer beoordelaar bij het maken" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_rejected +msgid "Notify Reviewers on Rejected" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_restarted +msgid "Notify Reviewers on Restarted" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "" +"Once created, you can decide which fields you want to be editable when the " +"record:" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "Operation has been rejected." +msgstr "Operatie is afgewezen." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "Operation has been validated!" +msgstr "Operation has been Goedgekeurd!" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Option to forward a tier validation to other reviewer, and backward" +msgstr "" +"Optie om een validatie door te sturen naar een andere beoordelaar en terug" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Option to use python formula to get reviewers and find documents" +msgstr "" +"Optie om pythonformule te gebruiken om beoordelaars te krijgen en documenten " +"te vinden" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__pending +#, python-format +msgid "Pending" +msgstr "In afwachting" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model_id +msgid "Referenced Model" +msgstr "Referentiemodel" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Reject" +msgstr "Weiger" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__rejected +msgid "Rejected" +msgstr "Afgekeurd" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__rejected_message +msgid "Rejected Message" +msgstr "Afgewezen bericht" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__res_id +msgid "Related Document ID" +msgstr "Gerelateerde document-ID" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__model +msgid "Related Document Model" +msgstr "Verwant documentmodel" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Request Validation" +msgstr "Verzoek valideren" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__requested_by +msgid "Requested By" +msgstr "Aangevraagd door" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#, python-format +msgid "Requested by" +msgstr "Aangevraagd door" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_id +msgid "Res" +msgstr "Res" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_model +msgid "Res Model" +msgstr "Res model" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Restart Validation" +msgstr "Herstart Beoordeling" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__review_ids +msgid "Review" +msgstr "Beoordeling" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_id +msgid "Reviewer" +msgstr "Beoordelaar" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_field_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_field_id +msgid "Reviewer field" +msgstr "Beoordelaar veld" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_group_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_group_id +msgid "Reviewer group" +msgstr "Beoordeel groep" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_ids +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__reviewer_ids +msgid "Reviewers" +msgstr "Beoordelaars" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_res_users__review_ids +#, python-format +msgid "Reviews" +msgstr "Beoordelingen" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__sequence +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence +#, python-format +msgid "Sequence" +msgstr "Volgorde" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__individual +msgid "Specific user" +msgstr "Specifieke gebruiker" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__status +#, python-format +msgid "Status" +msgstr "Status" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "The review has been reset by %s." +msgstr "De beoordeling is opnieuw gestart door %s." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +#, python-format +msgid "There are no res.users in the selected field" +msgstr "Er zijn geen res.users in het geselecteerde veld" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "This %s needs to be validated" +msgstr "Dit %s dient te worden beoordeeld" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "" +"This action needs to be validated for at least one record. \n" +"Please request a validation." +msgstr "" +"Deze actie moet voor ten minste één record gevalideerd worden.\n" +"Vraag een validatie aan." + +#. module: base_tier_validation +#: model:ir.actions.act_window,name:base_tier_validation.tier_definition_action +#: model:ir.model,name:base_tier_validation.model_tier_definition +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_definition +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Tier Definition" +msgstr "Tier definitie" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_formula +msgid "Tier Formula" +msgstr "Niveau Formule" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_forward +msgid "Tier Forward & Backward" +msgstr "Niveau Vooruit & Achteruit" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_review +msgid "Tier Review" +msgstr "Tier beoordeling" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Tier Validation" +msgstr "Niveauvalidatie" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation +msgid "Tier Validation (abstract)" +msgstr "Tier-validatie (abstract)" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_accepted +#, fuzzy +msgid "Tier Validation Accepted Notification" +msgstr "Tier-validatie (abstract)" + +#. module: base_tier_validation +#: model:ir.actions.act_window,name:base_tier_validation.tier_validation_exception_action +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_validation_exception +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_form +msgid "Tier Validation Exception" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation_exception +msgid "Tier Validation Exceptions" +msgstr "" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_rejected +#, fuzzy +msgid "Tier Validation Rejected Notification" +msgstr "Tier-validatie (abstract)" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested +msgid "Tier Validation Requested" +msgstr "" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_restarted +msgid "Tier Validation Restarted" +msgstr "Niveauvalidatie opnieuw gestart" + +#. module: base_tier_validation +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_confirmation +msgid "Tier Validations" +msgstr "Tier-validaties" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__to_validate_message +msgid "To Validate Message" +msgstr "Bericht valideren" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__todo_by +msgid "Todo By" +msgstr "Te doen door" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#, python-format +msgid "Todo by" +msgstr "Te doen door" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_users +msgid "User" +msgstr "Gebruiker" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__valid_model_field_ids +msgid "Valid Model Field" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__valid_reviewer_field_ids +msgid "Valid Reviewer Field" +msgstr "Geldig beoordelaarsveld" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Validate" +msgstr "Valideer" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__validate_reject +msgid "Validate Reject" +msgstr "Valideren weigeren" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__validated +msgid "Validated" +msgstr "Gevalideerd" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validated_message +msgid "Validated Message" +msgstr "Gevalideerd bericht" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__review_type +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__review_type +msgid "Validated by" +msgstr "Gevalideerd door" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewed_date +#, python-format +msgid "Validation Date" +msgstr "Validatie datum" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewed_formated_date +msgid "Validation Formated Date" +msgstr "Validatie Datum" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validation_status +msgid "Validation Status" +msgstr "Validatie Status" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__review_ids +msgid "Validations" +msgstr "Validaties" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__no +msgid "Without validation" +msgstr "Zonder validatie" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_after_validation +msgid "Write after Validation" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Write after validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_under_validation +msgid "Write under Validation" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Write under validation" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "" +"You are not allowed to write those fields after validation.\n" +"- %(not_allowed_fields)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields)s" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "" +"You are not allowed to write those fields under validation.\n" +"- %(not_allowed_fields)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields)s" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "e.g. Tier Validation for..." +msgstr "bijv. Tier validatie voor..." + +#~ msgid "" +#~ "\n" +#~ " This Record needs to be\n" +#~ " validated." +#~ msgstr "" +#~ "\n" +#~ " Dit Record dient te worden\n" +#~ " beoordeeld." + +#~ msgid "" +#~ "\n" +#~ " Operation has been\n" +#~ " rejected\n" +#~ " ." +#~ msgstr "" +#~ "\n" +#~ " Aanvraag is \n" +#~ " afgewezen\n" +#~ " ." + +#~ msgid "" +#~ "\n" +#~ " Operation has been\n" +#~ " validated\n" +#~ " !" +#~ msgstr "" +#~ "\n" +#~ " Aanvraag is\n" +#~ " Gevalideerd\n" +#~ " !" + +#, python-format +#~ msgid "The operation is under validation." +#~ msgstr "De bewerking is onder validatie." + +#~ msgid "Tier" +#~ msgstr "Tier" + +#, fuzzy, python-format +#~ msgid "Activities" +#~ msgstr "Actief" + +#~ msgid "Users" +#~ msgstr "Gebruikers" + +#~ msgid "A review was rejected by {}. ({})" +#~ msgstr "Een beoordeling is afgewezen door {}. ({})" + +#~ msgid "Any user in a specific group." +#~ msgstr "Elke gebruiker in een specifieke groep." + +#~ msgid "Object" +#~ msgstr "Object" + +#~ msgid "Approve Sequence" +#~ msgstr "Volgorde goedkeuren" diff --git a/base_tier_validation/i18n/sv.po b/base_tier_validation/i18n/sv.po new file mode 100644 index 00000000..22624014 --- /dev/null +++ b/base_tier_validation/i18n/sv.po @@ -0,0 +1,937 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_tier_validation +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2024-02-27 11:35+0000\n" +"Last-Translator: jakobkrabbe \n" +"Language-Team: none\n" +"Language: sv\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 4.17\n" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#, python-format +msgid "0 Pending" +msgstr "0 Väntar" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid " This Record needs to be validated." +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid " Operation has been rejected." +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid " Operation has been validated!" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Name" +msgstr "Namn" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Bypassed, if previous tier was validated by same reviewer" +msgstr "" +"Förbigås om föregående nivå validerades av samma granskare" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review has been requested by %s." +msgstr "En granskning har begärts av %s." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was accepted" +msgstr "En granskning accepterades" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was accepted. (%s)" +msgstr "En granskning accepterades. (%s)" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was rejected by %(user)s. (%(comment)s)" +msgstr "En granskning nekades av %(user)s. (%(comment)s)" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was rejected by %s." +msgstr "En granskning nekades av %s." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A validation process is still open for at least one record." +msgstr "En valideringsprocess är fortfarande öppen för minst en post." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__active +msgid "Active" +msgstr "Aktiv" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#, python-format +msgid "Activity" +msgstr "Aktivitet" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "All" +msgstr "Alla" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_validation_exception__group_ids +msgid "Allowed groups to use this Tier Validation Exception" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__group +msgid "Any user in a specific group" +msgstr "Alla användare i en specifik grupp" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Apply On" +msgstr "Applicera på" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__approve_sequence +msgid "Approval order by the specified sequence number" +msgstr "Godkännandeordning enligt angivet sekvensnummer" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__approve_sequence_bypass +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__approve_sequence_bypass +msgid "Approve Sequence Bypass" +msgstr "Attest av förbikoppling" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__approve_sequence +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__approve_sequence +msgid "Approve by sequence" +msgstr "Attest i viss ordning" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__approved +msgid "Approved" +msgstr "Attesterad" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Archived" +msgstr "Arkiverad" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation_exception.py:0 +#, python-format +msgid "" +"At least one of these fields must be checked! Write under Validation, Write " +"after Validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence_bypass +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__approve_sequence_bypass +msgid "" +"Bypassed (auto validated), if previous tier was validated by same reviewer" +msgstr "" +"Förbikopplad (autovaliderad), om föregående nivå validerades av samma " +"granskare" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__can_review +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__can_review +msgid "Can Review" +msgstr "Kan granska" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__can_review +msgid "" +"Can review will be marked if the review is pending and the\n" +" approve sequence has been achieved" +msgstr "" +"Kan attesteras kommer att vara ikryssad om attest är i kö och\n" +" attestsekvensen har uppnåtts" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +msgid "Cancel" +msgstr "Avbryt" + +#. module: base_tier_validation +#. odoo-javascript +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__has_comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__has_comment +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +#, python-format +msgid "Comment" +msgstr "Kommentar" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_comment_wizard +msgid "Comment Wizard" +msgstr "Kommentarsguide" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__comment +msgid "Comments" +msgstr "Kommentarer" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__company_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__company_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__company_id +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Company" +msgstr "Bolag" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_config_settings +msgid "Config Settings" +msgstr "Konfigurationsinställningar" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "Create a new Validation Exception!" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__create_uid +msgid "Created by" +msgstr "Skapad av" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__create_date +msgid "Created on" +msgstr "Skapad den" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_type +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__definition_id +msgid "Definition" +msgstr "Definition" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_domain +msgid "Definition Domain" +msgstr "Definitionsdomän" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__name +#, python-format +msgid "Description" +msgstr "Beskrivning" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__display_name +msgid "Display Name" +msgstr "Visningsnamn" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_status +msgid "Display Status" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__definition_type__domain +msgid "Domain" +msgstr "Domän" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__done_by +msgid "Done By" +msgstr "Gjord av" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#, python-format +msgid "Done by" +msgstr "Gjord av" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__field +msgid "Field in related record" +msgstr "Fält i relaterad post" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__field_ids +msgid "Fields" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +#, python-format +msgid "Group %s" +msgstr "Grupp %s" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "Group By" +msgstr "Gruppera efter" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__group_ids +msgid "Groups" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__has_comment +msgid "Has Comment" +msgstr "Har kommentar" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__id +msgid "ID" +msgstr "ID" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_create +msgid "" +"If set, all possible reviewers will be notified by email when this " +"definition is triggered." +msgstr "" +"Om den är inställd kommer alla möjliga attesterare att meddelas via e-post " +"när denna definition aktiveras." + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_accepted +msgid "" +"If set, reviewers will be notified by email when a review related to this " +"definition is accepted." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_rejected +msgid "" +"If set, reviewers will be notified by email when a review related to this " +"definition is rejected." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_restarted +msgid "" +"If set, reviewers will be notified by email when a reviews related to this " +"definition are restarted." +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "It's fully validated" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "It's in the validation process" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard____last_update +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition____last_update +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review____last_update +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception____last_update +msgid "Last Modified on" +msgstr "Senast ändrad den" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__write_uid +msgid "Last Updated by" +msgstr "Senast uppdaterad av" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__write_date +msgid "Last Updated on" +msgstr "Senast uppdaterad den" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_name +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Model" +msgstr "Modell" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "More Options" +msgstr "Fler alternativ" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__name +msgid "Name" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__need_validation +msgid "Need Validation" +msgstr "Behöver validering" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_definition.py:0 +#, python-format +msgid "New Tier Validation" +msgstr "Ny attestering" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__next_review +msgid "Next Review" +msgstr "Nästa granskning" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "Next: %s" +msgstr "Nästa: %s" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#, python-format +msgid "No reviews to do." +msgstr "Inga attester att göra." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_accepted +msgid "Notify Reviewers on Accepted" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_create +msgid "Notify Reviewers on Creation" +msgstr "Meddela granskare vid skapande" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_rejected +msgid "Notify Reviewers on Rejected" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_restarted +msgid "Notify Reviewers on Restarted" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "" +"Once created, you can decide which fields you want to be editable when the " +"record:" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "Operation has been rejected." +msgstr "Åtgärden har blivit avvisats." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "Operation has been validated!" +msgstr "Åtgärden har validerats!" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Option to forward a tier validation to other reviewer, and backward" +msgstr "" +"Alternativ för att vidarebefordra en attestering till en annan granskare och " +"bakåt" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Option to use python formula to get reviewers and find documents" +msgstr "" +"Alternativ för att använda python-formel för att få fram granskare och hitta " +"dokument" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__pending +#, python-format +msgid "Pending" +msgstr "Väntande" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model_id +msgid "Referenced Model" +msgstr "Refererad modell" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Reject" +msgstr "Neka" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__rejected +msgid "Rejected" +msgstr "Nekad" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__rejected_message +msgid "Rejected Message" +msgstr "Nekat meddelande" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__res_id +msgid "Related Document ID" +msgstr "ID för relaterat dokument" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__model +msgid "Related Document Model" +msgstr "Modell för relaterat dokument" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Request Validation" +msgstr "Begär attest" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__requested_by +msgid "Requested By" +msgstr "Begärd av" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#, python-format +msgid "Requested by" +msgstr "Begärd av" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_id +msgid "Res" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_model +msgid "Res Model" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Restart Validation" +msgstr "Starta om attest" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__review_ids +msgid "Review" +msgstr "Granska" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_id +msgid "Reviewer" +msgstr "Granskare" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_field_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_field_id +msgid "Reviewer field" +msgstr "Granskarfält" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_group_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_group_id +msgid "Reviewer group" +msgstr "Granskargrupp" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_ids +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__reviewer_ids +msgid "Reviewers" +msgstr "Granskare" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_res_users__review_ids +#, python-format +msgid "Reviews" +msgstr "Granskningar" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__sequence +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence +#, python-format +msgid "Sequence" +msgstr "Sekvens" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__individual +msgid "Specific user" +msgstr "Specifik användare" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__status +#, python-format +msgid "Status" +msgstr "Status" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "The review has been reset by %s." +msgstr "Attesten har återställts av %s." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +#, python-format +msgid "There are no res.users in the selected field" +msgstr "Det finns inga res.users i det valda fältet" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "This %s needs to be validated" +msgstr "Denna %s måste valideras" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "" +"This action needs to be validated for at least one record. \n" +"Please request a validation." +msgstr "" +"Denna åtgärd måste valideras för minst en post.\n" +"Vänligen begär en validering." + +#. module: base_tier_validation +#: model:ir.actions.act_window,name:base_tier_validation.tier_definition_action +#: model:ir.model,name:base_tier_validation.model_tier_definition +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_definition +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Tier Definition" +msgstr "Attestdefinition" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_formula +msgid "Tier Formula" +msgstr "Attestformel" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_forward +msgid "Tier Forward & Backward" +msgstr "Attest framåt och bakåt" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_review +msgid "Tier Review" +msgstr "Attestgranskning" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Tier Validation" +msgstr "Attestering" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation +msgid "Tier Validation (abstract)" +msgstr "Attestering (sammanfattning)" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_accepted +msgid "Tier Validation Accepted Notification" +msgstr "Meddelande vid accepterad attestering" + +#. module: base_tier_validation +#: model:ir.actions.act_window,name:base_tier_validation.tier_validation_exception_action +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_validation_exception +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_form +msgid "Tier Validation Exception" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation_exception +msgid "Tier Validation Exceptions" +msgstr "" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_rejected +msgid "Tier Validation Rejected Notification" +msgstr "Meddelande vid nekad attestering" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested +msgid "Tier Validation Requested" +msgstr "Attestering begärd" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_restarted +msgid "Tier Validation Restarted" +msgstr "Attestering omstartad" + +#. module: base_tier_validation +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_confirmation +msgid "Tier Validations" +msgstr "Attesteringar" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__to_validate_message +msgid "To Validate Message" +msgstr "Att validera meddelande" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__todo_by +msgid "Todo By" +msgstr "Att göra av" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#, python-format +msgid "Todo by" +msgstr "Att göra av" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_users +msgid "User" +msgstr "Användare" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__valid_model_field_ids +msgid "Valid Model Field" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__valid_reviewer_field_ids +msgid "Valid Reviewer Field" +msgstr "Granskarfält" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Validate" +msgstr "Validera" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__validate_reject +msgid "Validate Reject" +msgstr "Validera Neka" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__validated +msgid "Validated" +msgstr "Validerad" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validated_message +msgid "Validated Message" +msgstr "Validera meddelande" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__review_type +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__review_type +msgid "Validated by" +msgstr "Attesterad av" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewed_date +#, python-format +msgid "Validation Date" +msgstr "Attestdatum" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewed_formated_date +msgid "Validation Formated Date" +msgstr "Attestformaterat datum" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validation_status +msgid "Validation Status" +msgstr "Atteststatus" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__review_ids +msgid "Validations" +msgstr "Attesteringar" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__no +msgid "Without validation" +msgstr "Utan attestering" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_after_validation +msgid "Write after Validation" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Write after validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_under_validation +msgid "Write under Validation" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Write under validation" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "" +"You are not allowed to write those fields after validation.\n" +"- %(not_allowed_fields)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields)s" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "" +"You are not allowed to write those fields under validation.\n" +"- %(not_allowed_fields)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields)s" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "e.g. Tier Validation for..." +msgstr "t.ex. attest för..." + +#~ msgid "" +#~ "\n" +#~ " This Record needs to be\n" +#~ " validated." +#~ msgstr "" +#~ "\n" +#~ " Den här posten måste\n" +#~ " valideras." + +#~ msgid "" +#~ "\n" +#~ " Operation has been\n" +#~ " rejected\n" +#~ " ." +#~ msgstr "" +#~ "\n" +#~ " Åtgärden har\n" +#~ " nekats\n" +#~ " ." + +#~ msgid "" +#~ "\n" +#~ " Operation has been\n" +#~ " validated\n" +#~ " !" +#~ msgstr "" +#~ "\n" +#~ " Åtgärden har\n" +#~ " validerats\n" +#~ " !" + +#, python-format +#~ msgid "The operation is under validation." +#~ msgstr "Åtgärden håller på att attest." + +#, python-format +#~ msgid "Activities" +#~ msgstr "Aktiviteter" + +#~ msgid "More reports about tier validations, i.e., summary of all my reviews" +#~ msgstr "" +#~ "Fler rapporter om attesteringar, dvs. en sammanfattning av alla mina " +#~ "granskningar" + +#~ msgid "Option to trigger server actions on completion of tier reviews" +#~ msgstr "" +#~ "Alternativ för att utlösa serveråtgärder när attesteringar har slutförts" + +#~ msgid "Tier Reports" +#~ msgstr "Attestrapporter" + +#~ msgid "Tier Server Action" +#~ msgstr "Attestserveråtgärd" + +#~ msgid "Users" +#~ msgstr "Användare" + +#~ msgid "A review was rejected by {}. ({})" +#~ msgstr "En granskning nekades av {}. ({})" diff --git a/base_tier_validation/i18n/tr.po b/base_tier_validation/i18n/tr.po new file mode 100644 index 00000000..2b629f45 --- /dev/null +++ b/base_tier_validation/i18n/tr.po @@ -0,0 +1,908 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_tier_validation +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2023-02-08 06:14+0000\n" +"Last-Translator: Ediz Duman \n" +"Language-Team: none\n" +"Language: tr\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 4.14.1\n" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#, python-format +msgid "0 Pending" +msgstr "0 Bekleyen" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid " This Record needs to be validated." +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid " Operation has been rejected." +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid " Operation has been validated!" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Name" +msgstr "Adı" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Bypassed, if previous tier was validated by same reviewer" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review has been requested by %s." +msgstr "%s tarafından bir inceleme istendi." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was accepted" +msgstr "Bir inceleme kabul edildi" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was accepted. (%s)" +msgstr "Bir inceleme kabul edildi. (%s)" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was rejected by %(user)s. (%(comment)s)" +msgstr "Bir inceleme %(user)s tarafından reddedildi. (%(comment)s)" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was rejected by %s." +msgstr "Bir inceleme %s tarafından reddedildi." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A validation process is still open for at least one record." +msgstr "En az bir kayıt için hala bir doğrulama süreci açık." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__active +msgid "Active" +msgstr "Etkin" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#, python-format +msgid "Activity" +msgstr "Aktivite" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "All" +msgstr "Bütün" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_validation_exception__group_ids +msgid "Allowed groups to use this Tier Validation Exception" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__group +msgid "Any user in a specific group" +msgstr "Belirli bir gruptaki herhangi bir kullanıcı" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Apply On" +msgstr "Uygula" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__approve_sequence +msgid "Approval order by the specified sequence number" +msgstr "Belirtilen sıra numarasına göre onay sırası" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__approve_sequence_bypass +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__approve_sequence_bypass +msgid "Approve Sequence Bypass" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__approve_sequence +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__approve_sequence +msgid "Approve by sequence" +msgstr "Sıraya göre onayla" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__approved +msgid "Approved" +msgstr "Onaylı" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Archived" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation_exception.py:0 +#, python-format +msgid "" +"At least one of these fields must be checked! Write under Validation, Write " +"after Validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence_bypass +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__approve_sequence_bypass +msgid "" +"Bypassed (auto validated), if previous tier was validated by same reviewer" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__can_review +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__can_review +msgid "Can Review" +msgstr "Gözden Geçirebilir" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__can_review +msgid "" +"Can review will be marked if the review is pending and the\n" +" approve sequence has been achieved" +msgstr "" +"İnceleme beklemedeyse ve gözden geçirilebilirse işaretlenebilir.\n" +" onay dizisi elde edildi" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +msgid "Cancel" +msgstr "İptal" + +#. module: base_tier_validation +#. odoo-javascript +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__has_comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__has_comment +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +#, python-format +msgid "Comment" +msgstr "Yorum" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_comment_wizard +msgid "Comment Wizard" +msgstr "Yorum Sihirbazı" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__comment +msgid "Comments" +msgstr "Yorumlar" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__company_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__company_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__company_id +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Company" +msgstr "Şirket" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_config_settings +msgid "Config Settings" +msgstr "Yapılandırma Ayarları" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "Create a new Validation Exception!" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__create_uid +msgid "Created by" +msgstr "Oluşturan" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__create_date +msgid "Created on" +msgstr "Oluşturulma" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_type +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__definition_id +msgid "Definition" +msgstr "Tanım" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_domain +msgid "Definition Domain" +msgstr "Tanım Etki Alanı" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__name +#, python-format +msgid "Description" +msgstr "Açıklama" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__display_name +msgid "Display Name" +msgstr "Görünüm Adı" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_status +msgid "Display Status" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__definition_type__domain +msgid "Domain" +msgstr "Etki Alanı" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__done_by +msgid "Done By" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#, python-format +msgid "Done by" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__field +msgid "Field in related record" +msgstr "İlgili kayıttaki alan" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__field_ids +msgid "Fields" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +#, python-format +msgid "Group %s" +msgstr "Grup %s" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "Group By" +msgstr "Grupla" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__group_ids +msgid "Groups" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__has_comment +msgid "Has Comment" +msgstr "Yorum Var" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__id +msgid "ID" +msgstr "ID" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_create +msgid "" +"If set, all possible reviewers will be notified by email when this " +"definition is triggered." +msgstr "" +"Ayarlanırsa, bu tanım tetiklendiğinde tüm olası gözden geçirenler e-posta " +"ile bilgilendirilecektir." + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_accepted +msgid "" +"If set, reviewers will be notified by email when a review related to this " +"definition is accepted." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_rejected +msgid "" +"If set, reviewers will be notified by email when a review related to this " +"definition is rejected." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_restarted +msgid "" +"If set, reviewers will be notified by email when a reviews related to this " +"definition are restarted." +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "It's fully validated" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "It's in the validation process" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard____last_update +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition____last_update +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review____last_update +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception____last_update +msgid "Last Modified on" +msgstr "Son Düzenleme" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__write_uid +msgid "Last Updated by" +msgstr "Son Güncelleyen" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__write_date +msgid "Last Updated on" +msgstr "Son Güncelleme" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_name +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Model" +msgstr "Modeli" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "More Options" +msgstr "Daha Fazla Seçenek" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__name +msgid "Name" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__need_validation +msgid "Need Validation" +msgstr "Doğrulama Gerekiyor" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_definition.py:0 +#, python-format +msgid "New Tier Validation" +msgstr "Yeni Seviye Doğrulama" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__next_review +msgid "Next Review" +msgstr "Sonraki İnceleme" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "Next: %s" +msgstr "Sonraki: %s" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#, python-format +msgid "No reviews to do." +msgstr "Yapacak inceleme yok." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_accepted +msgid "Notify Reviewers on Accepted" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_create +msgid "Notify Reviewers on Creation" +msgstr "İncelemeleri Oluşturma Hakkında Bilgilendir" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_rejected +msgid "Notify Reviewers on Rejected" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_restarted +msgid "Notify Reviewers on Restarted" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "" +"Once created, you can decide which fields you want to be editable when the " +"record:" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "Operation has been rejected." +msgstr "İşlem reddedildi." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "Operation has been validated!" +msgstr "İşlem doğrulandı!" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Option to forward a tier validation to other reviewer, and backward" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Option to use python formula to get reviewers and find documents" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__pending +#, python-format +msgid "Pending" +msgstr "Bekleyen" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model_id +msgid "Referenced Model" +msgstr "Referans Model" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Reject" +msgstr "Reddet" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__rejected +msgid "Rejected" +msgstr "Reddedildi" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__rejected_message +msgid "Rejected Message" +msgstr "Reddedilen Mesaj" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__res_id +msgid "Related Document ID" +msgstr "İlgili Belge ID" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__model +msgid "Related Document Model" +msgstr "İlgili Belge Modeli" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Request Validation" +msgstr "Doğrulama İste" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__requested_by +msgid "Requested By" +msgstr "İsteyen" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#, python-format +msgid "Requested by" +msgstr "İsteyen" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_id +msgid "Res" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_model +msgid "Res Model" +msgstr "Res Model" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Restart Validation" +msgstr "Yeniden Doğrulama İste" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__review_ids +msgid "Review" +msgstr "İncele" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_id +msgid "Reviewer" +msgstr "İnceleyen" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_field_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_field_id +msgid "Reviewer field" +msgstr "İnceleme alanı" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_group_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_group_id +msgid "Reviewer group" +msgstr "İnceleme grubu" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_ids +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__reviewer_ids +msgid "Reviewers" +msgstr "İnceleyenler" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_res_users__review_ids +#, python-format +msgid "Reviews" +msgstr "İncelemeler" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__sequence +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence +#, python-format +msgid "Sequence" +msgstr "Sıra" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__individual +msgid "Specific user" +msgstr "Belirli kullanıcı" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__status +#, python-format +msgid "Status" +msgstr "Durumu" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "The review has been reset by %s." +msgstr "İnceleme %s tarafından sıfırlandı." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +#, python-format +msgid "There are no res.users in the selected field" +msgstr "Seçili alanda res.kullanıcı yok" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "This %s needs to be validated" +msgstr "Bu %s 'nin doğrulanması gerekiyor" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "" +"This action needs to be validated for at least one record. \n" +"Please request a validation." +msgstr "" +"Bu eylemin en az bir kayıt için doğrulanması gerekir.\n" +"Lütfen doğrulama isteğinde bulunun." + +#. module: base_tier_validation +#: model:ir.actions.act_window,name:base_tier_validation.tier_definition_action +#: model:ir.model,name:base_tier_validation.model_tier_definition +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_definition +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Tier Definition" +msgstr "Seviye Tanımı" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_formula +msgid "Tier Formula" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_forward +msgid "Tier Forward & Backward" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_review +msgid "Tier Review" +msgstr "Seviye İncelemesi" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Tier Validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation +msgid "Tier Validation (abstract)" +msgstr "Seviye Doğrulaması (özet)" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_accepted +msgid "Tier Validation Accepted Notification" +msgstr "Seviye Doğrulama Kabul Bildirimi" + +#. module: base_tier_validation +#: model:ir.actions.act_window,name:base_tier_validation.tier_validation_exception_action +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_validation_exception +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_form +msgid "Tier Validation Exception" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation_exception +msgid "Tier Validation Exceptions" +msgstr "" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_rejected +msgid "Tier Validation Rejected Notification" +msgstr "Seviye Doğrulaması Reddedildi Bildirimi" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested +msgid "Tier Validation Requested" +msgstr "Seviye Doğrulaması İstendi" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_restarted +msgid "Tier Validation Restarted" +msgstr "Seviye Doğrulaması Yeniden Başlatıldı" + +#. module: base_tier_validation +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_confirmation +msgid "Tier Validations" +msgstr "Seviye Doğrulamaları" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__to_validate_message +msgid "To Validate Message" +msgstr "Mesajı Doğrulamak İçin" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__todo_by +msgid "Todo By" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#, python-format +msgid "Todo by" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_users +msgid "User" +msgstr "Kullanıcı" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__valid_model_field_ids +msgid "Valid Model Field" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__valid_reviewer_field_ids +msgid "Valid Reviewer Field" +msgstr "Geçerli İnceleme Alanı" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Validate" +msgstr "Doğrula" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__validate_reject +msgid "Validate Reject" +msgstr "Reddetmeyi Doğrula" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__validated +msgid "Validated" +msgstr "Doğrulandı" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validated_message +msgid "Validated Message" +msgstr "Doğrulanmış Mesaj" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__review_type +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__review_type +msgid "Validated by" +msgstr "Doğrulayan" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewed_date +#, python-format +msgid "Validation Date" +msgstr "Doğrulama Tarihi" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewed_formated_date +msgid "Validation Formated Date" +msgstr "Doğrulama Format Tarihi" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validation_status +msgid "Validation Status" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__review_ids +msgid "Validations" +msgstr "Doğrulamalar" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__no +msgid "Without validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_after_validation +msgid "Write after Validation" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Write after validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_under_validation +msgid "Write under Validation" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Write under validation" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "" +"You are not allowed to write those fields after validation.\n" +"- %(not_allowed_fields)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields)s" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "" +"You are not allowed to write those fields under validation.\n" +"- %(not_allowed_fields)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields)s" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "e.g. Tier Validation for..." +msgstr "ör. Şunun için Seviye Doğrulaması..." + +#~ msgid "" +#~ "\n" +#~ " This Record needs to be\n" +#~ " validated." +#~ msgstr "" +#~ "\n" +#~ " Bu kaydın olması gerekiyor\n" +#~ " doğrulandı." + +#~ msgid "" +#~ "\n" +#~ " Operation has been\n" +#~ " rejected\n" +#~ " ." +#~ msgstr "" +#~ "\n" +#~ " operasyon yapıldı\n" +#~ " reddedildi\n" +#~ " ." + +#~ msgid "" +#~ "\n" +#~ " Operation has been\n" +#~ " validated\n" +#~ " !" +#~ msgstr "" +#~ "\n" +#~ " operasyon yapıldı\n" +#~ " doğrulandı\n" +#~ " !" + +#, python-format +#~ msgid "The operation is under validation." +#~ msgstr "İşlem doğrulama aşamasındadır." + +#~ msgid "Tier" +#~ msgstr "Seviye" diff --git a/base_tier_validation/i18n/zh_CN.po b/base_tier_validation/i18n/zh_CN.po new file mode 100644 index 00000000..8c6c2eca --- /dev/null +++ b/base_tier_validation/i18n/zh_CN.po @@ -0,0 +1,900 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_tier_validation +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 13.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2020-09-24 18:00+0000\n" +"Last-Translator: Dong \n" +"Language-Team: none\n" +"Language: zh_CN\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 3.10\n" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#, python-format +msgid "0 Pending" +msgstr "0 待审批" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid " This Record needs to be validated." +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid " Operation has been rejected." +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid " Operation has been validated!" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Name" +msgstr "名称" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Bypassed, if previous tier was validated by same reviewer" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review has been requested by %s." +msgstr "%s 发起审批请求。" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was accepted" +msgstr "审批已通过" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was accepted. (%s)" +msgstr "审批已通过。 ( %s )" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was rejected by %(user)s. (%(comment)s)" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was rejected by %s." +msgstr "%s 驳回了审批。" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A validation process is still open for at least one record." +msgstr "当前记录存在待批复的审批流程。" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__active +msgid "Active" +msgstr "有效" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#, python-format +msgid "Activity" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "All" +msgstr "所有" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_validation_exception__group_ids +msgid "Allowed groups to use this Tier Validation Exception" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__group +msgid "Any user in a specific group" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Apply On" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__approve_sequence +msgid "Approval order by the specified sequence number" +msgstr "审批按指定序号排序" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__approve_sequence_bypass +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__approve_sequence_bypass +msgid "Approve Sequence Bypass" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__approve_sequence +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__approve_sequence +msgid "Approve by sequence" +msgstr "按顺序审批" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__approved +msgid "Approved" +msgstr "已批准" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Archived" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation_exception.py:0 +#, python-format +msgid "" +"At least one of these fields must be checked! Write under Validation, Write " +"after Validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence_bypass +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__approve_sequence_bypass +msgid "" +"Bypassed (auto validated), if previous tier was validated by same reviewer" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__can_review +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__can_review +msgid "Can Review" +msgstr "可审批" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__can_review +msgid "" +"Can review will be marked if the review is pending and the\n" +" approve sequence has been achieved" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +msgid "Cancel" +msgstr "取消" + +#. module: base_tier_validation +#. odoo-javascript +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__has_comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__has_comment +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +#, python-format +msgid "Comment" +msgstr "审批意见" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_comment_wizard +msgid "Comment Wizard" +msgstr "审批意见向导" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__comment +msgid "Comments" +msgstr "审批意见" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__company_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__company_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__company_id +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Company" +msgstr "公司" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "Create a new Validation Exception!" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__create_uid +msgid "Created by" +msgstr "创建人" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__create_date +msgid "Created on" +msgstr "创建时间" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_type +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__definition_id +msgid "Definition" +msgstr "定义类型" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_domain +msgid "Definition Domain" +msgstr "定义域" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__name +#, python-format +msgid "Description" +msgstr "说明" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__display_name +msgid "Display Name" +msgstr "显示名称" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_status +msgid "Display Status" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__definition_type__domain +msgid "Domain" +msgstr "域" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__done_by +msgid "Done By" +msgstr "审批人" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#, python-format +msgid "Done by" +msgstr "审批人" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__field +msgid "Field in related record" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__field_ids +msgid "Fields" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +#, python-format +msgid "Group %s" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "Group By" +msgstr "分组" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__group_ids +msgid "Groups" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__has_comment +msgid "Has Comment" +msgstr "含审批意见" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__id +msgid "ID" +msgstr "ID" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_create +msgid "" +"If set, all possible reviewers will be notified by email when this " +"definition is triggered." +msgstr "如果设置,则触发此定义规则时将通过电子邮件通知所有的审批人。" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_accepted +msgid "" +"If set, reviewers will be notified by email when a review related to this " +"definition is accepted." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_rejected +msgid "" +"If set, reviewers will be notified by email when a review related to this " +"definition is rejected." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_restarted +msgid "" +"If set, reviewers will be notified by email when a reviews related to this " +"definition are restarted." +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "It's fully validated" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "It's in the validation process" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard____last_update +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition____last_update +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review____last_update +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception____last_update +msgid "Last Modified on" +msgstr "最近修改时间" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__write_uid +msgid "Last Updated by" +msgstr "最近更新人" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__write_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__write_date +msgid "Last Updated on" +msgstr "最近更新时间" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_name +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Model" +msgstr "模型" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "More Options" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__name +msgid "Name" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__need_validation +msgid "Need Validation" +msgstr "需要审批" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_definition.py:0 +#, python-format +msgid "New Tier Validation" +msgstr "新建多层级审批" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__next_review +msgid "Next Review" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "Next: %s" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#, python-format +msgid "No reviews to do." +msgstr "没有待审批的项目。" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_accepted +msgid "Notify Reviewers on Accepted" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_create +msgid "Notify Reviewers on Creation" +msgstr "创建时通知审批人" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_rejected +msgid "Notify Reviewers on Rejected" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_restarted +msgid "Notify Reviewers on Restarted" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "" +"Once created, you can decide which fields you want to be editable when the " +"record:" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "Operation has been rejected." +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "Operation has been validated!" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Option to forward a tier validation to other reviewer, and backward" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Option to use python formula to get reviewers and find documents" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__pending +#, python-format +msgid "Pending" +msgstr "待审批" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model_id +msgid "Referenced Model" +msgstr "引用模型" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Reject" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__rejected +msgid "Rejected" +msgstr "已驳回" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__rejected_message +msgid "Rejected Message" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__res_id +msgid "Related Document ID" +msgstr "关联文档 ID" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__model +msgid "Related Document Model" +msgstr "关联文档模型" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Request Validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__requested_by +msgid "Requested By" +msgstr "发起人" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#, python-format +msgid "Requested by" +msgstr "发起人" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_id +msgid "Res" +msgstr "资源" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_model +msgid "Res Model" +msgstr "资源模型" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Restart Validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__review_ids +msgid "Review" +msgstr "审批" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_id +msgid "Reviewer" +msgstr "审批人" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_field_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_field_id +msgid "Reviewer field" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_group_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_group_id +msgid "Reviewer group" +msgstr "审批组" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_ids +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__reviewer_ids +msgid "Reviewers" +msgstr "审批者" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_res_users__review_ids +#, python-format +msgid "Reviews" +msgstr "审批" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__sequence +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence +#, python-format +msgid "Sequence" +msgstr "序号" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__individual +msgid "Specific user" +msgstr "指定用户" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__status +#, python-format +msgid "Status" +msgstr "状态" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "The review has been reset by %s." +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +#, python-format +msgid "There are no res.users in the selected field" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "This %s needs to be validated" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "" +"This action needs to be validated for at least one record. \n" +"Please request a validation." +msgstr "" +"此操作需要至少对一条记录进行审批。\n" +"请发起审批申请。" + +#. module: base_tier_validation +#: model:ir.actions.act_window,name:base_tier_validation.tier_definition_action +#: model:ir.model,name:base_tier_validation.model_tier_definition +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_definition +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Tier Definition" +msgstr "层级定义" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_formula +msgid "Tier Formula" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_forward +msgid "Tier Forward & Backward" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_review +msgid "Tier Review" +msgstr "多层级审批" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Tier Validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation +msgid "Tier Validation (abstract)" +msgstr "多层级审批(抽象)" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_accepted +#, fuzzy +msgid "Tier Validation Accepted Notification" +msgstr "多层级审批(抽象)" + +#. module: base_tier_validation +#: model:ir.actions.act_window,name:base_tier_validation.tier_validation_exception_action +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_validation_exception +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_form +msgid "Tier Validation Exception" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation_exception +msgid "Tier Validation Exceptions" +msgstr "" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_rejected +#, fuzzy +msgid "Tier Validation Rejected Notification" +msgstr "多层级审批(抽象)" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested +msgid "Tier Validation Requested" +msgstr "" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_restarted +msgid "Tier Validation Restarted" +msgstr "" + +#. module: base_tier_validation +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_confirmation +msgid "Tier Validations" +msgstr "多层级审批" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__to_validate_message +msgid "To Validate Message" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__todo_by +msgid "Todo By" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#, python-format +msgid "Todo by" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_users +msgid "User" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__valid_model_field_ids +msgid "Valid Model Field" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__valid_reviewer_field_ids +msgid "Valid Reviewer Field" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Validate" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__validate_reject +msgid "Validate Reject" +msgstr "驳回" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__validated +msgid "Validated" +msgstr "已批准" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validated_message +msgid "Validated Message" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__review_type +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__review_type +msgid "Validated by" +msgstr "审批人" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewed_date +#, python-format +msgid "Validation Date" +msgstr "审批日期" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewed_formated_date +msgid "Validation Formated Date" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validation_status +msgid "Validation Status" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__review_ids +msgid "Validations" +msgstr "审批" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__no +msgid "Without validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_after_validation +msgid "Write after Validation" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Write after validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_under_validation +msgid "Write under Validation" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Write under validation" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "" +"You are not allowed to write those fields after validation.\n" +"- %(not_allowed_fields)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields)s" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "" +"You are not allowed to write those fields under validation.\n" +"- %(not_allowed_fields)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields)s" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "e.g. Tier Validation for..." +msgstr "例如:审批层级用于..." + +#, python-format +#~ msgid "The operation is under validation." +#~ msgstr "该操作正在审批中。" + +#~ msgid "Tier" +#~ msgstr "层级" + +#, python-format +#~ msgid "Activities" +#~ msgstr "活动项目" + +#~ msgid "Users" +#~ msgstr "用户" + +#~ msgid "A review was rejected by {}. ({})" +#~ msgstr "{} 驳回了审批。 ( {} )" + +#~ msgid "Any user in a specific group." +#~ msgstr "指定权限组" + +#~ msgid "Object" +#~ msgstr "对象" + +#~ msgid "Approve Sequence" +#~ msgstr "批准顺序" + +#~ msgid "Formula" +#~ msgstr "公式" + +#~ msgid "Python Expression" +#~ msgstr "Python表达式" diff --git a/base_tier_validation/models/__init__.py b/base_tier_validation/models/__init__.py new file mode 100644 index 00000000..5cf03dbb --- /dev/null +++ b/base_tier_validation/models/__init__.py @@ -0,0 +1,8 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import tier_definition +from . import tier_validation_exception +from . import tier_review +from . import tier_validation +from . import res_users +from . import res_config_settings diff --git a/base_tier_validation/models/res_config_settings.py b/base_tier_validation/models/res_config_settings.py new file mode 100644 index 00000000..c848cdc4 --- /dev/null +++ b/base_tier_validation/models/res_config_settings.py @@ -0,0 +1,14 @@ +# Copyright 2021 Ecosoft Co., Ltd. (http://ecosoft.co.th) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from odoo import fields, models + + +class ResConfigSettings(models.TransientModel): + _inherit = "res.config.settings" + + # Activate me back when modules are migrated + + module_base_tier_validation_formula = fields.Boolean(string="Tier Formula") + module_base_tier_validation_forward = fields.Boolean("Tier Forward & Backward") + # module_base_tier_validation_server_action = fields.Boolean("Tier Server Action") + # module_base_tier_validation_report = fields.Boolean("Tier Reports") diff --git a/base_tier_validation/models/res_users.py b/base_tier_validation/models/res_users.py new file mode 100644 index 00000000..67c77293 --- /dev/null +++ b/base_tier_validation/models/res_users.py @@ -0,0 +1,63 @@ +# Copyright 2019 ForgeFlow S.L. (https://www.forgeflow.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models, modules + + +class Users(models.Model): + _inherit = "res.users" + + review_ids = fields.Many2many(string="Reviews", comodel_name="tier.review") + + @api.model + def review_user_count(self): + user_reviews = {} + domain = [ + ("status", "=", "pending"), + ("can_review", "=", True), + ("id", "in", self.env.user.review_ids.ids), + ] + review_groups = self.env["tier.review"].read_group(domain, ["model"], ["model"]) + for review_group in review_groups: + model = review_group["model"] + reviews = self.env["tier.review"].search(review_group.get("__domain")) + if reviews: + records = ( + self.env[model] + .with_user(self.env.user) + .search([("id", "in", reviews.mapped("res_id"))]) + .filtered(lambda x: not x.rejected and x.can_review) + ) + # Excludes any cancelled records depending on the structure of the model + if self.env[model]._state_field in self.env[model]._fields: + records = records.filtered( + lambda x: x[x._state_field] != x._cancel_state + ) + if records: + record = self.env[model] + user_reviews[model] = { + "id": records[0].id, + "name": record._description, + "model": model, + "active_field": "active" in record._fields, + "icon": modules.module.get_module_icon(record._original_module), + "type": "tier_review", + "pending_count": len(records), + } + return list(user_reviews.values()) + + @api.model + def get_reviews(self, data): + review_obj = self.env["tier.review"].with_context(lang=self.env.user.lang) + res = review_obj.search_read([("id", "in", data.get("res_ids"))]) + for r in res: + # Get the translated status value. + r["display_status"] = dict( + review_obj.fields_get("status")["status"]["selection"] + ).get(r.get("status")) + # Convert to datetime timezone + if r["reviewed_date"]: + r["reviewed_date"] = fields.Datetime.context_timestamp( + self, r["reviewed_date"] + ) + return res diff --git a/base_tier_validation/models/tier_definition.py b/base_tier_validation/models/tier_definition.py new file mode 100644 index 00000000..5aa88c32 --- /dev/null +++ b/base_tier_validation/models/tier_definition.py @@ -0,0 +1,107 @@ +# Copyright 2017 ForgeFlow S.L. (https://www.forgeflow.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import _, api, fields, models + + +class TierDefinition(models.Model): + _name = "tier.definition" + _description = "Tier Definition" + + @api.model + def _get_default_name(self): + return _("New Tier Validation") + + @api.model + def _get_tier_validation_model_names(self): + res = [] + return res + + name = fields.Char( + string="Description", + required=True, + default=lambda self: self._get_default_name(), + translate=True, + ) + model_id = fields.Many2one( + comodel_name="ir.model", + string="Referenced Model", + domain=lambda self: [("model", "in", self._get_tier_validation_model_names())], + ) + model = fields.Char(related="model_id.model", index=True, store=True) + review_type = fields.Selection( + string="Validated by", + default="individual", + selection=[ + ("individual", "Specific user"), + ("group", "Any user in a specific group"), + ("field", "Field in related record"), + ], + ) + reviewer_id = fields.Many2one(comodel_name="res.users", string="Reviewer") + reviewer_group_id = fields.Many2one( + comodel_name="res.groups", string="Reviewer group" + ) + reviewer_field_id = fields.Many2one( + comodel_name="ir.model.fields", + string="Reviewer field", + domain="[('id', 'in', valid_reviewer_field_ids)]", + ) + valid_reviewer_field_ids = fields.One2many( + comodel_name="ir.model.fields", + compute="_compute_domain_reviewer_field", + ) + definition_type = fields.Selection( + string="Definition", selection=[("domain", "Domain")], default="domain" + ) + definition_domain = fields.Char() + active = fields.Boolean(default=True) + sequence = fields.Integer(default=30) + company_id = fields.Many2one( + comodel_name="res.company", + string="Company", + default=lambda self: self.env.company, + ) + notify_on_create = fields.Boolean( + string="Notify Reviewers on Creation", + help="If set, all possible reviewers will be notified by email when " + "this definition is triggered.", + ) + notify_on_accepted = fields.Boolean( + string="Notify Reviewers on Accepted", + help="If set, reviewers will be notified by email when a review related " + "to this definition is accepted.", + ) + notify_on_rejected = fields.Boolean( + string="Notify Reviewers on Rejected", + help="If set, reviewers will be notified by email when a review related " + "to this definition is rejected.", + ) + notify_on_restarted = fields.Boolean( + string="Notify Reviewers on Restarted", + help="If set, reviewers will be notified by email when a reviews related " + "to this definition are restarted.", + ) + has_comment = fields.Boolean(string="Comment", default=False) + approve_sequence = fields.Boolean( + string="Approve by sequence", + default=False, + help="Approval order by the specified sequence number", + ) + approve_sequence_bypass = fields.Boolean( + help="Bypassed (auto validated), if previous tier was validated by same reviewer", + ) + + @api.onchange("review_type") + def onchange_review_type(self): + self.reviewer_id = None + self.reviewer_group_id = None + + @api.depends("review_type", "model_id") + def _compute_domain_reviewer_field(self): + for rec in self: + rec.valid_reviewer_field_ids = ( + self.env["ir.model.fields"] + .sudo() + .search([("model", "=", rec.model), ("relation", "=", "res.users")]) + ) diff --git a/base_tier_validation/models/tier_review.py b/base_tier_validation/models/tier_review.py new file mode 100644 index 00000000..8d388826 --- /dev/null +++ b/base_tier_validation/models/tier_review.py @@ -0,0 +1,140 @@ +# Copyright 2017-19 ForgeFlow S.L. (https://www.forgeflow.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +import pytz + +from odoo import _, api, fields, models +from odoo.exceptions import ValidationError + + +class TierReview(models.Model): + _name = "tier.review" + _description = "Tier Review" + + name = fields.Char(related="definition_id.name", readonly=True) + status = fields.Selection( + selection=[ + ("pending", "Pending"), + ("rejected", "Rejected"), + ("approved", "Approved"), + ], + default="pending", + ) + model = fields.Char(string="Related Document Model", index=True) + res_id = fields.Integer(string="Related Document ID", index=True) + definition_id = fields.Many2one(comodel_name="tier.definition") + company_id = fields.Many2one( + related="definition_id.company_id", + store=True, + ) + review_type = fields.Selection(related="definition_id.review_type", readonly=True) + reviewer_id = fields.Many2one(related="definition_id.reviewer_id", readonly=True) + reviewer_group_id = fields.Many2one( + related="definition_id.reviewer_group_id", readonly=True + ) + reviewer_field_id = fields.Many2one( + related="definition_id.reviewer_field_id", readonly=True + ) + reviewer_ids = fields.Many2many( + string="Reviewers", + comodel_name="res.users", + compute="_compute_reviewer_ids", + store=True, + ) + display_status = fields.Char(compute="_compute_display_status") + sequence = fields.Integer(string="Tier") + todo_by = fields.Char(compute="_compute_todo_by", store=True) + done_by = fields.Many2one(comodel_name="res.users") + requested_by = fields.Many2one(comodel_name="res.users") + reviewed_date = fields.Datetime(string="Validation Date") + reviewed_formated_date = fields.Char( + string="Validation Formated Date", compute="_compute_reviewed_formated_date" + ) + has_comment = fields.Boolean(related="definition_id.has_comment", readonly=True) + comment = fields.Char(string="Comments") + can_review = fields.Boolean( + compute="_compute_can_review", + store=True, + help="""Can review will be marked if the review is pending and the + approve sequence has been achieved""", + ) + approve_sequence = fields.Boolean( + related="definition_id.approve_sequence", readonly=True + ) + approve_sequence_bypass = fields.Boolean( + related="definition_id.approve_sequence_bypass", readonly=True + ) + + @api.depends("status") + def _compute_display_status(self): + """ + Compute the display status based on the current status value to get the + translated status value. + """ + selection = self.fields_get(["status"])["status"]["selection"] + selection_dict = dict(selection) + for record in self: + record.display_status = selection_dict[record.status] + + @api.depends_context("tz") + def _compute_reviewed_formated_date(self): + timezone = self._context.get("tz") or self.env.user.partner_id.tz or "UTC" + for review in self: + if not review.reviewed_date: + review.reviewed_formated_date = False + continue + reviewed_date_utc = pytz.timezone("UTC").localize(review.reviewed_date) + reviewed_date_tz = reviewed_date_utc.astimezone(pytz.timezone(timezone)) + review.reviewed_formated_date = reviewed_date_tz.replace(tzinfo=None) + + @api.depends("definition_id.approve_sequence") + def _compute_can_review(self): + for record in self: + record.can_review = record._can_review_value() + + def _can_review_value(self): + if self.status != "pending": + return False + if not self.approve_sequence: + return True + resource = self.env[self.model].browse(self.res_id) + reviews = resource.review_ids.filtered(lambda r: r.status == "pending") + if not reviews: + return True + sequence = min(reviews.mapped("sequence")) + return self.sequence == sequence + + @api.model + def _get_reviewer_fields(self): + return ["reviewer_id", "reviewer_group_id", "reviewer_group_id.users"] + + @api.depends(lambda self: self._get_reviewer_fields()) + def _compute_reviewer_ids(self): + for rec in self: + rec.reviewer_ids = rec._get_reviewers() + + @api.depends("reviewer_ids") + def _compute_todo_by(self): + """Show by group or by abbrev list of names""" + num_show = 3 # Max number of users to display + for rec in self: + todo_by = False + if rec.reviewer_group_id: + todo_by = _("Group %s") % rec.reviewer_group_id.name + else: + todo_by = ", ".join(rec.reviewer_ids[:num_show].mapped("display_name")) + num_users = len(rec.reviewer_ids) + if num_users > num_show: + todo_by = "{} (and {} more)".format(todo_by, num_users - num_show) + rec.todo_by = todo_by + + def _get_reviewers(self): + if self.reviewer_id or self.reviewer_group_id.users: + return self.reviewer_id + self.reviewer_group_id.users + reviewer_field = self.env["res.users"] + if self.reviewer_field_id: + resource = self.env[self.model].browse(self.res_id) + reviewer_field = getattr(resource, self.reviewer_field_id.name, False) + if not reviewer_field or not reviewer_field._name == "res.users": + raise ValidationError(_("There are no res.users in the selected field")) + return reviewer_field diff --git a/base_tier_validation/models/tier_validation.py b/base_tier_validation/models/tier_validation.py new file mode 100644 index 00000000..5204c70f --- /dev/null +++ b/base_tier_validation/models/tier_validation.py @@ -0,0 +1,774 @@ +# Copyright 2017-19 ForgeFlow S.L. (https://www.forgeflow.com) +# Copyright 2024 Moduon Team (https://www.moduon.team) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +import json +from ast import literal_eval + +from lxml import etree + +from odoo import _, api, fields, models +from odoo.exceptions import ValidationError +from odoo.osv.expression import OR +from odoo.tools.misc import frozendict + +BASE_EXCEPTION_FIELDS = ["message_follower_ids", "access_token"] + + +class TierValidation(models.AbstractModel): + _name = "tier.validation" + _description = "Tier Validation (abstract)" + + _tier_validation_buttons_xpath = "/form/header/button[last()]" + _tier_validation_manual_config = True + + _state_field = "state" + _state_from = ["draft"] + _state_to = ["confirmed"] + _cancel_state = "cancel" + + # TODO: step by step validation? + + review_ids = fields.One2many( + comodel_name="tier.review", + inverse_name="res_id", + string="Validations", + domain=lambda self: [("model", "=", self._name)], + auto_join=True, + ) + to_validate_message = fields.Html(compute="_compute_validated_rejected") + # TODO: Delete in v17 in favor of validation_status field + validated = fields.Boolean( + compute="_compute_validated_rejected", search="_search_validated" + ) + validated_message = fields.Html(compute="_compute_validated_rejected") + need_validation = fields.Boolean(compute="_compute_need_validation") + # TODO: Delete in v17 in favor of validation_status field + rejected = fields.Boolean( + compute="_compute_validated_rejected", search="_search_rejected" + ) + rejected_message = fields.Html(compute="_compute_validated_rejected") + # Informative field (used in purchase_tier_validation), will be reliable as of v17 + validation_status = fields.Selection( + selection=[ + ("no", "Without validation"), + ("pending", "Pending"), + ("rejected", "Rejected"), + ("validated", "Validated"), + ], + default="no", + compute="_compute_validation_status", + ) + reviewer_ids = fields.Many2many( + string="Reviewers", + comodel_name="res.users", + compute="_compute_reviewer_ids", + search="_search_reviewer_ids", + ) + can_review = fields.Boolean( + compute="_compute_can_review", search="_search_can_review" + ) + has_comment = fields.Boolean(compute="_compute_has_comment") + next_review = fields.Char(compute="_compute_next_review") + + def _compute_has_comment(self): + for rec in self: + has_comment = rec.review_ids.filtered( + lambda r: r.status == "pending" and (self.env.user in r.reviewer_ids) + ).mapped("has_comment") + rec.has_comment = True in has_comment + + def _get_sequences_to_approve(self, user): + all_reviews = self.review_ids.filtered(lambda r: r.status == "pending") + my_reviews = all_reviews.filtered(lambda r: user in r.reviewer_ids) + # Include all my_reviews with approve_sequence = False + sequences = my_reviews.filtered(lambda r: not r.approve_sequence).mapped( + "sequence" + ) + # Include only my_reviews with approve_sequence = True + approve_sequences = my_reviews.filtered("approve_sequence").mapped("sequence") + if approve_sequences: + my_sequence = min(approve_sequences) + min_sequence = min(all_reviews.mapped("sequence")) + if my_sequence <= min_sequence: + sequences.append(my_sequence) + return sequences + + def _compute_can_review(self): + for rec in self: + rec.can_review = rec._get_sequences_to_approve(self.env.user) + + @api.model + def _search_can_review(self, operator, value): + domain = [ + ("review_ids.reviewer_ids", "=", self.env.user.id), + ("review_ids.status", "=", "pending"), + ("review_ids.can_review", "=", True), + ("rejected", "=", False), + ] + if "active" in self._fields: + domain.append(("active", "in", [True, False])) + res_ids = self.search(domain).filtered("can_review").ids + return [("id", "in", res_ids)] + + @api.depends("review_ids") + def _compute_reviewer_ids(self): + for rec in self: + rec.reviewer_ids = rec.review_ids.filtered( + lambda r: r.status == "pending" + ).mapped("reviewer_ids") + + @api.model + def _search_validated(self, operator, value): + assert operator in ("=", "!="), "Invalid domain operator" + assert value in (True, False), "Invalid domain value" + pos = self.search( + [(self._state_field, "in", self._state_from), ("review_ids", "!=", False)] + ).filtered(lambda r: r.validated == value) + return [("id", "in", pos.ids)] + + @api.model + def _search_rejected(self, operator, value): + assert operator in ("=", "!="), "Invalid domain operator" + assert value in (True, False), "Invalid domain value" + pos = self.search( + [(self._state_field, "in", self._state_from), ("review_ids", "!=", False)] + ).filtered(lambda r: r.rejected == value) + return [("id", "in", pos.ids)] + + @api.model + def _search_reviewer_ids(self, operator, value): + model_operator = "in" + if operator == "=" and value in ("[]", False): + # Search for records that have not yet been through a validation + # process. + operator = "!=" + model_operator = "not in" + reviews = self.env["tier.review"].search( + [ + ("model", "=", self._name), + ("reviewer_ids", operator, value), + ("can_review", "=", True), + ("status", "=", "pending"), + ] + ) + return [("id", model_operator, list(set(reviews.mapped("res_id"))))] + + def _get_to_validate_message_name(self): + return self._description + + def _get_to_validate_message(self): + return ( + """ %s""" + % _("This %s needs to be validated") + % self._get_to_validate_message_name() + ) + + def _get_validated_message(self): + msg = """ %s""" % _( + """Operation has been validated!""" + ) + return self.validated and msg or "" + + def _get_rejected_message(self): + msg = """ %s""" % _( + """Operation has been rejected.""" + ) + return self.rejected and msg or "" + + def _compute_validated_rejected(self): + for rec in self: + rec.validated = self._calc_reviews_validated(rec.review_ids) + rec.validated_message = rec._get_validated_message() + rec.rejected = self._calc_reviews_rejected(rec.review_ids) + rec.rejected_message = rec._get_rejected_message() + rec.to_validate_message = rec._get_to_validate_message() + + def _compute_validation_status(self): + for item in self: + if item.validated and not item.rejected: + item.validation_status = "validated" + elif not item.validated and item.rejected: + item.validation_status = "rejected" + elif ( + not item.validated + and not item.rejected + and any(item.review_ids.filtered(lambda x: x.status == "pending")) + ): + item.validation_status = "pending" + else: + item.validation_status = "no" + + def _compute_next_review(self): + for rec in self: + review = rec.review_ids.sorted("sequence").filtered( + lambda l: l.status == "pending" + )[:1] + rec.next_review = review and _("Next: %s") % review.name or "" + + @api.model + def _calc_reviews_validated(self, reviews): + """Override for different validation policy.""" + if not reviews: + return False + return not any([s != "approved" for s in reviews.mapped("status")]) + + @api.model + def _calc_reviews_rejected(self, reviews): + """Override for different rejection policy.""" + return any([s == "rejected" for s in reviews.mapped("status")]) + + def _compute_need_validation(self): + for rec in self: + if isinstance(rec.id, models.NewId): + rec.need_validation = False + continue + tiers = ( + self.env["tier.definition"] + .with_context(active_test=True) + .search( + [ + ("model", "=", self._name), + ("company_id", "in", [False] + self.env.company.ids), + ] + ) + ) + valid_tiers = any([rec.evaluate_tier(tier) for tier in tiers]) + rec.need_validation = ( + not rec.review_ids and valid_tiers and rec._check_state_from_condition() + ) + + def evaluate_tier(self, tier): + if tier.definition_domain: + domain = literal_eval(tier.definition_domain) + return self.filtered_domain(domain) + else: + return self + + @api.model + def _get_validation_exceptions(self, extra_domain=None, add_base_exceptions=True): + """Return Tier Validation Exception field names that matchs custom domain.""" + exception_fields = ( + self.env["tier.validation.exception"] + .sudo() + .search( + [ + ("model_name", "=", self._name), + ("company_id", "in", [False] + self.env.company.ids), + "|", + ("group_ids", "in", self.env.user.groups_id.ids), + ("group_ids", "=", False), + *(extra_domain or []), + ] + ) + .mapped("field_ids.name") + ) + if add_base_exceptions: + exception_fields += BASE_EXCEPTION_FIELDS + return list(set(exception_fields)) + + @api.model + def _get_all_validation_exceptions(self): + """Extend for more field exceptions to be written when on the entire + validation process.""" + return self._get_validation_exceptions() + + @api.model + def _get_under_validation_exceptions(self): + """Extend for more field exceptions to be written under validation.""" + return self._get_validation_exceptions( + extra_domain=[("allowed_to_write_under_validation", "=", True)] + ) + + @api.model + def _get_after_validation_exceptions(self): + """Extend for more field exceptions to be written after validation.""" + return self._get_validation_exceptions( + extra_domain=[("allowed_to_write_after_validation", "=", True)] + ) + + def _check_allow_write_under_validation(self, vals): + """Allow to add exceptions for fields that are allowed to be written + even when the record is under validation.""" + exceptions = self._get_under_validation_exceptions() + for val in vals: + if val not in exceptions: + return False + return True + + def _check_allow_write_after_validation(self, vals): + """Allow to add exceptions for fields that are allowed to be written + even when the record is after validation.""" + exceptions = self._get_after_validation_exceptions() + for val in vals: + if val not in exceptions: + return False + return True + + def _get_fields_to_write_validation(self, vals, records_exception_function): + """Not allowed fields to write when validation depending on the given function.""" + exceptions = records_exception_function() + not_allowed_fields = [] + for val in vals: + if val not in exceptions: + not_allowed_fields.append(val) + if not not_allowed_fields: + return [] + + not_allowed_field_names, allowed_field_names = [], [] + for fld_name, fld_data in self.fields_get( + not_allowed_fields + exceptions + ).items(): + if fld_name in not_allowed_fields: + not_allowed_field_names.append(fld_data["string"]) + else: + allowed_field_names.append(fld_data["string"]) + return allowed_field_names, not_allowed_field_names + + def write(self, vals): + for rec in self: + if rec._check_state_conditions(vals): + if rec.need_validation: + # try to validate operation + reviews = rec.request_validation() + rec._validate_tier(reviews) + if not self._calc_reviews_validated(reviews): + raise ValidationError( + _( + "This action needs to be validated for at least " + "one record. \nPlease request a validation." + ) + ) + if rec.review_ids and not rec.validated: + raise ValidationError( + _( + "A validation process is still open for at least " + "one record." + ) + ) + # Write under validation + if ( + rec.review_ids + and getattr(rec, self._state_field) in self._state_from + and not vals.get(self._state_field) + in (self._state_to + [self._cancel_state]) + and not rec._check_allow_write_under_validation(vals) + and not rec._context.get("skip_validation_check") + ): + ( + allowed_fields, + not_allowed_fields, + ) = rec._get_fields_to_write_validation( + vals, rec._get_under_validation_exceptions + ) + raise ValidationError( + _( + "You are not allowed to write those fields under validation.\n" + "- %(not_allowed_fields)s\n\n" + "Only those fields can be modified:\n- %(allowed_fields)s" + ) + % { + "not_allowed_fields": "\n- ".join(not_allowed_fields), + "allowed_fields": "\n- ".join(allowed_fields), + } + ) + + # Write after validation. Check only if Tier Validation Exception is created + if ( + rec._get_validation_exceptions(add_base_exceptions=False) + and rec.validation_status == "validated" + and getattr(rec, self._state_field) + in (self._state_to + [self._cancel_state]) + and not rec._check_allow_write_after_validation(vals) + and not rec._context.get("skip_validation_check") + ): + ( + allowed_fields, + not_allowed_fields, + ) = rec._get_fields_to_write_validation( + vals, rec._get_after_validation_exceptions + ) + raise ValidationError( + _( + "You are not allowed to write those fields after validation.\n" + "- %(not_allowed_fields)s\n\n" + "Only those fields can be modified:\n- %(allowed_fields)s" + ) + % { + "not_allowed_fields": "\n- ".join(not_allowed_fields), + "allowed_fields": "\n- ".join(allowed_fields), + } + ) + if rec._allow_to_remove_reviews(vals): + rec.mapped("review_ids").unlink() + return super(TierValidation, self).write(vals) + + def _allow_to_remove_reviews(self, values): + """Method for deciding whether the elimination of revisions is necessary.""" + self.ensure_one() + state_to = values.get(self._state_field) + if not state_to: + return False + state_from = self[self._state_field] + # If you change to _cancel_state + if state_to in (self._cancel_state): + return True + # If it is changed to _state_from and it was not in _state_from + if state_to in self._state_from and state_from not in self._state_from: + return True + return False + + def _check_state_from_condition(self): + return self.env.context.get("skip_check_state_condition") or ( + self._state_field in self._fields + and getattr(self, self._state_field) in self._state_from + ) + + def _check_state_conditions(self, vals): + self.ensure_one() + return ( + self._check_state_from_condition() + and vals.get(self._state_field) in self._state_to + ) + + def _validate_tier(self, tiers=False): + self.ensure_one() + tier_reviews = tiers or self.review_ids + user_reviews = tier_reviews.filtered( + lambda r: r.status == "pending" and (self.env.user in r.reviewer_ids) + ) + user_reviews.write( + { + "status": "approved", + "done_by": self.env.user.id, + "reviewed_date": fields.Datetime.now(), + } + ) + reviews_to_notify = user_reviews.filtered( + lambda r: r.definition_id.notify_on_accepted + ) + if reviews_to_notify: + subscribe = "message_subscribe" + if hasattr(self, subscribe): + getattr(self, subscribe)( + partner_ids=reviews_to_notify.mapped("reviewer_ids") + .mapped("partner_id") + .ids + ) + for review in reviews_to_notify: + rec = self.env[review.model].browse(review.res_id) + rec._notify_accepted_reviews() + + def _get_requested_notification_subtype(self): + return "base_tier_validation.mt_tier_validation_requested" + + def _get_accepted_notification_subtype(self): + return "base_tier_validation.mt_tier_validation_accepted" + + def _get_rejected_notification_subtype(self): + return "base_tier_validation.mt_tier_validation_rejected" + + def _get_restarted_notification_subtype(self): + return "base_tier_validation.mt_tier_validation_restarted" + + def _notify_accepted_reviews(self): + post = "message_post" + if hasattr(self, post): + # Notify state change + getattr(self.sudo(), post)( + subtype_xmlid=self._get_accepted_notification_subtype(), + body=self._notify_accepted_reviews_body(), + ) + + def _notify_accepted_reviews_body(self): + has_comment = self.review_ids.filtered( + lambda r: (self.env.user in r.reviewer_ids) and r.comment + ) + if has_comment: + comment = has_comment.mapped("comment")[0] + return _("A review was accepted. (%s)") % comment + return _("A review was accepted") + + def _add_comment(self, validate_reject, reviews): + wizard = self.env.ref("base_tier_validation.view_comment_wizard") + return { + "name": _("Comment"), + "type": "ir.actions.act_window", + "view_mode": "form", + "res_model": "comment.wizard", + "views": [(wizard.id, "form")], + "view_id": wizard.id, + "target": "new", + "context": { + "default_res_id": self.id, + "default_res_model": self._name, + "default_review_ids": reviews.ids, + "default_validate_reject": validate_reject, + }, + } + + def validate_tier(self): + self.ensure_one() + sequences = self._get_sequences_to_approve(self.env.user) + reviews = self.review_ids.filtered( + lambda l: l.sequence in sequences or l.approve_sequence_bypass + ) + if self.has_comment: + user_reviews = reviews.filtered( + lambda r: r.status == "pending" and (self.env.user in r.reviewer_ids) + ) + return self._add_comment("validate", user_reviews) + self._validate_tier(reviews) + self._update_counter({"review_deleted": True}) + + def reject_tier(self): + self.ensure_one() + sequences = self._get_sequences_to_approve(self.env.user) + reviews = self.review_ids.filtered(lambda l: l.sequence in sequences) + if self.has_comment: + return self._add_comment("reject", reviews) + self._rejected_tier(reviews) + self._update_counter({"review_deleted": True}) + + def _notify_rejected_review_body(self): + has_comment = self.review_ids.filtered( + lambda r: (self.env.user in r.reviewer_ids) and r.comment + ) + if has_comment: + comment = has_comment.mapped("comment")[0] + return _("A review was rejected by %(user)s. (%(comment)s)") % { + "user": self.env.user.name, + "comment": comment, + } + return _("A review was rejected by %s.") % (self.env.user.name) + + def _notify_rejected_review(self): + post = "message_post" + if hasattr(self, post): + # Notify state change + getattr(self.sudo(), post)( + subtype_xmlid=self._get_rejected_notification_subtype(), + body=self._notify_rejected_review_body(), + ) + + def _rejected_tier(self, tiers=False): + self.ensure_one() + tier_reviews = tiers or self.review_ids + user_reviews = tier_reviews.filtered( + lambda r: r.status == "pending" and (self.env.user in r.reviewer_ids) + ) + user_reviews.write( + { + "status": "rejected", + "done_by": self.env.user.id, + "reviewed_date": fields.Datetime.now(), + } + ) + + reviews_to_notify = user_reviews.filtered( + lambda r: r.definition_id.notify_on_rejected + ) + if reviews_to_notify: + subscribe = "message_subscribe" + if hasattr(self, subscribe): + getattr(self, subscribe)( + partner_ids=reviews_to_notify.mapped("reviewer_ids") + .mapped("partner_id") + .ids + ) + for review in reviews_to_notify: + rec = self.env[review.model].browse(review.res_id) + rec._notify_rejected_review() + + def _notify_requested_review_body(self): + return _("A review has been requested by %s.") % (self.env.user.name) + + def _notify_review_requested(self, tier_reviews): + subscribe = "message_subscribe" + post = "message_post" + if hasattr(self, post) and hasattr(self, subscribe): + for rec in self.sudo(): + users_to_notify = tier_reviews.filtered( + lambda r: r.definition_id.notify_on_create and r.res_id == rec.id + ).mapped("reviewer_ids") + # Subscribe reviewers and notify + if len(users_to_notify) > 0: + getattr(rec, subscribe)( + partner_ids=users_to_notify.mapped("partner_id").ids + ) + getattr(rec, post)( + subtype_xmlid=self._get_requested_notification_subtype(), + body=rec._notify_requested_review_body(), + ) + + def _prepare_tier_review_vals(self, definition, sequence): + return { + "model": self._name, + "res_id": self.id, + "definition_id": definition.id, + "requested_by": self.env.uid, + "sequence": sequence, + } + + def request_validation(self): + td_obj = self.env["tier.definition"] + tr_obj = self.env["tier.review"] + vals_list = [] + for rec in self: + if rec._check_state_from_condition() and rec.need_validation: + tier_definitions = td_obj.search( + [ + ("model", "=", self._name), + ("company_id", "in", [False] + self.env.company.ids), + ], + order="sequence desc", + ) + sequence = 0 + for td in tier_definitions: + if rec.evaluate_tier(td): + sequence += 1 + vals_list.append(rec._prepare_tier_review_vals(td, sequence)) + self._update_counter({"review_created": True}) + created_trs = tr_obj.create(vals_list) + self._notify_review_requested(created_trs) + return created_trs + + def _notify_restarted_review_body(self): + return _("The review has been reset by %s.") % (self.env.user.name) + + def _notify_restarted_review(self): + post = "message_post" + if hasattr(self, post): + getattr(self.sudo(), post)( + subtype_xmlid=self._get_restarted_notification_subtype(), + body=self._notify_restarted_review_body(), + ) + + def restart_validation(self): + for rec in self: + partners_to_notify_ids = False + if getattr(rec, self._state_field) in self._state_from: + to_update_counter = ( + rec.mapped("review_ids").filtered(lambda a: a.status == "pending") + and True + or False + ) + reviews_to_notify = rec.review_ids.filtered( + lambda r: r.definition_id.notify_on_restarted + ) + if reviews_to_notify: + partners_to_notify_ids = ( + reviews_to_notify.mapped("reviewer_ids") + .mapped("partner_id") + .ids + ) + rec.mapped("review_ids").unlink() + if to_update_counter: + self._update_counter({"review_deleted": True}) + if partners_to_notify_ids: + subscribe = "message_subscribe" + reviews_to_notify = rec.review_ids.filtered( + lambda r: r.definition_id.notify_on_restarted + ) + if hasattr(self, subscribe): + getattr(self, subscribe)(partner_ids=partners_to_notify_ids) + rec._notify_restarted_review() + + @api.model + def _update_counter(self, review_counter): + self.review_ids._compute_can_review() + notifications = [] + channel = "base.tier.validation/updated" + notifications.append([self.env.user.partner_id, channel, review_counter]) + self.env["bus.bus"]._sendmany(notifications) + + def unlink(self): + self.mapped("review_ids").unlink() + return super().unlink() + + def _add_tier_validation_buttons(self, node, params): + str_element = self.env["ir.qweb"]._render( + "base_tier_validation.tier_validation_buttons", params + ) + new_node = etree.fromstring(str_element) + return new_node + + def _add_tier_validation_label(self, node, params): + str_element = self.env["ir.qweb"]._render( + "base_tier_validation.tier_validation_label", params + ) + new_node = etree.fromstring(str_element) + return new_node + + def _add_tier_validation_reviews(self, node, params): + str_element = self.env["ir.qweb"]._render( + "base_tier_validation.tier_validation_reviews", params + ) + new_node = etree.fromstring(str_element) + return new_node + + def _get_tier_validation_readonly_domain(self): + return [("review_ids", "!=", [])] + + @api.model + def get_view(self, view_id=None, view_type="form", **options): + res = super().get_view(view_id=view_id, view_type=view_type, **options) + + View = self.env["ir.ui.view"] + + # Override context for postprocessing + if view_id and res.get("base_model", self._name) != self._name: + View = View.with_context(base_model_name=res["base_model"]) + if view_type == "form" and not self._tier_validation_manual_config: + doc = etree.XML(res["arch"]) + params = { + "state_field": self._state_field, + "state_operator": "not in", + "state_value": self._state_from, + } + all_models = res["models"].copy() + for node in doc.xpath(self._tier_validation_buttons_xpath): + # By default, after the last button of the header + # _add_tier_validation_buttons process + new_node = self._add_tier_validation_buttons(node, params) + new_arch, new_models = View.postprocess_and_fields(new_node, self._name) + new_node = etree.fromstring(new_arch) + for new_element in new_node: + node.addnext(new_element) + for node in doc.xpath("/form/sheet"): + # _add_tier_validation_label process + new_node = self._add_tier_validation_label(node, params) + new_arch, new_models = View.postprocess_and_fields(new_node, self._name) + new_node = etree.fromstring(new_arch) + for new_element in new_node: + node.addprevious(new_element) + # _add_tier_validation_reviews process + new_node = self._add_tier_validation_reviews(node, params) + new_arch, new_models = View.postprocess_and_fields(new_node, self._name) + for model in new_models: + if model in all_models: + continue + if model not in res["models"]: + all_models[model] = new_models[model] + else: + all_models[model] = res["models"][model] + new_node = etree.fromstring(new_arch) + node.append(new_node) + excepted_fields = self._get_all_validation_exceptions() + for node in doc.xpath("//field[@name][not(ancestor::field)]"): + if node.attrib.get("name") in excepted_fields: + continue + modifiers = json.loads( + node.attrib.get("modifiers", '{"readonly": false}') + ) + if modifiers.get("readonly") is not True: + modifiers["readonly"] = OR( + [ + modifiers.get("readonly", []) or [], + self._get_tier_validation_readonly_domain(), + ] + ) + node.attrib["modifiers"] = json.dumps(modifiers) + res["arch"] = etree.tostring(doc) + res["models"] = frozendict(all_models) + return res diff --git a/base_tier_validation/models/tier_validation_exception.py b/base_tier_validation/models/tier_validation_exception.py new file mode 100644 index 00000000..f7e92368 --- /dev/null +++ b/base_tier_validation/models/tier_validation_exception.py @@ -0,0 +1,92 @@ +# Copyright 2024 Moduon Team (https://www.moduon.team) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import _, api, exceptions, fields, models + +from .tier_validation import BASE_EXCEPTION_FIELDS + + +class TierValidationException(models.Model): + _name = "tier.validation.exception" + _description = "Tier Validation Exceptions" + _rec_name = "name" + + @api.model + def _get_tier_validation_model_names(self): + return self.env["tier.definition"]._get_tier_validation_model_names() + + name = fields.Char( + required=True, + default="New Tier Validation Exception", + ) + model_id = fields.Many2one( + comodel_name="ir.model", + string="Model", + required=True, + ondelete="cascade", + domain=lambda self: [("model", "in", self._get_tier_validation_model_names())], + ) + model_name = fields.Char( + related="model_id.model", + string="Model", + store=True, + readonly=True, + index=True, + ) + field_ids = fields.Many2many( + comodel_name="ir.model.fields", + string="Fields", + domain="[('id', 'in', valid_model_field_ids)]", + required=True, + ) + valid_model_field_ids = fields.One2many( + comodel_name="ir.model.fields", + compute="_compute_valid_model_field_ids", + ) + company_id = fields.Many2one( + comodel_name="res.company", + string="Company", + default=lambda self: self.env.company, + ) + allowed_to_write_under_validation = fields.Boolean( + string="Write under Validation", + default=True, + ) + allowed_to_write_after_validation = fields.Boolean( + string="Write after Validation", + default=True, + ) + group_ids = fields.Many2many( + comodel_name="res.groups", + string="Groups", + help="Allowed groups to use this Tier Validation Exception", + ) + + @api.depends("model_id") + def _compute_valid_model_field_ids(self): + for record in self: + record.valid_model_field_ids = ( + self.env["ir.model.fields"] + .sudo() + .search( + [ + ("model", "=", record.model_name), + ("name", "not in", BASE_EXCEPTION_FIELDS), + ] + ) + ) + + @api.constrains( + "allowed_to_write_under_validation", "allowed_to_write_after_validation" + ) + def _check_allowed_to_write(self): + if ( + not self.allowed_to_write_under_validation + and not self.allowed_to_write_after_validation + ): + raise exceptions.ValidationError( + _( + "At least one of these fields must be checked! " + "Write under Validation, Write after Validation" + ) + ) diff --git a/base_tier_validation/readme/CONFIGURE.rst b/base_tier_validation/readme/CONFIGURE.rst new file mode 100644 index 00000000..c2809c51 --- /dev/null +++ b/base_tier_validation/readme/CONFIGURE.rst @@ -0,0 +1,28 @@ +To configure Tier Validations, you need to: + +#. Go to *Settings > Technical > Tier Validations > Tier Definition*. +#. Create as many tiers as you want for any model having tier validation + functionality. + +**Note:** + +* If check *Notify Reviewers on Creation*, all possible reviewers will be notified by email when this definition is triggered. +* If check *Comment*, reviewers can comment after click Validate or Reject. +* If check *Approve by sequence*, reviewers is forced to review by specified sequence. + + +To configure Tier Validation Exceptions, you need to: + +#. Go to *Settings > Technical > Tier Validations > Tier Validation Exceptions*. +#. Create as many tiers validation exceptions as you want for any model + having tier validation functionality. +#. Add desired fields to be checked in *Fields*. +#. Add desired groups that can use this Exception in *Groups*. +#. You must check *Write under Validation*, *Write after Validation* or both. + +**Note:** + +* If you don't create any exception, the Validated record will be readonly and cannot be modified. +* If check *Write under Validation*, records will be able to be modified only in the defined fields when the Validation process is ongoing. +* If check *Write after Validation*, records will be able to be modified only in the defined fields when the Validation process is finished. +* If check *Write after Validation* and *Write under Validation*, records will be able to be modified defined fields always. diff --git a/base_tier_validation/readme/CONTRIBUTORS.rst b/base_tier_validation/readme/CONTRIBUTORS.rst new file mode 100644 index 00000000..a89b027c --- /dev/null +++ b/base_tier_validation/readme/CONTRIBUTORS.rst @@ -0,0 +1,10 @@ +* Lois Rilo +* Naglis Jonaitis +* Adrià Gil Sorribes +* Pimolnat Suntian +* Pedro Gonzalez +* Kitti U. +* Saran Lim. +* Evan Soh +* Manuel Regidor +* Eduardo de Miguel diff --git a/base_tier_validation/readme/DESCRIPTION.rst b/base_tier_validation/readme/DESCRIPTION.rst new file mode 100644 index 00000000..5758782c --- /dev/null +++ b/base_tier_validation/readme/DESCRIPTION.rst @@ -0,0 +1,13 @@ +Validating some operations is a common need across different areas in a company +and sometimes it also involves several people and stages in the process. With +this module you will be able to define your custom validation workflows for +any Odoo document. + +This module does not provide a functionality by itself but an abstract model +to implement a validation process based on tiers on other models (e.g. +purchase orders, sales orders, budgets, expenses...). + +**Note:** To be able to use this module in a new model you will need some +development. + +See `purchase_tier_validation `_ as an example of implementation. diff --git a/base_tier_validation/readme/HISTORY.rst b/base_tier_validation/readme/HISTORY.rst new file mode 100644 index 00000000..2443029e --- /dev/null +++ b/base_tier_validation/readme/HISTORY.rst @@ -0,0 +1,91 @@ +14.0.1.0.0 (2020-11-19) +~~~~~~~~~~~~~~~~~~~~~~~ + +Migrated to Odoo 14. + +13.0.1.2.2 (2020-08-30) +~~~~~~~~~~~~~~~~~~~~~~~ + +Fixes: + +- When using approve_sequence option in any tier.definition there can be inconsistencies in the systray notifications +- When using approve_sequence, still not approve only the needed sequence, but also other sequence for the same approver + +12.0.3.3.1 (2019-12-02) +~~~~~~~~~~~~~~~~~~~~~~~ + +Fixes: + +- Show comment on Reviews Table. +- Edit notification with approve_sequence. + +12.0.3.3.0 (2019-11-27) +~~~~~~~~~~~~~~~~~~~~~~~ + +New features: + +- Add comment on Reviews Table. +- Approve by sequence. + +12.0.3.2.1 (2019-11-26) +~~~~~~~~~~~~~~~~~~~~~~~ + +Fixes: + +- Remove message_subscribe_users + +12.0.3.2.0 (2019-11-25) +~~~~~~~~~~~~~~~~~~~~~~~ + +New features: + +- Notify reviewers + +12.0.3.1.0 (2019-07-08) +~~~~~~~~~~~~~~~~~~~~~~~ + +Fixes: + +- Singleton error + +12.0.3.0.0 (2019-12-02) +~~~~~~~~~~~~~~~~~~~~~~~ + +Fixes: + +- Edit Reviews Table + +12.0.2.1.0 (2019-05-29) +~~~~~~~~~~~~~~~~~~~~~~~ + +Fixes: + +- Edit drop-down style width and position + +12.0.2.0.0 (2019-05-28) +~~~~~~~~~~~~~~~~~~~~~~~ + +New features: + +- Pass parameters as functions. +- Add Systray. + +12.0.1.0.0 (2019-02-18) +~~~~~~~~~~~~~~~~~~~~~~~ + +Migrated to Odoo 12. + +11.0.1.0.0 (2018-05-09) +~~~~~~~~~~~~~~~~~~~~~~~ + +Migrated to Odoo 11. + +10.0.1.0.0 (2018-03-26) +~~~~~~~~~~~~~~~~~~~~~~~ + +Migrated to Odoo 10. + +9.0.1.0.0 (2017-12-02) +~~~~~~~~~~~~~~~~~~~~~~~ + +First version. diff --git a/base_tier_validation/readme/ROADMAP.rst b/base_tier_validation/readme/ROADMAP.rst new file mode 100644 index 00000000..767b9b5b --- /dev/null +++ b/base_tier_validation/readme/ROADMAP.rst @@ -0,0 +1,20 @@ +This is the list of known issues for this module. Any proposal for improvement will +be very valuable. + +* **Issue:** + + When using `approve_sequence` option in any tier.definition there can be inconsistencies + in the systray notifications. + + **Description:** + + Field `can_review` in tier.review is used to filter out, in the systray notifications, + the reviews a user can approve. This `can_review` field is updated **in the database** + in method `review_user_count`, this can make it very inconsistent for databases + with a lot of users and recurring updates that can change the expected behavior. + +* **Migration to 15.0:** + + The parameter _tier_validation_manual_config will become False, on 14.0, the default + value is True, as the change is applied after the migration. In order to use the new + behavior we need to modify the value on our expected model. diff --git a/base_tier_validation/security/ir.model.access.csv b/base_tier_validation/security/ir.model.access.csv new file mode 100644 index 00000000..82a8f523 --- /dev/null +++ b/base_tier_validation/security/ir.model.access.csv @@ -0,0 +1,7 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_tier_review,access.tier.review,model_tier_review,,1,1,1,1 +access_tier_definition_all,tier.definition.all,model_tier_definition,,1,0,0,0 +access_tier_definition_settings,tier.definition.settings,model_tier_definition,base.group_system,1,1,1,1 +access_comment_wizard,access.comment.wizard,model_comment_wizard,,1,1,1,1 +access_tier_validation_exceptions_all,tier.validation.exceptions,model_tier_validation_exception,,1,0,0,0 +access_tier_validation_exceptions_settings,tier.validation.exceptions,model_tier_validation_exception,base.group_system,1,1,1,1 diff --git a/base_tier_validation/security/tier_validation_security.xml b/base_tier_validation/security/tier_validation_security.xml new file mode 100644 index 00000000..2ad71f57 --- /dev/null +++ b/base_tier_validation/security/tier_validation_security.xml @@ -0,0 +1,19 @@ + + + + Tier Definition multi-company + + + + ['|',('company_id','=',False),('company_id', 'in', company_ids)] + + + + Tier Review multi-company + + + + ['|',('company_id','=',False),('company_id', 'in', company_ids)] + + + diff --git a/base_tier_validation/static/description/icon.png b/base_tier_validation/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 zcmW++2RxMjAAjx~&dlBk9S+%}OXg)AGE&Cb*&}d0jUxM@u(PQx^-s)697TX`ehR4?GS^qbkof1cslKgkU)h65qZ9Oc=ml_0temigYLJfnz{IDzUf>bGs4N!v3=Z3jMq&A#7%rM5eQ#dc?k~! zVpnB`o+K7|Al`Q_U;eD$B zfJtP*jH`siUq~{KE)`jP2|#TUEFGRryE2`i0**z#*^6~AI|YzIWy$Cu#CSLW3q=GA z6`?GZymC;dCPk~rBS%eCb`5OLr;RUZ;D`}um=H)BfVIq%7VhiMr)_#G0N#zrNH|__ zc+blN2UAB0=617@>_u;MPHN;P;N#YoE=)R#i$k_`UAA>WWCcEVMh~L_ zj--gtp&|K1#58Yz*AHCTMziU1Jzt_jG0I@qAOHsk$2}yTmVkBp_eHuY$A9)>P6o~I z%aQ?!(GqeQ-Y+b0I(m9pwgi(IIZZzsbMv+9w{PFtd_<_(LA~0H(xz{=FhLB@(1&qHA5EJw1>>=%q2f&^X>IQ{!GJ4e9U z&KlB)z(84HmNgm2hg2C0>WM{E(DdPr+EeU_N@57;PC2&DmGFW_9kP&%?X4}+xWi)( z;)z%wI5>D4a*5XwD)P--sPkoY(a~WBw;E~AW`Yue4kFa^LM3X`8x|}ZUeMnqr}>kH zG%WWW>3ml$Yez?i%)2pbKPI7?5o?hydokgQyZsNEr{a|mLdt;X2TX(#B1j35xPnPW z*bMSSOauW>o;*=kO8ojw91VX!qoOQb)zHJ!odWB}d+*K?#sY_jqPdg{Sm2HdYzdEx zOGVPhVRTGPtv0o}RfVP;Nd(|CB)I;*t&QO8h zFfekr30S!-LHmV_Su-W+rEwYXJ^;6&3|L$mMC8*bQptyOo9;>Qb9Q9`ySe3%V$A*9 zeKEe+b0{#KWGp$F+tga)0RtI)nhMa-K@JS}2krK~n8vJ=Ngm?R!9G<~RyuU0d?nz# z-5EK$o(!F?hmX*2Yt6+coY`6jGbb7tF#6nHA zuKk=GGJ;ZwON1iAfG$E#Y7MnZVmrY|j0eVI(DN_MNFJmyZ|;w4tf@=CCDZ#5N_0K= z$;R~bbk?}TpfDjfB&aiQ$VA}s?P}xPERJG{kxk5~R`iRS(SK5d+Xs9swCozZISbnS zk!)I0>t=A<-^z(cmSFz3=jZ23u13X><0b)P)^1T_))Kr`e!-pb#q&J*Q`p+B6la%C zuVl&0duN<;uOsB3%T9Fp8t{ED108<+W(nOZd?gDnfNBC3>M8WE61$So|P zVvqH0SNtDTcsUdzaMDpT=Ty0pDHHNL@Z0w$Y`XO z2M-_r1S+GaH%pz#Uy0*w$Vdl=X=rQXEzO}d6J^R6zjM1u&c9vYLvLp?W7w(?np9x1 zE_0JSAJCPB%i7p*Wvg)pn5T`8k3-uR?*NT|J`eS#_#54p>!p(mLDvmc-3o0mX*mp_ zN*AeS<>#^-{S%W<*mz^!X$w_2dHWpcJ6^j64qFBft-o}o_Vx80o0>}Du;>kLts;$8 zC`7q$QI(dKYG`Wa8#wl@V4jVWBRGQ@1dr-hstpQL)Tl+aqVpGpbSfN>5i&QMXfiZ> zaA?T1VGe?rpQ@;+pkrVdd{klI&jVS@I5_iz!=UMpTsa~mBga?1r}aRBm1WS;TT*s0f0lY=JBl66Upy)-k4J}lh=P^8(SXk~0xW=T9v*B|gzIhN z>qsO7dFd~mgxAy4V?&)=5ieYq?zi?ZEoj)&2o)RLy=@hbCRcfT5jigwtQGE{L*8<@Yd{zg;CsL5mvzfDY}P-wos_6PfprFVaeqNE%h zKZhLtcQld;ZD+>=nqN~>GvROfueSzJD&BE*}XfU|H&(FssBqY=hPCt`d zH?@s2>I(|;fcW&YM6#V#!kUIP8$Nkdh0A(bEVj``-AAyYgwY~jB zT|I7Bf@%;7aL7Wf4dZ%VqF$eiaC38OV6oy3Z#TER2G+fOCd9Iaoy6aLYbPTN{XRPz z;U!V|vBf%H!}52L2gH_+j;`bTcQRXB+y9onc^wLm5wi3-Be}U>k_u>2Eg$=k!(l@I zcCg+flakT2Nej3i0yn+g+}%NYb?ta;R?(g5SnwsQ49U8Wng8d|{B+lyRcEDvR3+`O{zfmrmvFrL6acVP%yG98X zo&+VBg@px@i)%o?dG(`T;n*$S5*rnyiR#=wW}}GsAcfyQpE|>a{=$Hjg=-*_K;UtD z#z-)AXwSRY?OPefw^iI+ z)AXz#PfEjlwTes|_{sB?4(O@fg0AJ^g8gP}ex9Ucf*@_^J(s_5jJV}c)s$`Myn|Kd z$6>}#q^n{4vN@+Os$m7KV+`}c%4)4pv@06af4-x5#wj!KKb%caK{A&Y#Rfs z-po?Dcb1({W=6FKIUirH&(yg=*6aLCekcKwyfK^JN5{wcA3nhO(o}SK#!CINhI`-I z1)6&n7O&ZmyFMuNwvEic#IiOAwNkR=u5it{B9n2sAJV5pNhar=j5`*N!Na;c7g!l$ z3aYBqUkqqTJ=Re-;)s!EOeij=7SQZ3Hq}ZRds%IM*PtM$wV z@;rlc*NRK7i3y5BETSKuumEN`Xu_8GP1Ri=OKQ$@I^ko8>H6)4rjiG5{VBM>B|%`&&s^)jS|-_95&yc=GqjNo{zFkw%%HHhS~e=s zD#sfS+-?*t|J!+ozP6KvtOl!R)@@-z24}`9{QaVLD^9VCSR2b`b!KC#o;Ki<+wXB6 zx3&O0LOWcg4&rv4QG0)4yb}7BFSEg~=IR5#ZRj8kg}dS7_V&^%#Do==#`u zpy6{ox?jWuR(;pg+f@mT>#HGWHAJRRDDDv~@(IDw&R>9643kK#HN`!1vBJHnC+RM&yIh8{gG2q zA%e*U3|N0XSRa~oX-3EAneep)@{h2vvd3Xvy$7og(sayr@95+e6~Xvi1tUqnIxoIH zVWo*OwYElb#uyW{Imam6f2rGbjR!Y3`#gPqkv57dB6K^wRGxc9B(t|aYDGS=m$&S!NmCtrMMaUg(c zc2qC=2Z`EEFMW-me5B)24AqF*bV5Dr-M5ig(l-WPS%CgaPzs6p_gnCIvTJ=Y<6!gT zVt@AfYCzjjsMEGi=rDQHo0yc;HqoRNnNFeWZgcm?f;cp(6CNylj36DoL(?TS7eU#+ z7&mfr#y))+CJOXQKUMZ7QIdS9@#-}7y2K1{8)cCt0~-X0O!O?Qx#E4Og+;A2SjalQ zs7r?qn0H044=sDN$SRG$arw~n=+T_DNdSrarmu)V6@|?1-ZB#hRn`uilTGPJ@fqEy zGt(f0B+^JDP&f=r{#Y_wi#AVDf-y!RIXU^0jXsFpf>=Ji*TeqSY!H~AMbJdCGLhC) zn7Rx+sXw6uYj;WRYrLd^5IZq@6JI1C^YkgnedZEYy<&4(z%Q$5yv#Boo{AH8n$a zhb4Y3PWdr269&?V%uI$xMcUrMzl=;w<_nm*qr=c3Rl@i5wWB;e-`t7D&c-mcQl7x! zZWB`UGcw=Y2=}~wzrfLx=uet<;m3~=8I~ZRuzvMQUQdr+yTV|ATf1Uuomr__nDf=X zZ3WYJtHp_ri(}SQAPjv+Y+0=fH4krOP@S&=zZ-t1jW1o@}z;xk8 z(Nz1co&El^HK^NrhVHa-_;&88vTU>_J33=%{if;BEY*J#1n59=07jrGQ#IP>@u#3A z;!q+E1Rj3ZJ+!4bq9F8PXJ@yMgZL;>&gYA0%_Kbi8?S=XGM~dnQZQ!yBSgcZhY96H zrWnU;k)qy`rX&&xlDyA%(a1Hhi5CWkmg(`Gb%m(HKi-7Z!LKGRP_B8@`7&hdDy5n= z`OIxqxiVfX@OX1p(mQu>0Ai*v_cTMiw4qRt3~NBvr9oBy0)r>w3p~V0SCm=An6@3n)>@z!|o-$HvDK z|3D2ZMJkLE5loMKl6R^ez@Zz%S$&mbeoqH5`Bb){Ei21q&VP)hWS2tjShfFtGE+$z zzCR$P#uktu+#!w)cX!lWN1XU%K-r=s{|j?)Akf@q#3b#{6cZCuJ~gCxuMXRmI$nGtnH+-h z+GEi!*X=AP<|fG`1>MBdTb?28JYc=fGvAi2I<$B(rs$;eoJCyR6_bc~p!XR@O-+sD z=eH`-ye})I5ic1eL~TDmtfJ|8`0VJ*Yr=hNCd)G1p2MMz4C3^Mj?7;!w|Ly%JqmuW zlIEW^Ft%z?*|fpXda>Jr^1noFZEwFgVV%|*XhH@acv8rdGxeEX{M$(vG{Zw+x(ei@ zmfXb22}8-?Fi`vo-YVrTH*C?a8%M=Hv9MqVH7H^J$KsD?>!SFZ;ZsvnHr_gn=7acz z#W?0eCdVhVMWN12VV^$>WlQ?f;P^{(&pYTops|btm6aj>_Uz+hqpGwB)vWp0Cf5y< zft8-je~nn?W11plq}N)4A{l8I7$!ks_x$PXW-2XaRFswX_BnF{R#6YIwMhAgd5F9X zGmwdadS6(a^fjHtXg8=l?Rc0Sm%hk6E9!5cLVloEy4eh(=FwgP`)~I^5~pBEWo+F6 zSf2ncyMurJN91#cJTy_u8Y}@%!bq1RkGC~-bV@SXRd4F{R-*V`bS+6;W5vZ(&+I<9$;-V|eNfLa5n-6% z2(}&uGRF;p92eS*sE*oR$@pexaqr*meB)VhmIg@h{uzkk$9~qh#cHhw#>O%)b@+(| z^IQgqzuj~Sk(J;swEM-3TrJAPCq9k^^^`q{IItKBRXYe}e0Tdr=Huf7da3$l4PdpwWDop%^}n;dD#K4s#DYA8SHZ z&1!riV4W4R7R#C))JH1~axJ)RYnM$$lIR%6fIVA@zV{XVyx}C+a-Dt8Y9M)^KU0+H zR4IUb2CJ{Hg>CuaXtD50jB(_Tcx=Z$^WYu2u5kubqmwp%drJ6 z?Fo40g!Qd<-l=TQxqHEOuPX0;^z7iX?Ke^a%XT<13TA^5`4Xcw6D@Ur&VT&CUe0d} z1GjOVF1^L@>O)l@?bD~$wzgf(nxX1OGD8fEV?TdJcZc2KoUe|oP1#=$$7ee|xbY)A zDZq+cuTpc(fFdj^=!;{k03C69lMQ(|>uhRfRu%+!k&YOi-3|1QKB z z?n?eq1XP>p-IM$Z^C;2L3itnbJZAip*Zo0aw2bs8@(s^~*8T9go!%dHcAz2lM;`yp zD=7&xjFV$S&5uDaiScyD?B-i1ze`+CoRtz`Wn+Zl&#s4&}MO{@N!ufrzjG$B79)Y2d3tBk&)TxUTw@QS0TEL_?njX|@vq?Uz(nBFK5Pq7*xj#u*R&i|?7+6# z+|r_n#SW&LXhtheZdah{ZVoqwyT{D>MC3nkFF#N)xLi{p7J1jXlmVeb;cP5?e(=f# zuT7fvjSbjS781v?7{)-X3*?>tq?)Yd)~|1{BDS(pqC zC}~H#WXlkUW*H5CDOo<)#x7%RY)A;ShGhI5s*#cRDA8YgqG(HeKDx+#(ZQ?386dv! zlXCO)w91~Vw4AmOcATuV653fa9R$fyK8ul%rG z-wfS zihugoZyr38Im?Zuh6@RcF~t1anQu7>#lPpb#}4cOA!EM11`%f*07RqOVkmX{p~KJ9 z^zP;K#|)$`^Rb{rnHGH{~>1(fawV0*Z#)}M`m8-?ZJV<+e}s9wE# z)l&az?w^5{)`S(%MRzxdNqrs1n*-=jS^_jqE*5XDrA0+VE`5^*p3CuM<&dZEeCjoz zR;uu_H9ZPZV|fQq`Cyw4nscrVwi!fE6ciMmX$!_hN7uF;jjKG)d2@aC4ropY)8etW=xJvni)8eHi`H$%#zn^WJ5NLc-rqk|u&&4Z6fD_m&JfSI1Bvb?b<*n&sfl0^t z=HnmRl`XrFvMKB%9}>PaA`m-fK6a0(8=qPkWS5bb4=v?XcWi&hRY?O5HdulRi4?fN zlsJ*N-0Qw+Yic@s0(2uy%F@ib;GjXt01Fmx5XbRo6+n|pP(&nodMoap^z{~q ziEeaUT@Mxe3vJSfI6?uLND(CNr=#^W<1b}jzW58bIfyWTDle$mmS(|x-0|2UlX+9k zQ^EX7Nw}?EzVoBfT(-LT|=9N@^hcn-_p&sqG z&*oVs2JSU+N4ZD`FhCAWaS;>|wH2G*Id|?pa#@>tyxX`+4HyIArWDvVrX)2WAOQff z0qyHu&-S@i^MS-+j--!pr4fPBj~_8({~e1bfcl0wI1kaoN>mJL6KUPQm5N7lB(ui1 zE-o%kq)&djzWJ}ob<-GfDlkB;F31j-VHKvQUGQ3sp`CwyGJk_i!y^sD0fqC@$9|jO zOqN!r!8-p==F@ZVP=U$qSpY(gQ0)59P1&t@y?5rvg<}E+GB}26NYPp4f2YFQrQtot5mn3wu_qprZ=>Ig-$ zbW26Ws~IgY>}^5w`vTB(G`PTZaDiGBo5o(tp)qli|NeV( z@H_=R8V39rt5J5YB2Ky?4eJJ#b`_iBe2ot~6%7mLt5t8Vwi^Jy7|jWXqa3amOIoRb zOr}WVFP--DsS`1WpN%~)t3R!arKF^Q$e12KEqU36AWwnCBICpH4XCsfnyrHr>$I$4 z!DpKX$OKLWarN7nv@!uIA+~RNO)l$$w}p(;b>mx8pwYvu;dD_unryX_NhT8*Tj>BTrTTL&!?O+%Rv;b?B??gSzdp?6Uug9{ zd@V08Z$BdI?fpoCS$)t4mg4rT8Q_I}h`0d-vYZ^|dOB*Q^S|xqTV*vIg?@fVFSmMpaw0qtTRbx} z({Pg?#{2`sc9)M5N$*N|4;^t$+QP?#mov zGVC@I*lBVrOU-%2y!7%)fAKjpEFsgQc4{amtiHb95KQEwvf<(3T<9-Zm$xIew#P22 zc2Ix|App^>v6(3L_MCU0d3W##AB0M~3D00EWoKZqsJYT(#@w$Y_H7G22M~ApVFTRHMI_3be)Lkn#0F*V8Pq zc}`Cjy$bE;FJ6H7p=0y#R>`}-m4(0F>%@P|?7fx{=R^uFdISRnZ2W_xQhD{YuR3t< z{6yxu=4~JkeA;|(J6_nv#>Nvs&FuLA&PW^he@t(UwFFE8)|a!R{`E`K`i^ZnyE4$k z;(749Ix|oi$c3QbEJ3b~D_kQsPz~fIUKym($a_7dJ?o+40*OLl^{=&oq$<#Q(yyrp z{J-FAniyAw9tPbe&IhQ|a`DqFTVQGQ&Gq3!C2==4x{6EJwiPZ8zub-iXoUtkJiG{} zPaR&}_fn8_z~(=;5lD-aPWD3z8PZS@AaUiomF!G8I}Mf>e~0g#BelA-5#`cj;O5>N Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/base_tier_validation/static/description/index.html b/base_tier_validation/static/description/index.html new file mode 100644 index 00000000..44e16d45 --- /dev/null +++ b/base_tier_validation/static/description/index.html @@ -0,0 +1,604 @@ + + + + + +Base Tier Validation + + + +
+

Base Tier Validation

+ + +

Mature License: AGPL-3 OCA/server-ux Translate me on Weblate Try me on Runboat

+

Validating some operations is a common need across different areas in a company +and sometimes it also involves several people and stages in the process. With +this module you will be able to define your custom validation workflows for +any Odoo document.

+

This module does not provide a functionality by itself but an abstract model +to implement a validation process based on tiers on other models (e.g. +purchase orders, sales orders, budgets, expenses…).

+

Note: To be able to use this module in a new model you will need some +development.

+

See purchase_tier_validation as an example of implementation.

+

Table of contents

+ +
+

Configuration

+

To configure Tier Validations, you need to:

+
    +
  1. Go to Settings > Technical > Tier Validations > Tier Definition.
  2. +
  3. Create as many tiers as you want for any model having tier validation +functionality.
  4. +
+

Note:

+
    +
  • If check Notify Reviewers on Creation, all possible reviewers will be notified by email when this definition is triggered.
  • +
  • If check Comment, reviewers can comment after click Validate or Reject.
  • +
  • If check Approve by sequence, reviewers is forced to review by specified sequence.
  • +
+

To configure Tier Validation Exceptions, you need to:

+
    +
  1. Go to Settings > Technical > Tier Validations > Tier Validation Exceptions.
  2. +
  3. Create as many tiers validation exceptions as you want for any model +having tier validation functionality.
  4. +
  5. Add desired fields to be checked in Fields.
  6. +
  7. Add desired groups that can use this Exception in Groups.
  8. +
  9. You must check Write under Validation, Write after Validation or both.
  10. +
+

Note:

+
    +
  • If you don’t create any exception, the Validated record will be readonly and cannot be modified.
  • +
  • If check Write under Validation, records will be able to be modified only in the defined fields when the Validation process is ongoing.
  • +
  • If check Write after Validation, records will be able to be modified only in the defined fields when the Validation process is finished.
  • +
  • If check Write after Validation and Write under Validation, records will be able to be modified defined fields always.
  • +
+
+
+

Known issues / Roadmap

+

This is the list of known issues for this module. Any proposal for improvement will +be very valuable.

+
    +
  • Issue:

    +

    When using approve_sequence option in any tier.definition there can be inconsistencies +in the systray notifications.

    +

    Description:

    +

    Field can_review in tier.review is used to filter out, in the systray notifications, +the reviews a user can approve. This can_review field is updated in the database +in method review_user_count, this can make it very inconsistent for databases +with a lot of users and recurring updates that can change the expected behavior.

    +
  • +
  • Migration to 15.0:

    +

    The parameter _tier_validation_manual_config will become False, on 14.0, the default +value is True, as the change is applied after the migration. In order to use the new +behavior we need to modify the value on our expected model.

    +
  • +
+
+
+

Changelog

+
+

14.0.1.0.0 (2020-11-19)

+

Migrated to Odoo 14.

+
+
+

13.0.1.2.2 (2020-08-30)

+

Fixes:

+
    +
  • When using approve_sequence option in any tier.definition there can be inconsistencies in the systray notifications
  • +
  • When using approve_sequence, still not approve only the needed sequence, but also other sequence for the same approver
  • +
+
+
+

12.0.3.3.1 (2019-12-02)

+

Fixes:

+
    +
  • Show comment on Reviews Table.
  • +
  • Edit notification with approve_sequence.
  • +
+
+
+

12.0.3.3.0 (2019-11-27)

+

New features:

+
    +
  • Add comment on Reviews Table.
  • +
  • Approve by sequence.
  • +
+
+
+

12.0.3.2.1 (2019-11-26)

+

Fixes:

+
    +
  • Remove message_subscribe_users
  • +
+
+
+

12.0.3.2.0 (2019-11-25)

+

New features:

+
    +
  • Notify reviewers
  • +
+
+
+

12.0.3.1.0 (2019-07-08)

+

Fixes:

+
    +
  • Singleton error
  • +
+
+
+

12.0.3.0.0 (2019-12-02)

+

Fixes:

+
    +
  • Edit Reviews Table
  • +
+
+
+

12.0.2.1.0 (2019-05-29)

+

Fixes:

+
    +
  • Edit drop-down style width and position
  • +
+
+
+

12.0.2.0.0 (2019-05-28)

+

New features:

+
    +
  • Pass parameters as functions.
  • +
  • Add Systray.
  • +
+
+
+

12.0.1.0.0 (2019-02-18)

+

Migrated to Odoo 12.

+
+
+

11.0.1.0.0 (2018-05-09)

+

Migrated to Odoo 11.

+
+
+

10.0.1.0.0 (2018-03-26)

+

Migrated to Odoo 10.

+
+
+

9.0.1.0.0 (2017-12-02)

+

First version.

+
+
+
+

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

+
    +
  • ForgeFlow
  • +
+
+
+

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:

+

LoisRForgeFlow

+

This module is part of the OCA/server-ux project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/base_tier_validation/static/src/js/ir_model.esm.js b/base_tier_validation/static/src/js/ir_model.esm.js new file mode 100644 index 00000000..fdc278f0 --- /dev/null +++ b/base_tier_validation/static/src/js/ir_model.esm.js @@ -0,0 +1,29 @@ +/** @odoo-module **/ + +import {attr, one} from "@mail/model/model_field"; +import {registerModel} from "@mail/model/model_core"; + +registerModel({ + name: "ir.model.review", + fields: { + /** + * Determines the name of the views that are available for this model. + */ + availableWebViews: attr({ + compute() { + return ["kanban", "list", "form", "activity"]; + }, + }), + reviewGroup: one("ReviewGroup", { + inverse: "irModel", + }), + iconUrl: attr(), + id: attr({ + identifying: true, + }), + model: attr({ + required: true, + }), + name: attr(), + }, +}); diff --git a/base_tier_validation/static/src/js/main.esm.js b/base_tier_validation/static/src/js/main.esm.js new file mode 100644 index 00000000..c0247713 --- /dev/null +++ b/base_tier_validation/static/src/js/main.esm.js @@ -0,0 +1,7 @@ +/** @odoo-module **/ + +import {registry} from "@web/core/registry"; +import {systrayService} from "@base_tier_validation/js/systray_service.esm"; + +const serviceRegistry = registry.category("services"); +serviceRegistry.add("review_systray_service", systrayService); diff --git a/base_tier_validation/static/src/js/review_group_view.esm.js b/base_tier_validation/static/src/js/review_group_view.esm.js new file mode 100644 index 00000000..8266813d --- /dev/null +++ b/base_tier_validation/static/src/js/review_group_view.esm.js @@ -0,0 +1,51 @@ +/** @odoo-module **/ + +import {one} from "@mail/model/model_field"; +import {registerModel} from "@mail/model/model_core"; + +registerModel({ + name: "ReviewGroupView", + recordMethods: { + /** + * @param {MouseEvent} ev + */ + onClickFilterButton(ev) { + this.reviewMenuViewOwner.update({isOpen: false}); + // Fetch the data from the button otherwise fetch the ones from the parent (.o_ActivityMenuView_activityGroup). + const data = _.extend({}, $(ev.currentTarget).data(), $(ev.target).data()); + const context = {}; + var domain = [["can_review", "=", true]]; + console.log(data); + if (data.active_field) { + domain.push(["active", "in", [true, false]]); + } + + this.env.services.action.doAction( + { + context, + name: data.model_name, + res_model: data.res_model, + search_view_id: [false], + type: "ir.actions.act_window", + domain: domain, + views: this.reviewGroup.irModel.availableWebViews.map( + (viewName) => [false, viewName] + ), + }, + { + clearBreadcrumbs: true, + } + ); + }, + }, + fields: { + reviewGroup: one("ReviewGroup", { + identifying: true, + inverse: "reviewGroupViews", + }), + reviewMenuViewOwner: one("ReviewerMenuView", { + identifying: true, + inverse: "reviewGroupViews", + }), + }, +}); diff --git a/base_tier_validation/static/src/js/review_groups.esm.js b/base_tier_validation/static/src/js/review_groups.esm.js new file mode 100644 index 00000000..1bee17b2 --- /dev/null +++ b/base_tier_validation/static/src/js/review_groups.esm.js @@ -0,0 +1,52 @@ +/** @odoo-module **/ + +import {attr, many, one} from "@mail/model/model_field"; +import {registerModel} from "@mail/model/model_core"; + +registerModel({ + name: "ReviewGroup", + modelMethods: { + convertData(data) { + return { + domain: data.domain, + irModel: { + iconUrl: data.icon, + id: data.id, + model: data.model, + name: data.name, + }, + pending_count: data.pending_count, + }; + }, + }, + recordMethods: { + /** + * @private + */ + _onChangePendingCount() { + if (this.type === "tier_review" && this.pending_count === 0) { + this.delete(); + } + }, + }, + fields: { + reviewGroupViews: many("ReviewGroupView", { + inverse: "reviewGroup", + }), + domain: attr(), + irModel: one("ir.model.review", { + identifying: true, + inverse: "reviewGroup", + }), + pending_count: attr({ + default: 0, + }), + type: attr(), + }, + onChanges: [ + { + dependencies: ["pending_count", "type"], + methodName: "_onChangePendingCount", + }, + ], +}); diff --git a/base_tier_validation/static/src/js/review_notification_handler.esm.js b/base_tier_validation/static/src/js/review_notification_handler.esm.js new file mode 100644 index 00000000..c7f98bb2 --- /dev/null +++ b/base_tier_validation/static/src/js/review_notification_handler.esm.js @@ -0,0 +1,26 @@ +/** @odoo-module **/ + +import {decrement, increment} from "@mail/model/model_field_command"; +import {registerPatch} from "@mail/model/model_core"; + +registerPatch({ + name: "MessagingNotificationHandler", + recordMethods: { + /** + * @override + */ + async _handleNotification(message) { + if (message.type === "base.tier.validation/updated") { + for (const reviewMenuView of this.messaging.models.ReviewerMenuView.all()) { + if (message.payload.review_created) { + reviewMenuView.update({extraCount: increment()}); + } + if (message.payload.review_deleted) { + reviewMenuView.update({extraCount: decrement()}); + } + } + } + return this._super(message); + }, + }, +}); diff --git a/base_tier_validation/static/src/js/reviewer_menu_container.esm.js b/base_tier_validation/static/src/js/reviewer_menu_container.esm.js new file mode 100644 index 00000000..cfe23bd9 --- /dev/null +++ b/base_tier_validation/static/src/js/reviewer_menu_container.esm.js @@ -0,0 +1,25 @@ +/** @odoo-module **/ + +// ensure components are registered beforehand. +import {getMessagingComponent} from "@mail/utils/messaging_component"; + +const {Component} = owl; + +export class ReviewerMenuContainer extends Component { + /** + * @override + */ + setup() { + super.setup(); + this.env.services.messaging.modelManager.messagingCreatedPromise.then(() => { + this.reviewerMenuView = + this.env.services.messaging.modelManager.messaging.models.ReviewerMenuView.insert(); + this.render(); + }); + } +} + +Object.assign(ReviewerMenuContainer, { + components: {ReviewerMenuView: getMessagingComponent("ReviewerMenuView")}, + template: "base_tier_validation.ReviewerMenuContainer", +}); diff --git a/base_tier_validation/static/src/js/reviewer_menu_view.esm.js b/base_tier_validation/static/src/js/reviewer_menu_view.esm.js new file mode 100644 index 00000000..17931141 --- /dev/null +++ b/base_tier_validation/static/src/js/reviewer_menu_view.esm.js @@ -0,0 +1,29 @@ +/** @odoo-module **/ + +import {registerMessagingComponent} from "@mail/utils/messaging_component"; +import {useComponentToModel} from "@mail/component_hooks/use_component_to_model"; + +const {Component} = owl; + +export class ReviewerMenuView extends Component { + /** + * @override + */ + setup() { + super.setup(); + useComponentToModel({fieldName: "component"}); + } + /** + * @returns {ReviewerMenuView} + */ + get reviewerMenuView() { + return this.props.record; + } +} + +Object.assign(ReviewerMenuView, { + props: {record: Object}, + template: "base_tier_validation.ReviewerMenuView", +}); + +registerMessagingComponent(ReviewerMenuView); diff --git a/base_tier_validation/static/src/js/systray.esm.js b/base_tier_validation/static/src/js/systray.esm.js new file mode 100644 index 00000000..5380adb0 --- /dev/null +++ b/base_tier_validation/static/src/js/systray.esm.js @@ -0,0 +1,104 @@ +/** @odoo-module **/ + +import {attr, many} from "@mail/model/model_field"; +import {registerModel} from "@mail/model/model_core"; + +import session from "web.session"; + +registerModel({ + name: "ReviewerMenuView", + lifecycleHooks: { + _created() { + this.fetchData(); + document.addEventListener("click", this._onClickCaptureGlobal, true); + }, + _willDelete() { + document.removeEventListener("click", this._onClickCaptureGlobal, true); + }, + }, + recordMethods: { + close() { + this.update({isOpen: false}); + }, + async fetchData() { + const data = await this.messaging.rpc({ + model: "res.users", + method: "review_user_count", + args: [], + kwargs: {context: session.user_context}, + }); + + this.update({ + reviewGroups: data.map((vals) => + this.messaging.models.ReviewGroup.convertData(vals) + ), + extraCount: 0, + }); + }, + /** + * @param {MouseEvent} ev + */ + onClickDropdownToggle(ev) { + ev.preventDefault(); + if (this.isOpen) { + this.update({isOpen: false}); + } else { + this.update({isOpen: true}); + this.fetchData(); + } + }, + /** + * Closes the menu when clicking outside, if appropriate. + * + * @private + * @param {MouseEvent} ev + */ + _onClickCaptureGlobal(ev) { + if (!this.exists()) { + return; + } + if (!this.component || !this.component.root.el) { + return; + } + if (this.component.root.el.contains(ev.target)) { + return; + } + this.close(); + }, + }, + fields: { + reviewGroups: many("ReviewGroup", { + sort: [["smaller-first", "irModel.id"]], + }), + reviewGroupViews: many("ReviewGroupView", { + compute() { + return this.reviewGroups.map((reviewGroup) => { + return { + reviewGroup, + }; + }); + }, + inverse: "reviewMenuViewOwner", + }), + component: attr(), + counter: attr({ + compute() { + return this.reviewGroups.reduce( + (total, group) => total + group.pending_count, + this.extraCount + ); + }, + }), + /** + * Determines the number of activities that have been added in the + * system but not yet taken into account in each activity group counter. + * + * @deprecated this field should be replaced by directly updating the + * counter of each group. + */ + extraCount: attr(), + isOpen: attr({ + default: false, + }), + }, +}); diff --git a/base_tier_validation/static/src/js/systray_service.esm.js b/base_tier_validation/static/src/js/systray_service.esm.js new file mode 100644 index 00000000..78a1101c --- /dev/null +++ b/base_tier_validation/static/src/js/systray_service.esm.js @@ -0,0 +1,17 @@ +/** @odoo-module **/ + +import {ReviewerMenuContainer} from "./reviewer_menu_container.esm"; + +import {registry} from "@web/core/registry"; + +const systrayRegistry = registry.category("systray"); + +export const systrayService = { + start() { + systrayRegistry.add( + "base_tier_validation.ReviewerMenu", + {Component: ReviewerMenuContainer}, + {sequence: 99} + ); + }, +}; diff --git a/base_tier_validation/static/src/js/tier_review_widget.esm.js b/base_tier_validation/static/src/js/tier_review_widget.esm.js new file mode 100644 index 00000000..a5ab0aa5 --- /dev/null +++ b/base_tier_validation/static/src/js/tier_review_widget.esm.js @@ -0,0 +1,36 @@ +/** @odoo-module **/ + +import {registry} from "@web/core/registry"; + +import {useService} from "@web/core/utils/hooks"; + +const {Component, useState} = owl; + +export class ReviewsTable extends Component { + setup() { + this.docs = useState({}); + this.collapse = false; + this.orm = useService("orm"); + this.reviews = []; + } + _getReviewData() { + const records = this.env.model.root.data.review_ids.records; + const reviews = []; + for (var i = 0; i < records.length; i++) { + reviews.push(records[i].data); + } + return reviews; + } + onToggleCollapse(ev) { + var $panelHeading = $(ev.currentTarget).closest(".panel-heading"); + if (this.collapse) { + $panelHeading.next("div#collapse1").hide(); + } else { + $panelHeading.next("div#collapse1").show(); + } + this.collapse = !this.collapse; + } +} + +ReviewsTable.template = "base_tier_validation.Collapse"; +registry.category("fields").add("form.tier_validation", ReviewsTable); diff --git a/base_tier_validation/static/src/scss/review.scss b/base_tier_validation/static/src/scss/review.scss new file mode 100644 index 00000000..4342206d --- /dev/null +++ b/base_tier_validation/static/src/scss/review.scss @@ -0,0 +1,41 @@ +ul.o_review { + min-width: 600px; + max-width: 800px; +} + +.panel-group { + min-height: auto !important; + margin-top: -6px !important; + padding: 16px 16px 8px 16px !important; +} + +.panel-heading { + background-color: initial !important; +} + +.panel { + border: 0px !important; +} + +.panel-body { + overflow-y: hidden; + overflow-x: auto; +} + +.panel-title > a, +.panel-title > a:active { + display: block; +} + +.panel-heading a:before { + font-family: FontAwesome; + content: "\f0d7"; + float: right; + transition: all 0.5s; +} + +.panel-heading.active a:before { + -webkit-transform: rotate(180deg); + -moz-transform: rotate(180deg); + transform: rotate(180deg); +} diff --git a/base_tier_validation/static/src/scss/systray.scss b/base_tier_validation/static/src/scss/systray.scss new file mode 100644 index 00000000..82fd85e5 --- /dev/null +++ b/base_tier_validation/static/src/scss/systray.scss @@ -0,0 +1,143 @@ +// Navbar icon and dropdown +.o_tier_navbar_item { + > a { + opacity: 1; + > i { + font-size: larger; + } + } + &.o_no_notification > a { + opacity: 0.5; + > i { + transform: translateY(0px); + } + .o_notification_counter { + display: none; + } + } + &.show .o_tier_systray_dropdown { + display: flex; + flex-flow: column nowrap; + } + .o_notification_counter { + margin-top: -0.8rem; + margin-right: 0; + margin-left: -0.6rem; + background: #00a09d; + color: white; + vertical-align: super; + font-size: 0.7em; + } + .o_tier_systray_dropdown { + direction: ltr; + width: 350px; + padding: 0; + + .o_spinner { + display: flex; + align-items: center; + justify-content: center; + color: $o-main-text-color; + height: 50px; + } + + .o_tier_systray_dropdown_top { + display: flex; + flex: 0 0 auto; + justify-content: space-between; + border-bottom: 1px solid gray("400"); + box-shadow: 0 0 2px gray("400"); + .o_filter_button, + .o_new_message { + padding: 5px; + } + .o_filter_button { + color: $o-main-color-muted; + &:hover, + &.active { + color: $o-brand-primary; + } + &.active { + cursor: default; + font-weight: bold; + } + } + } + + .o_tier_systray_dropdown_items { + flex: 0 1 auto; + max-height: 400px; + min-height: 50px; + overflow-y: auto; + + @include media-breakpoint-up(md) { + .o_tier_preview { + min-height: 50px; + padding: 5px; + .o_tier_preview_image { + width: 40px; + height: 40px; + } + .o_preview_info { + margin-left: 10px; + .o_preview_title { + .o_last_message_date { + padding-top: 2px; + font-size: x-small; + margin-left: 10px; + } + } + } + } + } + } + .o_activity_filter_button { + padding: 2px; + } + .o_no_activity { + cursor: initial; + align-items: center; + color: grey; + opacity: 0.5; + padding: 3px; + } + } +} + +.o_no_thread_window .o_tier_systray_dropdown .o_new_message { + display: none; // hide 'new message' button if chat windows are disabled +} + +// Mobile rules +// Goal: mock the design of Discuss in mobile +@include media-breakpoint-down(sm) { + .o_tier_systray_item { + .o_notification_counter { + top: 10%; + } + .o_tier_systray_dropdown { + position: relative; + .o_tier_systray_dropdown_top { + padding: 5px; + } + .o_tier_systray_mobile_header { + padding: 5px; + height: 44px; + border-bottom: 1px solid #ebebeb; + box-shadow: 0 0 2px gray("400"); + } + .o_tier_systray_dropdown_items { + max-height: none; + padding-bottom: 52px; // leave space for tabs + } + .o_tier_mobile_tabs { + position: fixed; + bottom: 0px; + left: 0px; + right: 0px; + background-color: white; + color: $o-main-text-color; + } + } + } +} diff --git a/base_tier_validation/static/src/xml/reviewer_menu_container.xml b/base_tier_validation/static/src/xml/reviewer_menu_container.xml new file mode 100644 index 00000000..358ff6bc --- /dev/null +++ b/base_tier_validation/static/src/xml/reviewer_menu_container.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/base_tier_validation/static/src/xml/systray.xml b/base_tier_validation/static/src/xml/systray.xml new file mode 100644 index 00000000..9ceac43b --- /dev/null +++ b/base_tier_validation/static/src/xml/systray.xml @@ -0,0 +1,97 @@ + + + + + + diff --git a/base_tier_validation/static/src/xml/tier_review_template.xml b/base_tier_validation/static/src/xml/tier_review_template.xml new file mode 100644 index 00000000..2b465445 --- /dev/null +++ b/base_tier_validation/static/src/xml/tier_review_template.xml @@ -0,0 +1,119 @@ + + + +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SequenceRequested byDescriptionStatusTodo byDone byValidation DateComment
+ + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
diff --git a/base_tier_validation/templates/tier_validation_templates.xml b/base_tier_validation/templates/tier_validation_templates.xml new file mode 100644 index 00000000..9629b2de --- /dev/null +++ b/base_tier_validation/templates/tier_validation_templates.xml @@ -0,0 +1,107 @@ + + + + + + diff --git a/base_tier_validation/tests/__init__.py b/base_tier_validation/tests/__init__.py new file mode 100644 index 00000000..c5d19b19 --- /dev/null +++ b/base_tier_validation/tests/__init__.py @@ -0,0 +1,4 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import common +from . import test_tier_validation diff --git a/base_tier_validation/tests/common.py b/base_tier_validation/tests/common.py new file mode 100644 index 00000000..b1258c39 --- /dev/null +++ b/base_tier_validation/tests/common.py @@ -0,0 +1,92 @@ +# Copyright 2018-19 ForgeFlow S.L. (https://www.forgeflow.com) +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). + +from odoo_test_helper import FakeModelLoader + +from odoo.tests import common + +from odoo.addons.base.tests.common import DISABLED_MAIL_CONTEXT + + +class CommonTierValidation(common.TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.env = cls.env(context=dict(cls.env.context, **DISABLED_MAIL_CONTEXT)) + cls.loader = FakeModelLoader(cls.env, cls.__module__) + cls.loader.backup_registry() + from .tier_validation_tester import ( + TierDefinition, + TierValidationTester, + TierValidationTester2, + ) + + cls.loader.update_registry( + (TierValidationTester, TierValidationTester2, TierDefinition) + ) + + cls.test_model = cls.env[TierValidationTester._name] + cls.test_model_2 = cls.env[TierValidationTester2._name] + + cls.tester_model = cls.env["ir.model"].search( + [("model", "=", "tier.validation.tester")] + ) + cls.tester_model_2 = cls.env["ir.model"].search( + [("model", "=", "tier.validation.tester2")] + ) + + # Access record: + cls.env["ir.model.access"].create( + { + "name": "access.tester", + "model_id": cls.tester_model.id, + "perm_read": 1, + "perm_write": 1, + "perm_create": 1, + "perm_unlink": 1, + } + ) + cls.env["ir.model.access"].create( + { + "name": "access.tester2", + "model_id": cls.tester_model_2.id, + "perm_read": 1, + "perm_write": 1, + "perm_create": 1, + "perm_unlink": 1, + } + ) + + # Create users: + group_ids = cls.env.ref("base.group_system").ids + cls.test_user_1 = cls.env["res.users"].create( + { + "name": "John", + "login": "test1", + "email": "john@yourcompany.example.com", + "groups_id": [(6, 0, group_ids)], + } + ) + cls.test_user_2 = cls.env["res.users"].create( + {"name": "Mike", "login": "test2", "email": "mike@yourcompany.example.com"} + ) + + # Create tier definitions: + cls.tier_def_obj = cls.env["tier.definition"] + cls.tier_def_obj.create( + { + "model_id": cls.tester_model.id, + "review_type": "individual", + "reviewer_id": cls.test_user_1.id, + "definition_domain": "[('test_field', '>', 1.0)]", + "sequence": 30, + } + ) + + cls.test_record = cls.test_model.create({"test_field": 2.5}) + cls.test_record_2 = cls.test_model_2.create({"test_field": 2.5}) + + @classmethod + def tearDownClass(cls): + cls.loader.restore_registry() + return super(CommonTierValidation, cls).tearDownClass() diff --git a/base_tier_validation/tests/test_tier_validation.py b/base_tier_validation/tests/test_tier_validation.py new file mode 100644 index 00000000..1ea79580 --- /dev/null +++ b/base_tier_validation/tests/test_tier_validation.py @@ -0,0 +1,959 @@ +# Copyright 2018-19 ForgeFlow S.L. (https://www.forgeflow.com) +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). + +from unittest import mock + +from lxml import etree + +from odoo.exceptions import ValidationError +from odoo.tests.common import Form, tagged + +from ..models.tier_validation import BASE_EXCEPTION_FIELDS as BEF, TierValidation as TV +from .common import CommonTierValidation + + +@tagged("post_install", "-at_install") +class TierTierValidation(CommonTierValidation): + def test_01_auto_validation(self): + """When the user can validate all future reviews, it is not needed + to request a validation, the action can be done straight forward.""" + self.test_record.with_user(self.test_user_1.id).action_confirm() + self.assertEqual(self.test_record.state, "confirmed") + + def test_02_no_auto_validation(self): + """User with no right to validate future reviews must request a + validation.""" + with self.assertRaises(ValidationError): + self.test_record.with_user(self.test_user_2.id).action_confirm() + + def test_03_request_validation_approved(self): + """User 2 request a validation and user 1 approves it.""" + self.assertFalse(self.test_record.review_ids) + reviews = self.test_record.with_user(self.test_user_2.id).request_validation() + self.assertTrue(reviews) + record = self.test_record.with_user(self.test_user_1.id) + record.invalidate_model() + record.validate_tier() + self.assertTrue(record.validated) + + def test_04_request_validation_rejected(self): + """Request validation, rejection and reset.""" + self.assertFalse(self.test_record.review_ids) + reviews = self.test_record.with_user(self.test_user_2.id).request_validation() + self.assertTrue(reviews) + record = self.test_record.with_user(self.test_user_1.id) + record.invalidate_model() + record.reject_tier() + self.assertTrue(record.review_ids) + self.assertTrue(record.rejected) + record.restart_validation() + self.assertFalse(record.review_ids) + + def test_05_under_validation(self): + """Write is forbidden in a record under validation.""" + self.assertFalse(self.test_record.review_ids) + reviews = self.test_record.with_user(self.test_user_2.id).request_validation() + self.assertTrue(reviews) + record = self.test_record.with_user(self.test_user_1.id) + record.invalidate_model() + with self.assertRaises(ValidationError): + record.write({"test_field": 0.5}) + + def test_06_validation_process_open(self): + """Operation forbidden while a validation process is open.""" + self.assertFalse(self.test_record.review_ids) + reviews = self.test_record.with_user(self.test_user_2.id).request_validation() + self.assertTrue(reviews) + record = self.test_record.with_user(self.test_user_1.id) + record.invalidate_model() + with self.assertRaises(ValidationError): + record.action_confirm() + + def test_07_search_reviewers(self): + """Test search methods.""" + reviews = self.test_record.with_user(self.test_user_2.id).request_validation() + self.assertTrue(reviews) + record = self.test_record.with_user(self.test_user_1.id) + record.invalidate_model() + self.assertIn(self.test_user_1, record.reviewer_ids) + res = self.test_model.search([("reviewer_ids", "in", self.test_user_1.id)]) + self.assertTrue(res) + + def test_08_search_validated(self): + """Test for the validated search method.""" + self.test_record.with_user(self.test_user_2.id).request_validation() + self.test_record.invalidate_model() + res = self.test_model.with_user(self.test_user_1.id).search( + [("validated", "=", False)] + ) + self.assertTrue(res) + + def test_09_search_rejected(self): + """Test for the rejected search method.""" + self.test_record.with_user(self.test_user_2.id).request_validation() + self.test_record.invalidate_model() + res = self.test_model.with_user(self.test_user_1.id).search( + [("rejected", "=", False)] + ) + self.assertTrue(res) + + def test_10_systray_counter(self): + # Create new test record + test_record = self.test_model.create({"test_field": 2.5}) + # Create tier definitions for both tester models + self.tier_def_obj.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_1.id, + "definition_domain": "[('test_field', '>', 1.0)]", + } + ) + self.tier_def_obj.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_1.id, + "definition_domain": "[('test_field', '>', 1.0)]", + } + ) + self.tier_def_obj.create( + { + "model_id": self.tester_model_2.id, + "review_type": "individual", + "reviewer_id": self.test_user_1.id, + "definition_domain": "[('test_field', '>', 1.0)]", + } + ) + # Request validation + self.test_record.with_user(self.test_user_2.id).request_validation() + self.test_record.invalidate_model() + test_record.with_user(self.test_user_2.id).request_validation() + test_record.invalidate_model() + self.test_record_2.with_user(self.test_user_2.id).request_validation() + self.test_record_2.invalidate_model() + # Get review user count as systray icon would do and check count value + docs = self.test_user_1.with_user(self.test_user_1).review_user_count() + for doc in docs: + if doc.get("name") == "tier.validation.tester2": + self.assertEqual(doc.get("pending_count"), 1) + else: + self.assertEqual(doc.get("pending_count"), 2) + + def test_11_add_comment(self): + # Create new test record + test_record = self.test_model.create({"test_field": 2.5}) + # Create tier definitions + self.tier_def_obj.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_1.id, + "definition_domain": "[('test_field', '>', 1.0)]", + "has_comment": True, + } + ) + # Request validation + review = test_record.with_user(self.test_user_2.id).request_validation() + self.assertTrue(review) + record = test_record.with_user(self.test_user_1.id) + record.invalidate_model() + res = record.validate_tier() + ctx = res.get("context") + wizard = Form(self.env["comment.wizard"].with_context(**ctx)) + wizard.comment = "Test Comment" + wiz = wizard.save() + wiz.add_comment() + self.assertTrue(test_record.review_ids.mapped("comment")) + # Check notify + comment = test_record.with_user( + self.test_user_1.id + )._notify_accepted_reviews_body() + self.assertEqual(comment, "A review was accepted. (Test Comment)") + comment = test_record.with_user( + self.test_user_1.id + )._notify_rejected_review_body() + self.assertEqual(comment, "A review was rejected by John. (Test Comment)") + + def test_11_add_comment_rejection(self): + # Create new test record + test_record = self.test_model.create({"test_field": 2.5}) + # Create tier definitions + self.tier_def_obj.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_1.id, + "definition_domain": "[('test_field', '>', 1.0)]", + "has_comment": True, + } + ) + # Request validation + review = test_record.with_user(self.test_user_2.id).request_validation() + self.assertTrue(review) + record = test_record.with_user(self.test_user_1.id) + record.invalidate_model() + res = record.reject_tier() # Rejection + ctx = res.get("context") + wizard = Form(self.env["comment.wizard"].with_context(**ctx)) + wizard.comment = "Test Comment" + wiz = wizard.save() + wiz.add_comment() + self.assertTrue(test_record.review_ids.mapped("comment")) + # Check notify + comment = test_record.with_user( + self.test_user_1.id + )._notify_accepted_reviews_body() + self.assertEqual(comment, "A review was accepted. (Test Comment)") + comment = test_record.with_user( + self.test_user_1.id + )._notify_rejected_review_body() + self.assertEqual(comment, "A review was rejected by John. (Test Comment)") + + def test_12_approve_sequence(self): + # Create new test record + test_record = self.test_model.create({"test_field": 2.5}) + # Create tier definitions + self.tier_def_obj.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_1.id, + "definition_domain": "[('test_field', '>', 1.0)]", + "approve_sequence": True, + "sequence": 30, + } + ) + self.tier_def_obj.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_2.id, + "definition_domain": "[('test_field', '>', 1.0)]", + "approve_sequence": True, + "sequence": 10, + } + ) + # Request validation + self.assertFalse(self.test_record.review_ids) + reviews = test_record.with_user(self.test_user_2.id).request_validation() + self.assertTrue(reviews) + + docs1 = self.test_user_2.with_user(self.test_user_1).review_user_count() + for doc in docs1: + self.assertEqual(doc.get("pending_count"), 1) + docs2 = self.test_user_2.with_user(self.test_user_2).review_user_count() + for doc in docs2: + self.assertEqual(doc.get("pending_count"), 0) + + record1 = test_record.with_user(self.test_user_1.id) + record1.invalidate_model() + self.assertTrue(record1.can_review) + record2 = test_record.with_user(self.test_user_2.id) + record2.invalidate_model() + self.assertFalse(record2.can_review) + # User 1 validates the record, 2 review should be approved. + self.assertFalse(any(r.status == "approved" for r in record1.review_ids)) + record1.validate_tier() + self.assertTrue(any(r.status == "approved" for r in record1.review_ids)) + + def test_12_approve_sequence_same_user(self): + """Similar to test_12_approve_sequence, but all same users, + the approve_sequence still apply correctly""" + # Create new test record + test_record = self.test_model.create({"test_field": 2.5}) + # Create tier definitions + self.tier_def_obj.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_1.id, + "definition_domain": "[('test_field', '>', 1.0)]", + "approve_sequence": True, + "sequence": 20, + } + ) + self.tier_def_obj.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_1.id, + "definition_domain": "[('test_field', '>', 1.0)]", + "approve_sequence": True, + "sequence": 10, + } + ) + # Request validation + self.assertFalse(self.test_record.review_ids) + reviews = test_record.with_user(self.test_user_1.id).request_validation() + self.assertTrue(reviews) + + record1 = test_record.with_user(self.test_user_1.id) + record1.invalidate_model() + self.assertTrue(record1.can_review) + # Validation will be all by sequence + self.assertEqual( + 3, len(record1.review_ids.filtered(lambda l: l.status == "pending")) + ) + record1.validate_tier() + self.assertEqual( + 2, len(record1.review_ids.filtered(lambda l: l.status == "pending")) + ) + record1.validate_tier() + self.assertEqual( + 1, len(record1.review_ids.filtered(lambda l: l.status == "pending")) + ) + record1.validate_tier() + self.assertEqual( + 0, len(record1.review_ids.filtered(lambda l: l.status == "pending")) + ) + + def test_12_approve_sequence_same_user_bypassed(self): + """Similar to test_12_approve_sequence, with all same users, + but approve_sequence_bypass is True""" + # Create new test record + test_record = self.test_model.create({"test_field": 2.5}) + # Create tier definitions + self.tier_def_obj.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_1.id, + "definition_domain": "[('test_field', '>', 1.0)]", + "approve_sequence": True, + "approve_sequence_bypass": True, + "sequence": 20, + } + ) + self.tier_def_obj.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_1.id, + "definition_domain": "[('test_field', '>', 1.0)]", + "approve_sequence": True, + "approve_sequence_bypass": True, + "sequence": 10, + } + ) + # Request validation + self.assertFalse(self.test_record.review_ids) + reviews = test_record.with_user(self.test_user_1.id).request_validation() + self.assertTrue(reviews) + + record1 = test_record.with_user(self.test_user_1.id) + record1.invalidate_model() + self.assertTrue(record1.can_review) + # When the first tier is validated, all the rest will be approved. + self.assertEqual( + 3, len(record1.review_ids.filtered(lambda l: l.status == "pending")) + ) + record1.validate_tier() + self.assertEqual( + 0, len(record1.review_ids.filtered(lambda l: l.status == "pending")) + ) + + def test_13_onchange_review_type(self): + tier_def_id = self.tier_def_obj.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_1.id, + "definition_domain": "[('test_field', '>', 1.0)]", + "approve_sequence": True, + } + ) + self.assertTrue(tier_def_id.reviewer_id) + tier_def_id.review_type = "group" + tier_def_id.onchange_review_type() + self.assertFalse(tier_def_id.reviewer_id) + + def test_14_onchange_review_type(self): + tier_def_id = self.tier_def_obj.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_1.id, + "definition_domain": "[('test_field', '>', 1.0)]", + "approve_sequence": True, + } + ) + self.assertTrue(tier_def_id.reviewer_id) + tier_def_id.review_type = "group" + tier_def_id.onchange_review_type() + self.assertFalse(tier_def_id.reviewer_id) + + def test_15_review_user_count(self): + # Create new test record + test_record = self.test_model.create({"test_field": 2.5}) + # Create tier definitions + self.tier_def_obj.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_1.id, + "definition_domain": "[('test_field', '>', 1.0)]", + "has_comment": True, + } + ) + # Request validation + review = test_record.with_user(self.test_user_2).request_validation() + self.assertTrue(review) + self.assertTrue(self.test_user_1.get_reviews({"res_ids": review.ids})) + self.assertTrue(self.test_user_1.review_ids) + test_record.invalidate_model() + self.assertTrue(test_record.review_ids) + # Used by front-end + count = self.test_user_1.with_user(self.test_user_1).review_user_count() + self.assertEqual(len(count), 1) + # False Review + self.assertFalse(self.test_record._calc_reviews_validated(False)) + self.assertIn("requested", self.test_record._notify_requested_review_body()) + self.assertIn("rejected", self.test_record._notify_rejected_review_body()) + self.assertIn("accepted", self.test_record._notify_accepted_reviews_body()) + + def test_16_review_user_count_on_rejected(self): + """If document is rejected, it should always removed from tray""" + # Create new test record + test_record = self.test_model.create({"test_field": 2.5}) + # Create tier definitions + self.tier_def_obj.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_2.id, + "definition_domain": "[('test_field', '>', 1.0)]", + } + ) + test_record.with_user(self.test_user_2).request_validation() + record1 = test_record.with_user(self.test_user_1) + record1.invalidate_model() + self.assertTrue(record1.can_review) + self.assertTrue( + self.test_user_1.with_user(self.test_user_1).review_user_count() + ) + self.assertTrue( + self.test_user_2.with_user(self.test_user_2).review_user_count() + ) + # user 1 reject first tier + record1.reject_tier() + record1.invalidate_model() + self.assertFalse(record1.can_review) + # both user 1 and 2 has nothing left in tray + self.assertFalse( + self.test_user_1.with_user(self.test_user_1).review_user_count() + ) + self.assertFalse( + self.test_user_2.with_user(self.test_user_2).review_user_count() + ) + + def test_17_search_records_no_validation(self): + """Search for records that have no validation process started""" + records = self.env["tier.validation.tester"].search( + [("reviewer_ids", "=", False)] + ) + self.assertEqual(len(records), 1) + self.test_record.with_user(self.test_user_2.id).request_validation() + record = self.test_record.with_user(self.test_user_1.id) + record.invalidate_model() + records = self.env["tier.validation.tester"].search( + [("reviewer_ids", "=", False)] + ) + self.assertEqual(len(records), 0) + + def test_18_test_review_by_res_users_field(self): + selected_field = self.env["ir.model.fields"].search( + [("model", "=", self.test_model._name), ("name", "=", "user_id")] + ) + test_record = self.test_model.create( + {"test_field": 2.5, "user_id": self.test_user_2.id} + ) + + definition = self.env["tier.definition"].create( + { + "model_id": self.tester_model.id, + "review_type": "field", + "reviewer_field_id": selected_field.id, + "definition_domain": "[('test_field', '>', 1.0)]", + "approve_sequence": True, + } + ) + + reviews = test_record.request_validation() + review = reviews.filtered(lambda r: r.definition_id == definition) + self.assertTrue(review) + self.assertEqual(review.reviewer_ids, self.test_user_2) + + def test_19_notify_on_create(self): + # notify on create + tier_definition = self.env["tier.definition"].search([]) + tier_definition.write( + { + "notify_on_create": True, + "notify_on_accepted": False, + "notify_on_rejected": False, + "notify_on_restarted": False, + "review_type": "group", + "reviewer_group_id": self.env.ref("base.group_system").id, + } + ) + test_record_1 = self.test_model.create({"test_field": 2.5}) + notifications_no_1 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + test_record_1.request_validation() + notifications_no_2 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + self.assertEqual(notifications_no_2, notifications_no_1 + 1) + + # do not notify on create + tier_definition.write({"notify_on_create": False}) + test_record_2 = self.test_model.create({"test_field": 2.5}) + notifications_no_1 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + test_record_2.request_validation() + notifications_no_2 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + self.assertEqual(notifications_no_2, notifications_no_1) + + def test_20_notify_on_accepted(self): + self.test_user_2.write( + { + "groups_id": [(6, 0, self.env.ref("base.group_system").ids)], + } + ) + + # notify on accepted + tier_definition = self.env["tier.definition"].search([]) + tier_definition.write( + { + "notify_on_create": False, + "notify_on_accepted": True, + "notify_on_rejected": False, + "notify_on_restarted": False, + "review_type": "group", + "reviewer_group_id": self.env.ref("base.group_system").id, + } + ) + test_record_1 = self.test_model.create({"test_field": 2.5}) + test_record_1.request_validation() + test_record_1.invalidate_model() + record = test_record_1.with_user(self.test_user_2.id) + notifications_no_1 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + record.validate_tier() + notifications_no_2 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + self.assertEqual(notifications_no_2, notifications_no_1 + 1) + + # do not notify on accepted + tier_definition.write({"notify_on_accepted": False}) + test_record_2 = self.test_model.create({"test_field": 2.5}) + test_record_2.request_validation() + test_record_2.invalidate_model() + test_record_2.with_user(self.test_user_2.id) + notifications_no_1 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + test_record_2.validate_tier() + notifications_no_2 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + self.assertEqual(notifications_no_2, notifications_no_1) + + def test_21_notify_on_rejected(self): + self.test_user_2.write( + { + "groups_id": [(6, 0, self.env.ref("base.group_system").ids)], + } + ) + + # notify on rejected + tier_definition = self.env["tier.definition"].search([]) + tier_definition.write( + { + "notify_on_create": False, + "notify_on_accepted": False, + "notify_on_rejected": True, + "notify_on_restarted": False, + "review_type": "group", + "reviewer_group_id": self.env.ref("base.group_system").id, + } + ) + test_record_1 = self.test_model.create({"test_field": 2.5}) + test_record_1.request_validation() + test_record_1.invalidate_model() + record = test_record_1.with_user(self.test_user_2.id) + notifications_no_1 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + record.reject_tier() + notifications_no_2 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + self.assertEqual(notifications_no_2, notifications_no_1 + 1) + + # do not notify on rejected + tier_definition.write({"notify_on_rejected": False}) + test_record_2 = self.test_model.create({"test_field": 2.5}) + test_record_2.request_validation() + test_record_2.invalidate_model() + test_record_2.with_user(self.test_user_2.id) + + notifications_no_1 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + test_record_2.reject_tier() + notifications_no_2 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + self.assertEqual(notifications_no_2, notifications_no_1) + + def test_22_notify_on_restarted(self): + self.test_user_2.write( + { + "groups_id": [(6, 0, self.env.ref("base.group_system").ids)], + } + ) + + # notify on restarted + tier_definition = self.env["tier.definition"].search([]) + tier_definition.write( + { + "notify_on_create": False, + "notify_on_accepted": False, + "notify_on_rejected": False, + "notify_on_restarted": True, + "review_type": "group", + "reviewer_group_id": self.env.ref("base.group_system").id, + } + ) + test_record_1 = self.test_model.create({"test_field": 2.5}) + test_record_1.request_validation() + test_record_1.invalidate_model() + record = test_record_1.with_user(self.test_user_2.id) + notifications_no_1 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + record.restart_validation() + notifications_no_2 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + self.assertEqual(notifications_no_2, notifications_no_1 + 1) + + # do not notify on restarted + tier_definition.write({"notify_on_restarted": False}) + test_record_2 = self.test_model.create({"test_field": 2.5}) + test_record_2.request_validation() + test_record_2.with_user(self.test_user_2.id) + notifications_no_1 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + test_record_2.restart_validation() + notifications_no_2 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + self.assertEqual(notifications_no_2, notifications_no_1) + + def test_23_all_notification(self): + self.test_user_2.write( + { + "groups_id": [(6, 0, self.env.ref("base.group_system").ids)], + } + ) + + # notify on restarted + tier_definition = self.env["tier.definition"].search([]) + tier_definition.write( + { + "notify_on_create": True, + "notify_on_accepted": True, + "notify_on_rejected": True, + "notify_on_restarted": True, + "review_type": "group", + "reviewer_group_id": self.env.ref("base.group_system").id, + } + ) + + test_record = self.test_model.create({"test_field": 2.5}) + + # request validation + notifications_no_1 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + test_record.request_validation() + test_record.invalidate_model() + notifications_no_2 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + self.assertEqual(notifications_no_2, notifications_no_1 + 1) + + # accept validation + record = test_record.with_user(self.test_user_2.id) + notifications_no_1 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + record.validate_tier() + notifications_no_2 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + self.assertEqual(notifications_no_2, notifications_no_1 + 1) + + # restart validation + notifications_no_1 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + record.restart_validation() + notifications_no_2 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + self.assertEqual(notifications_no_2, notifications_no_1 + 1) + + # reject validation + record.request_validation() + notifications_no_1 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + record.reject_tier() + notifications_no_2 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + self.assertEqual(notifications_no_2, notifications_no_1 + 1) + + def test_24_no_notification(self): + self.test_user_2.write( + { + "groups_id": [(6, 0, self.env.ref("base.group_system").ids)], + } + ) + + # notify on restarted + tier_definition = self.env["tier.definition"].search([]) + tier_definition.write( + { + "notify_on_create": False, + "notify_on_accepted": False, + "notify_on_rejected": False, + "notify_on_restarted": False, + "review_type": "group", + "reviewer_group_id": self.env.ref("base.group_system").id, + } + ) + + test_record = self.test_model.create({"test_field": 2.5}) + + # request validation + notifications_no_1 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + test_record.request_validation() + test_record.invalidate_model() + notifications_no_2 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + self.assertEqual(notifications_no_2, notifications_no_1) + + # accept validation + record = test_record.with_user(self.test_user_2.id) + notifications_no_1 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + record.validate_tier() + notifications_no_2 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + self.assertEqual(notifications_no_2, notifications_no_1) + + # restart validation + notifications_no_1 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + record.restart_validation() + notifications_no_2 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + self.assertEqual(notifications_no_2, notifications_no_1) + + # reject validation + record.request_validation() + notifications_no_1 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + record.reject_tier() + notifications_no_2 = len( + self.env["mail.notification"].search( + [("res_partner_id", "=", self.test_user_1.partner_id.id)] + ) + ) + self.assertEqual(notifications_no_2, notifications_no_1) + + def test_25_change_field_exception_validation(self): + """Test under and after validations""" + # Cannot create `tier.validation.exception` records because + # `tier.validation.tester` are fake model and its fields are + # not propagated to the DDBB and cannot read from `ir.model.fields`. + # We will use the mock.patch instead. + _tvf = ["test_validation_field"] + _rv = _tvf + BEF + self.assertEqual(self.test_record.test_validation_field, 0) + self.assertFalse(self.test_record.review_ids) + reviews = self.test_record.with_user(self.test_user_2.id).request_validation() + self.assertTrue(reviews) + self.test_record.invalidate_model() + self.assertTrue(self.test_record.review_ids) + # Unable to write test_validation_field under validation + with self.assertRaises(ValidationError): + self.test_record.with_user(self.test_user_2.id).write( + {"test_validation_field": 1} + ) + # Able to write test_validation_field under validation + with mock.patch.object( + TV, "_get_under_validation_exceptions", return_value=_rv + ): + self.test_record.with_user(self.test_user_2.id).write( + {"test_validation_field": 2} + ) + self.assertEqual(self.test_record.test_validation_field, 2) + # Validate record + record = self.test_record.with_user(self.test_user_1.id) + record.invalidate_model() + record.validate_tier() + record.action_confirm() + self.assertTrue(record.validated) + # Unable to write test_validation_field after validation + with self.assertRaises(ValidationError): + # Simulate there are fields, but not test_validation_field + with mock.patch.object(TV, "_get_validation_exceptions", return_value=BEF): + self.test_record.with_user(self.test_user_2.id).write( + {"test_validation_field": 3} + ) + # Able to write test_validation_field after validation + with mock.patch.multiple( + TV, + _get_validation_exceptions=mock.MagicMock(return_value=_tvf), + _get_after_validation_exceptions=mock.MagicMock(return_value=_rv), + ): + self.test_record.with_user(self.test_user_2.id).write( + {"test_validation_field": 4} + ) + self.assertEqual(self.test_record.test_validation_field, 4) + + +@tagged("at_install") +class TierTierValidationView(CommonTierValidation): + def test_view_manual(self): + # We need to add a view in order to ensure that an automatic view with all + # fields is not created + self.env["ir.ui.view"].create( + { + "model": self.test_record._name, + "name": "Demo view", + "arch": """
+
+
+ + + +
""", + } + ) + with Form(self.test_record) as f: + self.assertNotIn("review_ids", f._values) + form = etree.fromstring(f._view["arch"]) + self.assertFalse(form.xpath("//field[@name='review_ids']")) + self.assertFalse(form.xpath("//field[@name='can_review']")) + self.assertFalse(form.xpath("//button[@name='request_validation']")) + + def test_view_automatic(self): + # We need to add a view in order to ensure that an automatic view with all + # fields is not created + self.env["ir.ui.view"].create( + { + "model": self.test_record_2._name, + "name": "Demo view", + "arch": """
+
+
+ + + +
""", + } + ) + with Form(self.test_record_2) as f: + self.assertIn("review_ids", f._values) + form = etree.fromstring(f._view["arch"]) + self.assertTrue(form.xpath("//field[@name='review_ids']")) + self.assertTrue(form.xpath("//field[@name='can_review']")) + self.assertTrue(form.xpath("//button[@name='request_validation']")) diff --git a/base_tier_validation/tests/tier_validation_tester.py b/base_tier_validation/tests/tier_validation_tester.py new file mode 100644 index 00000000..882626ed --- /dev/null +++ b/base_tier_validation/tests/tier_validation_tester.py @@ -0,0 +1,59 @@ +# Copyright 2018-19 ForgeFlow S.L. (https://www.forgeflow.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class TierValidationTester(models.Model): + _name = "tier.validation.tester" + _description = "Tier Validation Tester" + _inherit = ["tier.validation", "mail.thread"] + _tier_validation_manual_config = True + + state = fields.Selection( + selection=[ + ("draft", "Draft"), + ("confirmed", "Confirmed"), + ("cancel", "Cancel"), + ], + default="draft", + ) + test_validation_field = fields.Integer(default=0) + test_field = fields.Float() + user_id = fields.Many2one(string="Assigned to:", comodel_name="res.users") + + def action_confirm(self): + self.write({"state": "confirmed"}) + + +class TierValidationTester2(models.Model): + _name = "tier.validation.tester2" + _description = "Tier Validation Tester 2" + _inherit = ["tier.validation"] + _tier_validation_manual_config = False + + state = fields.Selection( + selection=[ + ("draft", "Draft"), + ("confirmed", "Confirmed"), + ("cancel", "Cancel"), + ], + default="draft", + ) + test_field = fields.Float() + test_validation_field = fields.Float() + user_id = fields.Many2one(string="Assigned to:", comodel_name="res.users") + + def action_confirm(self): + self.write({"state": "confirmed"}) + + +class TierDefinition(models.Model): + _inherit = "tier.definition" + + @api.model + def _get_tier_validation_model_names(self): + res = super()._get_tier_validation_model_names() + res.append("tier.validation.tester") + res.append("tier.validation.tester2") + return res diff --git a/base_tier_validation/views/res_config_settings_views.xml b/base_tier_validation/views/res_config_settings_views.xml new file mode 100644 index 00000000..1dccc519 --- /dev/null +++ b/base_tier_validation/views/res_config_settings_views.xml @@ -0,0 +1,83 @@ + + + + + + res.config.settings.view.form.budget + res.config.settings + + + + +
+

Tier Validation

+
+
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+ +
+
+
+
+
+
diff --git a/base_tier_validation/views/tier_definition_view.xml b/base_tier_validation/views/tier_definition_view.xml new file mode 100644 index 00000000..19728d4a --- /dev/null +++ b/base_tier_validation/views/tier_definition_view.xml @@ -0,0 +1,158 @@ + + + + + tier.definition.tree + tier.definition + + + + + + + + + + + + + + + + tier.definition.form + tier.definition + +
+ +
+ +
+ Name +

+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + tier.definition.search + tier.definition + + + + + + + + + + + + + + + + Tier Definition + ir.actions.act_window + tier.definition + tree,form + {'search_default_all': 1} + + + + diff --git a/base_tier_validation/views/tier_review_view.xml b/base_tier_validation/views/tier_review_view.xml new file mode 100644 index 00000000..2c9fa538 --- /dev/null +++ b/base_tier_validation/views/tier_review_view.xml @@ -0,0 +1,25 @@ + + + + + tier.review.tree + tier.review + + + + + + + + + + + + + + + diff --git a/base_tier_validation/views/tier_validation_exception_view.xml b/base_tier_validation/views/tier_validation_exception_view.xml new file mode 100644 index 00000000..723f1ee3 --- /dev/null +++ b/base_tier_validation/views/tier_validation_exception_view.xml @@ -0,0 +1,124 @@ + + + + + tier.validation.exception.tree + tier.validation.exception + + + + + + + + + + + + + + + tier.validation.exception.form + tier.validation.exception + +
+ +
+
+ + + + + + + + + + + + + +
+
+
+
+ + + tier.validation.exception.search + tier.validation.exception + + + + + + + + + + + + + + + + + + + + Tier Validation Exception + ir.actions.act_window + tier.validation.exception + tree,form + +

Create a new Validation Exception!

+

Once created, you can decide which fields you want to be editable when the record:

+
    +
  • It's in the validation process
  • +
  • It's fully validated
  • +
+
+
+ + +
diff --git a/base_tier_validation/wizard/__init__.py b/base_tier_validation/wizard/__init__.py new file mode 100644 index 00000000..92bd0df5 --- /dev/null +++ b/base_tier_validation/wizard/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import comment_wizard diff --git a/base_tier_validation/wizard/comment_wizard.py b/base_tier_validation/wizard/comment_wizard.py new file mode 100644 index 00000000..5c5a6c93 --- /dev/null +++ b/base_tier_validation/wizard/comment_wizard.py @@ -0,0 +1,25 @@ +# Copyright 2019 Ecosoft Co., Ltd. (http://ecosoft.co.th) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class CommentWizard(models.TransientModel): + _name = "comment.wizard" + _description = "Comment Wizard" + + validate_reject = fields.Char() + res_model = fields.Char() + res_id = fields.Integer() + review_ids = fields.Many2many(comodel_name="tier.review") + comment = fields.Char(required=True) + + def add_comment(self): + self.ensure_one() + rec = self.env[self.res_model].browse(self.res_id) + self.review_ids.write({"comment": self.comment}) + if self.validate_reject == "validate": + rec._validate_tier(self.review_ids) + if self.validate_reject == "reject": + rec._rejected_tier(self.review_ids) + rec._update_counter({"review_deleted": True}) diff --git a/base_tier_validation/wizard/comment_wizard_view.xml b/base_tier_validation/wizard/comment_wizard_view.xml new file mode 100644 index 00000000..70c1a928 --- /dev/null +++ b/base_tier_validation/wizard/comment_wizard_view.xml @@ -0,0 +1,26 @@ + + + + + Comment Wizard + comment.wizard + form + +
+ + + +
+
+
+
+
+
diff --git a/setup/base_tier_validation/odoo/addons/base_tier_validation b/setup/base_tier_validation/odoo/addons/base_tier_validation new file mode 120000 index 00000000..d48caa19 --- /dev/null +++ b/setup/base_tier_validation/odoo/addons/base_tier_validation @@ -0,0 +1 @@ +../../../../base_tier_validation \ No newline at end of file diff --git a/setup/base_tier_validation/setup.py b/setup/base_tier_validation/setup.py new file mode 100644 index 00000000..28c57bb6 --- /dev/null +++ b/setup/base_tier_validation/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +) From 2055e06a0dc7a7b33df35a9e772e685daa3c3129 Mon Sep 17 00:00:00 2001 From: nobuQuartile Date: Tue, 12 Aug 2025 04:07:06 +0000 Subject: [PATCH 2/3] reflect oca changes --- base_tier_validation/README.rst | 11 +- base_tier_validation/__manifest__.py | 3 +- base_tier_validation/data/cron_data.xml | 17 + base_tier_validation/data/mail_data.xml | 24 +- .../i18n/base_tier_validation.pot | 60 ++- base_tier_validation/i18n/es.po | 91 +++- base_tier_validation/i18n/es_MX.po | 60 ++- base_tier_validation/i18n/fr.po | 114 ++++- base_tier_validation/i18n/it.po | 79 +++- base_tier_validation/i18n/nl_NL.po | 71 ++- base_tier_validation/i18n/sv.po | 66 ++- base_tier_validation/i18n/tr.po | 165 +++++-- base_tier_validation/i18n/zh_CN.po | 63 ++- .../migrations/16.0.3.1.0/pre-migration.py | 122 +++++ base_tier_validation/models/res_users.py | 4 +- .../models/tier_definition.py | 35 ++ base_tier_validation/models/tier_review.py | 46 +- .../models/tier_validation.py | 236 +++++++--- .../models/tier_validation_exception.py | 2 +- base_tier_validation/readme/CONTRIBUTORS.rst | 3 + .../static/description/index.html | 64 +-- .../templates/tier_validation_templates.xml | 24 +- base_tier_validation/tests/__init__.py | 2 +- base_tier_validation/tests/common.py | 71 ++- .../tests/test_tier_validation.py | 421 ++++++++++++++---- .../tests/test_tier_validation_reminder.py | 46 ++ .../tests/tier_validation_tester.py | 1 + .../views/tier_definition_view.xml | 11 +- 28 files changed, 1594 insertions(+), 318 deletions(-) create mode 100644 base_tier_validation/data/cron_data.xml create mode 100644 base_tier_validation/migrations/16.0.3.1.0/pre-migration.py create mode 100644 base_tier_validation/tests/test_tier_validation_reminder.py diff --git a/base_tier_validation/README.rst b/base_tier_validation/README.rst index 07d04a39..97429b2e 100644 --- a/base_tier_validation/README.rst +++ b/base_tier_validation/README.rst @@ -1,3 +1,7 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + ==================== Base Tier Validation ==================== @@ -7,13 +11,13 @@ Base Tier Validation !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:63bf2b0b14c3e9aba79d5e35651801a5d7172339b1265297c4712d5647b65494 + !! source digest: sha256:3ef2fb9504521a977d133828ec0237701cd3b45b490e193c410a4c6cb4c226c0 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Mature-brightgreen.png :target: https://odoo-community.org/page/development-status :alt: Mature -.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png +.. |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%2Fserver--ux-lightgray.png?logo=github @@ -229,6 +233,9 @@ Contributors * Evan Soh * Manuel Regidor * Eduardo de Miguel +* `XCG Consulting `_: + + * Houzéfa Abbasbhay Maintainers ~~~~~~~~~~~ diff --git a/base_tier_validation/__manifest__.py b/base_tier_validation/__manifest__.py index 42dc65cb..e68525a4 100644 --- a/base_tier_validation/__manifest__.py +++ b/base_tier_validation/__manifest__.py @@ -3,7 +3,7 @@ { "name": "Base Tier Validation", "summary": "Implement a validation process based on tiers.", - "version": "16.0.2.1.0", + "version": "16.0.4.0.2", "development_status": "Mature", "maintainers": ["LoisRForgeFlow"], "category": "Tools", @@ -14,6 +14,7 @@ "installable": True, "depends": ["mail"], "data": [ + "data/cron_data.xml", "data/mail_data.xml", "security/ir.model.access.csv", "security/tier_validation_security.xml", diff --git a/base_tier_validation/data/cron_data.xml b/base_tier_validation/data/cron_data.xml new file mode 100644 index 00000000..09f776af --- /dev/null +++ b/base_tier_validation/data/cron_data.xml @@ -0,0 +1,17 @@ + + + + Send Tier Review Reminder + 1 + days + -1 + + + + model._cron_send_review_reminder() + code + + diff --git a/base_tier_validation/data/mail_data.xml b/base_tier_validation/data/mail_data.xml index 8207bc4c..fdcef9e2 100644 --- a/base_tier_validation/data/mail_data.xml +++ b/base_tier_validation/data/mail_data.xml @@ -6,7 +6,7 @@ forcecreate="1" > Tier Validation Requested - + @@ -16,7 +16,7 @@ forcecreate="1" > Tier Validation Accepted Notification - + @@ -26,7 +26,7 @@ forcecreate="1" > Tier Validation Rejected Notification - + @@ -36,8 +36,26 @@ forcecreate="1" > Tier Validation Restarted + + + + + + Tier Validation Reminder + + Tier Validation Reminder + fa-bell + diff --git a/base_tier_validation/i18n/base_tier_validation.pot b/base_tier_validation/i18n/base_tier_validation.pot index e8274154..28351fd4 100644 --- a/base_tier_validation/i18n/base_tier_validation.pot +++ b/base_tier_validation/i18n/base_tier_validation.pot @@ -42,7 +42,14 @@ msgstr "" #. module: base_tier_validation #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form -msgid "Bypassed, if previous tier was validated by same reviewer" +msgid "Bypass, if previous tier was validated by same reviewer" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +#, python-format +msgid "A review has been requested %s days ago." msgstr "" #. module: base_tier_validation @@ -356,6 +363,11 @@ msgid "" "definition are restarted." msgstr "" +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__is_reevaluation_required +msgid "Is Reevaluation Required" +msgstr "" + #. module: base_tier_validation #: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action msgid "It's fully validated" @@ -374,6 +386,11 @@ msgstr "" msgid "Last Modified on" msgstr "" +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__last_reminder_date +msgid "Last Reminder Date" +msgstr "" + #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid @@ -393,12 +410,16 @@ msgstr "" #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_id -#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_name #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search msgid "Model" msgstr "" +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_name +msgid "Model Name" +msgstr "" + #. module: base_tier_validation #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form msgid "More Options" @@ -460,6 +481,13 @@ msgstr "" msgid "Notify Reviewers on Restarted" msgstr "" +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "" +"Number of days after which a message must be posted to remind about pending " +"validation (0 = no reminder)" +msgstr "" + #. module: base_tier_validation #: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action msgid "" @@ -500,6 +528,11 @@ msgstr "" msgid "Pending" msgstr "" +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Reevaluate Reviews" +msgstr "" + #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model_id msgid "Referenced Model" @@ -603,11 +636,21 @@ msgstr "" msgid "Reviews" msgstr "" +#. module: base_tier_validation +#: model:ir.actions.server,name:base_tier_validation.ir_cron_auto_tier_validation_ir_actions_server +#: model:ir.cron,cron_name:base_tier_validation.ir_cron_auto_tier_validation +msgid "Send Tier Review Reminder" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "Send reminder message on pending reviews" +msgstr "" + #. module: base_tier_validation #. odoo-javascript #: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__sequence -#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence #, python-format msgid "Sequence" msgstr "" @@ -655,6 +698,11 @@ msgid "" "Please request a validation." msgstr "" +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence +msgid "Tier" +msgstr "" + #. module: base_tier_validation #: model:ir.actions.act_window,name:base_tier_validation.tier_definition_action #: model:ir.model,name:base_tier_validation.model_tier_definition @@ -710,6 +758,12 @@ msgstr "" msgid "Tier Validation Rejected Notification" msgstr "" +#. module: base_tier_validation +#: model:mail.activity.type,name:base_tier_validation.mail_act_tier_validation_reminder +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_reminder +msgid "Tier Validation Reminder" +msgstr "" + #. module: base_tier_validation #: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested msgid "Tier Validation Requested" diff --git a/base_tier_validation/i18n/es.po b/base_tier_validation/i18n/es.po index d838810b..264b69ab 100644 --- a/base_tier_validation/i18n/es.po +++ b/base_tier_validation/i18n/es.po @@ -7,15 +7,15 @@ msgstr "" "Project-Id-Version: Odoo Server 16.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2024-07-05 07:53+0000\n" -"PO-Revision-Date: 2024-07-05 09:54+0200\n" -"Last-Translator: \n" +"PO-Revision-Date: 2025-03-10 11:06+0000\n" +"Last-Translator: Víctor Martínez \n" "Language-Team: \n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Poedit 3.4.4\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.10.2\n" #. module: base_tier_validation #. odoo-javascript @@ -27,17 +27,18 @@ msgstr "0 Pendientes" #. module: base_tier_validation #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label msgid " This Record needs to be validated." -msgstr "" +msgstr " Este registro necesita ser validado." #. module: base_tier_validation #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label msgid " Operation has been rejected." msgstr "" +" La operación ha sido rechazada." #. module: base_tier_validation #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label msgid " Operation has been validated!" -msgstr "" +msgstr " La operación ha sido validada!" #. module: base_tier_validation #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form @@ -46,9 +47,15 @@ msgstr "Nombre" #. module: base_tier_validation #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form -msgid "Bypassed, if previous tier was validated by same reviewer" +msgid "Bypass, if previous tier was validated by same reviewer" msgstr "" -"Omitido, si el nivel anterior fue validado por el mismo revisor" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +#, python-format +msgid "A review has been requested %s days ago." +msgstr "Una revisión ha sido solicitado hace %s días." #. module: base_tier_validation #. odoo-python @@ -202,12 +209,12 @@ msgstr "Cancelar" #: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard #, python-format msgid "Comment" -msgstr "Comentar" +msgstr "Comentario" #. module: base_tier_validation #: model:ir.model,name:base_tier_validation.model_comment_wizard msgid "Comment Wizard" -msgstr "Wizard Comentario" +msgstr "Asistente de comentario" #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__comment @@ -336,7 +343,7 @@ msgstr "Ha comentado" #: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__id #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__id msgid "ID" -msgstr "" +msgstr "ID" #. module: base_tier_validation #: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_create @@ -374,6 +381,11 @@ msgstr "" "Si está establecido, los revisores serán notificados por email cuando una " "revisión relativa a ésta definición se ha reiniciado." +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__is_reevaluation_required +msgid "Is Reevaluation Required" +msgstr "" + #. module: base_tier_validation #: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action msgid "It's fully validated" @@ -392,6 +404,11 @@ msgstr "Está en proceso de Validación" msgid "Last Modified on" msgstr "Última modificación en" +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__last_reminder_date +msgid "Last Reminder Date" +msgstr "Fecha de último recordatorio" + #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid @@ -411,12 +428,16 @@ msgstr "Última actualización en" #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_id -#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_name #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search msgid "Model" msgstr "Modelo" +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_name +msgid "Model Name" +msgstr "Nombre del modelo" + #. module: base_tier_validation #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form msgid "More Options" @@ -478,6 +499,15 @@ msgstr "Notificar revisores cuando se Rechaza" msgid "Notify Reviewers on Restarted" msgstr "Notificar revisores cuando se Reinicia" +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "" +"Number of days after which a message must be posted to remind about pending " +"validation (0 = no reminder)" +msgstr "" +"Número de días después de los cuales se debe publicar un mensaje para " +"recordar sobre la validación pendiente (0 = sin recordatorio)" + #. module: base_tier_validation #: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action msgid "" @@ -523,6 +553,11 @@ msgstr "" msgid "Pending" msgstr "Pendiente" +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Reevaluate Reviews" +msgstr "" + #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model_id msgid "Referenced Model" @@ -625,11 +660,21 @@ msgstr "Revisores" msgid "Reviews" msgstr "Revisiones" +#. module: base_tier_validation +#: model:ir.actions.server,name:base_tier_validation.ir_cron_auto_tier_validation_ir_actions_server +#: model:ir.cron,cron_name:base_tier_validation.ir_cron_auto_tier_validation +msgid "Send Tier Review Reminder" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "Send reminder message on pending reviews" +msgstr "" + #. module: base_tier_validation #. odoo-javascript #: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__sequence -#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence #, python-format msgid "Sequence" msgstr "Secuencia" @@ -679,6 +724,11 @@ msgstr "" "Esta acción necesita ser validada para algún registro.\n" "Por favor, solicita una validación." +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence +msgid "Tier" +msgstr "Secuencia" + #. module: base_tier_validation #: model:ir.actions.act_window,name:base_tier_validation.tier_definition_action #: model:ir.model,name:base_tier_validation.model_tier_definition @@ -734,6 +784,12 @@ msgstr "Excepciones de Validación del Tier" msgid "Tier Validation Rejected Notification" msgstr "Validación de nivel Notificación rechazada" +#. module: base_tier_validation +#: model:mail.activity.type,name:base_tier_validation.mail_act_tier_validation_reminder +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_reminder +msgid "Tier Validation Reminder" +msgstr "" + #. module: base_tier_validation #: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested msgid "Tier Validation Requested" @@ -895,6 +951,12 @@ msgstr "" msgid "e.g. Tier Validation for..." msgstr "ej. Validación de Nivel por..." +#~ msgid "" +#~ "Bypassed, if previous tier was validated by same reviewer" +#~ msgstr "" +#~ "Omitido, si el nivel anterior fue validado por el mismo revisor" + #~ msgid "" #~ "\n" #~ " This Record needs to be\n" @@ -925,6 +987,3 @@ msgstr "ej. Validación de Nivel por..." #~ " La operación ha sido\n" #~ " validada\n" #~ " !" - -#~ msgid "Tier" -#~ msgstr "Secuencia" diff --git a/base_tier_validation/i18n/es_MX.po b/base_tier_validation/i18n/es_MX.po index b39c7105..9e39997e 100644 --- a/base_tier_validation/i18n/es_MX.po +++ b/base_tier_validation/i18n/es_MX.po @@ -45,7 +45,14 @@ msgstr "Nombre" #. module: base_tier_validation #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form -msgid "Bypassed, if previous tier was validated by same reviewer" +msgid "Bypass, if previous tier was validated by same reviewer" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +#, python-format +msgid "A review has been requested %s days ago." msgstr "" #. module: base_tier_validation @@ -364,6 +371,11 @@ msgid "" "definition are restarted." msgstr "" +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__is_reevaluation_required +msgid "Is Reevaluation Required" +msgstr "" + #. module: base_tier_validation #: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action msgid "It's fully validated" @@ -382,6 +394,11 @@ msgstr "" msgid "Last Modified on" msgstr "Última modificación el" +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__last_reminder_date +msgid "Last Reminder Date" +msgstr "" + #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid @@ -401,12 +418,16 @@ msgstr "Última modificación en" #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_id -#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_name #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search msgid "Model" msgstr "Modelo" +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_name +msgid "Model Name" +msgstr "" + #. module: base_tier_validation #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form msgid "More Options" @@ -468,6 +489,13 @@ msgstr "" msgid "Notify Reviewers on Restarted" msgstr "" +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "" +"Number of days after which a message must be posted to remind about pending " +"validation (0 = no reminder)" +msgstr "" + #. module: base_tier_validation #: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action msgid "" @@ -508,6 +536,11 @@ msgstr "" msgid "Pending" msgstr "Pendiente" +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Reevaluate Reviews" +msgstr "" + #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model_id msgid "Referenced Model" @@ -610,11 +643,21 @@ msgstr "Revisores" msgid "Reviews" msgstr "Comentarios" +#. module: base_tier_validation +#: model:ir.actions.server,name:base_tier_validation.ir_cron_auto_tier_validation_ir_actions_server +#: model:ir.cron,cron_name:base_tier_validation.ir_cron_auto_tier_validation +msgid "Send Tier Review Reminder" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "Send reminder message on pending reviews" +msgstr "" + #. module: base_tier_validation #. odoo-javascript #: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__sequence -#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence #, python-format msgid "Sequence" msgstr "Secuencia" @@ -664,6 +707,11 @@ msgstr "" "Esta acción debe validarse para al menos un registro.\n" "Solicite una validación." +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence +msgid "Tier" +msgstr "" + #. module: base_tier_validation #: model:ir.actions.act_window,name:base_tier_validation.tier_definition_action #: model:ir.model,name:base_tier_validation.model_tier_definition @@ -719,6 +767,12 @@ msgstr "" msgid "Tier Validation Rejected Notification" msgstr "Notificación de rechazo de validación de nivel" +#. module: base_tier_validation +#: model:mail.activity.type,name:base_tier_validation.mail_act_tier_validation_reminder +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_reminder +msgid "Tier Validation Reminder" +msgstr "" + #. module: base_tier_validation #: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested msgid "Tier Validation Requested" diff --git a/base_tier_validation/i18n/fr.po b/base_tier_validation/i18n/fr.po index 12624ce8..e00fab35 100644 --- a/base_tier_validation/i18n/fr.po +++ b/base_tier_validation/i18n/fr.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 14.0\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2024-07-04 09:47+0000\n" +"PO-Revision-Date: 2025-01-22 16:06+0000\n" "Last-Translator: Pierre-François Teyssier \n" "Language-Team: none\n" "Language: fr\n" @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.17\n" +"X-Generator: Weblate 5.6.2\n" #. module: base_tier_validation #. odoo-javascript @@ -26,17 +26,17 @@ msgstr "0 en attente" #. module: base_tier_validation #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label msgid " This Record needs to be validated." -msgstr "" +msgstr " Cet enregistrement doit-être validé." #. module: base_tier_validation #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label msgid " Operation has been rejected." -msgstr "" +msgstr " L'opération a été rejetée." #. module: base_tier_validation #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label msgid " Operation has been validated!" -msgstr "" +msgstr " L'peration a été validée !" #. module: base_tier_validation #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form @@ -45,10 +45,15 @@ msgstr "Nom" #. module: base_tier_validation #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form -msgid "Bypassed, if previous tier was validated by same reviewer" +msgid "Bypass, if previous tier was validated by same reviewer" msgstr "" -"Contourné, si le niveau précédent a été validé par le même réviseur" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +#, python-format +msgid "A review has been requested %s days ago." +msgstr "Une revue a été demandée il y a %s jours." #. module: base_tier_validation #. odoo-python @@ -114,7 +119,7 @@ msgstr "Tout" #. module: base_tier_validation #: model:ir.model.fields,help:base_tier_validation.field_tier_validation_exception__group_ids msgid "Allowed groups to use this Tier Validation Exception" -msgstr "" +msgstr "Groupes autorisés à utiliser cette exception de tiers validation" #. module: base_tier_validation #: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__group @@ -326,7 +331,7 @@ msgstr "Regrouper par" #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__group_ids msgid "Groups" -msgstr "" +msgstr "Groupes" #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__has_comment @@ -377,6 +382,11 @@ msgstr "" "Si défini, les réviseurs seront notifiés par email quand une revue liée à " "cette définition est recommencée." +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__is_reevaluation_required +msgid "Is Reevaluation Required" +msgstr "Réexamen est requis" + #. module: base_tier_validation #: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action msgid "It's fully validated" @@ -395,6 +405,11 @@ msgstr "En cours de processus de validation" msgid "Last Modified on" msgstr "Dernière modification le" +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__last_reminder_date +msgid "Last Reminder Date" +msgstr "Date du dernier rappel" + #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid @@ -414,12 +429,16 @@ msgstr "Dernière mise à jour le" #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_id -#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_name #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search msgid "Model" msgstr "Modèle" +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_name +msgid "Model Name" +msgstr "Nom du modèle" + #. module: base_tier_validation #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form msgid "More Options" @@ -428,7 +447,7 @@ msgstr "Plus d'options" #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__name msgid "Name" -msgstr "" +msgstr "Nom" #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__need_validation @@ -481,12 +500,23 @@ msgstr "Notifier les réviseurs au refus" msgid "Notify Reviewers on Restarted" msgstr "Notifier les révisieurs au redémarrage" +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "" +"Number of days after which a message must be posted to remind about pending " +"validation (0 = no reminder)" +msgstr "" +"Nombre de jours après lequel un message de rappel de validation en attente " +"doit-être envoyé (0 = pas de rappel)" + #. module: base_tier_validation #: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action msgid "" "Once created, you can decide which fields you want to be editable when the " "record:" msgstr "" +"Une fois créé, vous pouvez décider des champs qui seront modifiables dans " +"l'enregistrement :" #. module: base_tier_validation #. odoo-python @@ -525,6 +555,11 @@ msgstr "" msgid "Pending" msgstr "En attente" +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Reevaluate Reviews" +msgstr "Réexaminer les revues" + #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model_id msgid "Referenced Model" @@ -627,11 +662,21 @@ msgstr "Réviseurs" msgid "Reviews" msgstr "Revues" +#. module: base_tier_validation +#: model:ir.actions.server,name:base_tier_validation.ir_cron_auto_tier_validation_ir_actions_server +#: model:ir.cron,cron_name:base_tier_validation.ir_cron_auto_tier_validation +msgid "Send Tier Review Reminder" +msgstr "Envoyer un rappel de revue au tiers" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "Send reminder message on pending reviews" +msgstr "Envoyer un message de rappel pour les revues en cours" + #. module: base_tier_validation #. odoo-javascript #: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__sequence -#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence #, python-format msgid "Sequence" msgstr "Séquence" @@ -681,6 +726,11 @@ msgstr "" "Cette action requiert une validation pour au moins un des enregistrements. \n" "Veuillez demander cette validation." +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence +msgid "Tier" +msgstr "Tiers" + #. module: base_tier_validation #: model:ir.actions.act_window,name:base_tier_validation.tier_definition_action #: model:ir.model,name:base_tier_validation.model_tier_definition @@ -724,18 +774,24 @@ msgstr "Validation par niveau - Notification - Acceptée" #: model:ir.ui.menu,name:base_tier_validation.menu_tier_validation_exception #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_form msgid "Tier Validation Exception" -msgstr "" +msgstr "Exception de validation tiers" #. module: base_tier_validation #: model:ir.model,name:base_tier_validation.model_tier_validation_exception msgid "Tier Validation Exceptions" -msgstr "" +msgstr "Exceptions de validation tiers" #. module: base_tier_validation #: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_rejected msgid "Tier Validation Rejected Notification" msgstr "Validation par niveau - Notification - Rejetée" +#. module: base_tier_validation +#: model:mail.activity.type,name:base_tier_validation.mail_act_tier_validation_reminder +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_reminder +msgid "Tier Validation Reminder" +msgstr "Rappel de validation tiers" + #. module: base_tier_validation #: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested msgid "Tier Validation Requested" @@ -826,7 +882,7 @@ msgstr "Date de validation formatée" #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validation_status msgid "Validation Status" -msgstr "" +msgstr "Statut de la validation" #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__review_ids @@ -836,27 +892,27 @@ msgstr "Validations" #. module: base_tier_validation #: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__no msgid "Without validation" -msgstr "" +msgstr "Sans validation" #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_after_validation msgid "Write after Validation" -msgstr "" +msgstr "Écrire après la validation" #. module: base_tier_validation #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search msgid "Write after validation" -msgstr "" +msgstr "Écrire après la validation" #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_under_validation msgid "Write under Validation" -msgstr "" +msgstr "Écrire sous la validation" #. module: base_tier_validation #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search msgid "Write under validation" -msgstr "" +msgstr "Écrire sous la validation" #. module: base_tier_validation #. odoo-python @@ -869,6 +925,11 @@ msgid "" "Only those fields can be modified:\n" "- %(allowed_fields)s" msgstr "" +"Vous n'êtes pas autorisé à écrire ces champs après validation.\n" +"- %(not_allowed_fields)s\n" +"\n" +"Seuls ces champs peuvent être modifiés:\n" +"- %(allowed_fields)s" #. module: base_tier_validation #. odoo-python @@ -881,12 +942,23 @@ msgid "" "Only those fields can be modified:\n" "- %(allowed_fields)s" msgstr "" +"Vous n'êtes pas autorisé à écrire ces champs en cours validation.\n" +"- %(not_allowed_fields)s\n" +"\n" +"Seuls ces champs peuvent être modifiés:\n" +"- %(allowed_fields)s" #. module: base_tier_validation #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form msgid "e.g. Tier Validation for..." msgstr "par ex Niveau de validation pour..." +#~ msgid "" +#~ "Bypassed, if previous tier was validated by same reviewer" +#~ msgstr "" +#~ "Contourné, si le niveau précédent a été validé par le même " +#~ "réviseur" + #~ msgid "" #~ "\n" #~ " This Record needs to be\n" diff --git a/base_tier_validation/i18n/it.po b/base_tier_validation/i18n/it.po index 0eb8634e..b87e34d2 100644 --- a/base_tier_validation/i18n/it.po +++ b/base_tier_validation/i18n/it.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 14.0\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2024-07-18 09:58+0000\n" +"PO-Revision-Date: 2025-07-23 14:25+0000\n" "Last-Translator: mymage \n" "Language-Team: none\n" "Language: it\n" @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: \n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 5.6.2\n" +"X-Generator: Weblate 5.10.4\n" #. module: base_tier_validation #. odoo-javascript @@ -31,7 +31,8 @@ msgstr " Il record deve essere validato." #. module: base_tier_validation #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label msgid " Operation has been rejected." -msgstr " L'operazione è stata rifiutata." +msgstr "" +" L'operazione è stata rifiutata." #. module: base_tier_validation #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label @@ -45,11 +46,18 @@ msgstr "Nome" #. module: base_tier_validation #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form -msgid "Bypassed, if previous tier was validated by same reviewer" +msgid "Bypass, if previous tier was validated by same reviewer" msgstr "" -"Aggirato, se il livello precedente è stato validato dallo stesso " +"Aggira, se il livello precedente è stato validato dallo stesso " "revisore" +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +#, python-format +msgid "A review has been requested %s days ago." +msgstr "Una revisione è stata richiesta %s giorni fa." + #. module: base_tier_validation #. odoo-python #: code:addons/base_tier_validation/models/tier_validation.py:0 @@ -290,7 +298,7 @@ msgstr "Dominio" #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__done_by msgid "Done By" -msgstr "Eseguito Da" +msgstr "Eseguito da" #. module: base_tier_validation #. odoo-javascript @@ -375,6 +383,11 @@ msgstr "" "Se impostata, i revisori verranno avvisati con e-mail quando una revisione " "relativa a questa definizione viene riavviata." +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__is_reevaluation_required +msgid "Is Reevaluation Required" +msgstr "È richiesta la rivalutazione" + #. module: base_tier_validation #: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action msgid "It's fully validated" @@ -393,6 +406,11 @@ msgstr "È nel processo di validazione" msgid "Last Modified on" msgstr "Ultima modifica il" +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__last_reminder_date +msgid "Last Reminder Date" +msgstr "Data ultimo promemoria" + #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid @@ -412,12 +430,16 @@ msgstr "Ultimo aggiornamento il" #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_id -#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_name #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search msgid "Model" msgstr "Modello" +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_name +msgid "Model Name" +msgstr "Nome modello" + #. module: base_tier_validation #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form msgid "More Options" @@ -479,6 +501,15 @@ msgstr "Notifica revisori quando respinta" msgid "Notify Reviewers on Restarted" msgstr "Notifica revisori al riavvio" +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "" +"Number of days after which a message must be posted to remind about pending " +"validation (0 = no reminder)" +msgstr "" +"Numero di giorni dopo i quali un messaggio deve essere inviato per ricordare " +"della valutazione in attesa (0 = nessun promemoria)" + #. module: base_tier_validation #: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action msgid "" @@ -524,6 +555,11 @@ msgstr "" msgid "Pending" msgstr "In attesa" +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Reevaluate Reviews" +msgstr "Rivalutazione revisioni" + #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model_id msgid "Referenced Model" @@ -626,11 +662,21 @@ msgstr "Revisori" msgid "Reviews" msgstr "Revisioni" +#. module: base_tier_validation +#: model:ir.actions.server,name:base_tier_validation.ir_cron_auto_tier_validation_ir_actions_server +#: model:ir.cron,cron_name:base_tier_validation.ir_cron_auto_tier_validation +msgid "Send Tier Review Reminder" +msgstr "Invia promemoria revisione livello" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "Send reminder message on pending reviews" +msgstr "Invia messaggio promemoria per le revisioni in attesa" + #. module: base_tier_validation #. odoo-javascript #: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__sequence -#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence #, python-format msgid "Sequence" msgstr "Sequenza" @@ -680,6 +726,11 @@ msgstr "" "Questa azione richiede di essere approvata per almeno un record.\n" "Prego richiedere un'approvazione." +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence +msgid "Tier" +msgstr "Livello" + #. module: base_tier_validation #: model:ir.actions.act_window,name:base_tier_validation.tier_definition_action #: model:ir.model,name:base_tier_validation.model_tier_definition @@ -735,6 +786,12 @@ msgstr "Eccezioni validazione livello" msgid "Tier Validation Rejected Notification" msgstr "Notifica rifiuto livello approvazione" +#. module: base_tier_validation +#: model:mail.activity.type,name:base_tier_validation.mail_act_tier_validation_reminder +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_reminder +msgid "Tier Validation Reminder" +msgstr "Promemoria valutazione livello" + #. module: base_tier_validation #: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested msgid "Tier Validation Requested" @@ -896,6 +953,12 @@ msgstr "" msgid "e.g. Tier Validation for..." msgstr "es. Validazione livello per ..." +#~ msgid "" +#~ "Bypassed, if previous tier was validated by same reviewer" +#~ msgstr "" +#~ "Aggirato, se il livello precedente è stato validato dallo stesso " +#~ "revisore" + #~ msgid "" #~ "\n" #~ " This Record needs to be\n" diff --git a/base_tier_validation/i18n/nl_NL.po b/base_tier_validation/i18n/nl_NL.po index f4022116..7c251e25 100644 --- a/base_tier_validation/i18n/nl_NL.po +++ b/base_tier_validation/i18n/nl_NL.po @@ -45,10 +45,15 @@ msgstr "Naam" #. module: base_tier_validation #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form -msgid "Bypassed, if previous tier was validated by same reviewer" +msgid "Bypass, if previous tier was validated by same reviewer" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +#, python-format +msgid "A review has been requested %s days ago." msgstr "" -"Overslaan, als het vorige niveau door dezelfde beoordelaar is " -"gevalideerd" #. module: base_tier_validation #. odoo-python @@ -368,6 +373,11 @@ msgid "" "definition are restarted." msgstr "" +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__is_reevaluation_required +msgid "Is Reevaluation Required" +msgstr "" + #. module: base_tier_validation #: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action msgid "It's fully validated" @@ -386,6 +396,11 @@ msgstr "" msgid "Last Modified on" msgstr "Laatst gewijzigd op" +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__last_reminder_date +msgid "Last Reminder Date" +msgstr "" + #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid @@ -405,12 +420,16 @@ msgstr "Laatst bijgewerkt op" #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_id -#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_name #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search msgid "Model" msgstr "Model" +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_name +msgid "Model Name" +msgstr "" + #. module: base_tier_validation #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form msgid "More Options" @@ -472,6 +491,13 @@ msgstr "" msgid "Notify Reviewers on Restarted" msgstr "" +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "" +"Number of days after which a message must be posted to remind about pending " +"validation (0 = no reminder)" +msgstr "" + #. module: base_tier_validation #: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action msgid "" @@ -515,6 +541,11 @@ msgstr "" msgid "Pending" msgstr "In afwachting" +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Reevaluate Reviews" +msgstr "" + #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model_id msgid "Referenced Model" @@ -617,11 +648,21 @@ msgstr "Beoordelaars" msgid "Reviews" msgstr "Beoordelingen" +#. module: base_tier_validation +#: model:ir.actions.server,name:base_tier_validation.ir_cron_auto_tier_validation_ir_actions_server +#: model:ir.cron,cron_name:base_tier_validation.ir_cron_auto_tier_validation +msgid "Send Tier Review Reminder" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "Send reminder message on pending reviews" +msgstr "" + #. module: base_tier_validation #. odoo-javascript #: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__sequence -#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence #, python-format msgid "Sequence" msgstr "Volgorde" @@ -671,6 +712,11 @@ msgstr "" "Deze actie moet voor ten minste één record gevalideerd worden.\n" "Vraag een validatie aan." +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence +msgid "Tier" +msgstr "Tier" + #. module: base_tier_validation #: model:ir.actions.act_window,name:base_tier_validation.tier_definition_action #: model:ir.model,name:base_tier_validation.model_tier_definition @@ -728,6 +774,12 @@ msgstr "" msgid "Tier Validation Rejected Notification" msgstr "Tier-validatie (abstract)" +#. module: base_tier_validation +#: model:mail.activity.type,name:base_tier_validation.mail_act_tier_validation_reminder +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_reminder +msgid "Tier Validation Reminder" +msgstr "" + #. module: base_tier_validation #: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested msgid "Tier Validation Requested" @@ -879,6 +931,12 @@ msgstr "" msgid "e.g. Tier Validation for..." msgstr "bijv. Tier validatie voor..." +#~ msgid "" +#~ "Bypassed, if previous tier was validated by same reviewer" +#~ msgstr "" +#~ "Overslaan, als het vorige niveau door dezelfde beoordelaar is " +#~ "gevalideerd" + #~ msgid "" #~ "\n" #~ " This Record needs to be\n" @@ -914,9 +972,6 @@ msgstr "bijv. Tier validatie voor..." #~ msgid "The operation is under validation." #~ msgstr "De bewerking is onder validatie." -#~ msgid "Tier" -#~ msgstr "Tier" - #, fuzzy, python-format #~ msgid "Activities" #~ msgstr "Actief" diff --git a/base_tier_validation/i18n/sv.po b/base_tier_validation/i18n/sv.po index 22624014..4533f377 100644 --- a/base_tier_validation/i18n/sv.po +++ b/base_tier_validation/i18n/sv.po @@ -45,9 +45,15 @@ msgstr "Namn" #. module: base_tier_validation #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form -msgid "Bypassed, if previous tier was validated by same reviewer" +msgid "Bypass, if previous tier was validated by same reviewer" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +#, python-format +msgid "A review has been requested %s days ago." msgstr "" -"Förbigås om föregående nivå validerades av samma granskare" #. module: base_tier_validation #. odoo-python @@ -366,6 +372,11 @@ msgid "" "definition are restarted." msgstr "" +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__is_reevaluation_required +msgid "Is Reevaluation Required" +msgstr "" + #. module: base_tier_validation #: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action msgid "It's fully validated" @@ -384,6 +395,11 @@ msgstr "" msgid "Last Modified on" msgstr "Senast ändrad den" +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__last_reminder_date +msgid "Last Reminder Date" +msgstr "" + #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid @@ -403,12 +419,16 @@ msgstr "Senast uppdaterad den" #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_id -#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_name #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search msgid "Model" msgstr "Modell" +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_name +msgid "Model Name" +msgstr "" + #. module: base_tier_validation #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form msgid "More Options" @@ -470,6 +490,13 @@ msgstr "" msgid "Notify Reviewers on Restarted" msgstr "" +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "" +"Number of days after which a message must be posted to remind about pending " +"validation (0 = no reminder)" +msgstr "" + #. module: base_tier_validation #: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action msgid "" @@ -514,6 +541,11 @@ msgstr "" msgid "Pending" msgstr "Väntande" +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Reevaluate Reviews" +msgstr "" + #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model_id msgid "Referenced Model" @@ -616,11 +648,21 @@ msgstr "Granskare" msgid "Reviews" msgstr "Granskningar" +#. module: base_tier_validation +#: model:ir.actions.server,name:base_tier_validation.ir_cron_auto_tier_validation_ir_actions_server +#: model:ir.cron,cron_name:base_tier_validation.ir_cron_auto_tier_validation +msgid "Send Tier Review Reminder" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "Send reminder message on pending reviews" +msgstr "" + #. module: base_tier_validation #. odoo-javascript #: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__sequence -#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence #, python-format msgid "Sequence" msgstr "Sekvens" @@ -670,6 +712,11 @@ msgstr "" "Denna åtgärd måste valideras för minst en post.\n" "Vänligen begär en validering." +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence +msgid "Tier" +msgstr "" + #. module: base_tier_validation #: model:ir.actions.act_window,name:base_tier_validation.tier_definition_action #: model:ir.model,name:base_tier_validation.model_tier_definition @@ -725,6 +772,12 @@ msgstr "" msgid "Tier Validation Rejected Notification" msgstr "Meddelande vid nekad attestering" +#. module: base_tier_validation +#: model:mail.activity.type,name:base_tier_validation.mail_act_tier_validation_reminder +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_reminder +msgid "Tier Validation Reminder" +msgstr "" + #. module: base_tier_validation #: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested msgid "Tier Validation Requested" @@ -876,6 +929,11 @@ msgstr "" msgid "e.g. Tier Validation for..." msgstr "t.ex. attest för..." +#~ msgid "" +#~ "Bypassed, if previous tier was validated by same reviewer" +#~ msgstr "" +#~ "Förbigås om föregående nivå validerades av samma granskare" + #~ msgid "" #~ "\n" #~ " This Record needs to be\n" diff --git a/base_tier_validation/i18n/tr.po b/base_tier_validation/i18n/tr.po index 2b629f45..2161ac77 100644 --- a/base_tier_validation/i18n/tr.po +++ b/base_tier_validation/i18n/tr.po @@ -6,15 +6,15 @@ msgid "" msgstr "" "Project-Id-Version: Odoo Server 16.0\n" "Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: 2023-02-08 06:14+0000\n" -"Last-Translator: Ediz Duman \n" +"PO-Revision-Date: 2025-06-21 10:25+0000\n" +"Last-Translator: Ahmet Yiğit Budak \n" "Language-Team: none\n" "Language: tr\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 4.14.1\n" +"X-Generator: Weblate 5.10.4\n" #. module: base_tier_validation #. odoo-javascript @@ -26,17 +26,17 @@ msgstr "0 Bekleyen" #. module: base_tier_validation #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label msgid " This Record needs to be validated." -msgstr "" +msgstr " Bu Kaydın doğrulanması gerekiyor." #. module: base_tier_validation #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label msgid " Operation has been rejected." -msgstr "" +msgstr " İşlem reddedildi." #. module: base_tier_validation #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label msgid " Operation has been validated!" -msgstr "" +msgstr " İşlem doğrulandı!" #. module: base_tier_validation #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form @@ -45,8 +45,16 @@ msgstr "Adı" #. module: base_tier_validation #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form -msgid "Bypassed, if previous tier was validated by same reviewer" +msgid "Bypass, if previous tier was validated by same reviewer" msgstr "" +"Önceki katman aynı incelemeci tarafından doğrulandıysa atlayın" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +#, python-format +msgid "A review has been requested %s days ago." +msgstr "%s gün önce bir inceleme istendi." #. module: base_tier_validation #. odoo-python @@ -110,7 +118,7 @@ msgstr "Bütün" #. module: base_tier_validation #: model:ir.model.fields,help:base_tier_validation.field_tier_validation_exception__group_ids msgid "Allowed groups to use this Tier Validation Exception" -msgstr "" +msgstr "Grupların bu Katman Doğrulama İstisnasını kullanmasına izin verildi" #. module: base_tier_validation #: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__group @@ -132,7 +140,7 @@ msgstr "Belirtilen sıra numarasına göre onay sırası" #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__approve_sequence_bypass #: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__approve_sequence_bypass msgid "Approve Sequence Bypass" -msgstr "" +msgstr "Dizi Atlamasını Onayla" #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__approve_sequence @@ -148,7 +156,7 @@ msgstr "Onaylı" #. module: base_tier_validation #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form msgid "Archived" -msgstr "" +msgstr "Arşivlenmiş" #. module: base_tier_validation #. odoo-python @@ -158,6 +166,8 @@ msgid "" "At least one of these fields must be checked! Write under Validation, Write " "after Validation" msgstr "" +"Bu alanlardan en az birinin işaretlenmesi gerekmektedir! Doğrulama Altında " +"Yaz, Doğrulama Sonrası Yaz" #. module: base_tier_validation #: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence_bypass @@ -165,6 +175,8 @@ msgstr "" msgid "" "Bypassed (auto validated), if previous tier was validated by same reviewer" msgstr "" +"Önceki aşama aynı inceleyici tarafından doğrulandıysa atlandı (otomatik " +"olarak doğrulandı)" #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__can_review @@ -225,7 +237,7 @@ msgstr "Yapılandırma Ayarları" #. module: base_tier_validation #: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action msgid "Create a new Validation Exception!" -msgstr "" +msgstr "Yeni bir Doğrulama İstisnası oluştur!" #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__create_uid @@ -252,7 +264,7 @@ msgstr "Tanım" #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_domain msgid "Definition Domain" -msgstr "Tanım Etki Alanı" +msgstr "Tanım Domaini" #. module: base_tier_validation #. odoo-javascript @@ -274,24 +286,24 @@ msgstr "Görünüm Adı" #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_status msgid "Display Status" -msgstr "" +msgstr "Durumu Göster" #. module: base_tier_validation #: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__definition_type__domain msgid "Domain" -msgstr "Etki Alanı" +msgstr "" #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__done_by msgid "Done By" -msgstr "" +msgstr "Tamamlayan" #. module: base_tier_validation #. odoo-javascript #: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 #, python-format msgid "Done by" -msgstr "" +msgstr "Tamamlayan" #. module: base_tier_validation #: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__field @@ -301,7 +313,7 @@ msgstr "İlgili kayıttaki alan" #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__field_ids msgid "Fields" -msgstr "" +msgstr "Alanlar" #. module: base_tier_validation #. odoo-python @@ -318,7 +330,7 @@ msgstr "Grupla" #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__group_ids msgid "Groups" -msgstr "" +msgstr "Gruplar" #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__has_comment @@ -348,6 +360,8 @@ msgid "" "If set, reviewers will be notified by email when a review related to this " "definition is accepted." msgstr "" +"Ayarlanırsa, bu tanımla ilgili bir inceleme kabul edildiğinde gözden " +"geçirenler e-postayla bilgilendirilecektir." #. module: base_tier_validation #: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_rejected @@ -355,6 +369,8 @@ msgid "" "If set, reviewers will be notified by email when a review related to this " "definition is rejected." msgstr "" +"Ayarlanırsa, bu tanımla ilgili bir inceleme reddedildiğinde inceleyenler e-" +"postayla bilgilendirilecektir." #. module: base_tier_validation #: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_restarted @@ -362,16 +378,23 @@ msgid "" "If set, reviewers will be notified by email when a reviews related to this " "definition are restarted." msgstr "" +"Ayarlanırsa, bu tanımla ilgili bir inceleme yeniden başlatıldığında " +"inceleyenler e-postayla bilgilendirilecektir." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__is_reevaluation_required +msgid "Is Reevaluation Required" +msgstr "Yeniden Doğrulama Gerekli Mi" #. module: base_tier_validation #: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action msgid "It's fully validated" -msgstr "" +msgstr "Tamamen Doğrulandı" #. module: base_tier_validation #: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action msgid "It's in the validation process" -msgstr "" +msgstr "Doğrulama Aşamasında" #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard____last_update @@ -381,6 +404,11 @@ msgstr "" msgid "Last Modified on" msgstr "Son Düzenleme" +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__last_reminder_date +msgid "Last Reminder Date" +msgstr "Son Bilgilendirme Tarihi" + #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid @@ -400,12 +428,16 @@ msgstr "Son Güncelleme" #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_id -#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_name #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search msgid "Model" msgstr "Modeli" +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_name +msgid "Model Name" +msgstr "Model İsmi" + #. module: base_tier_validation #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form msgid "More Options" @@ -414,7 +446,7 @@ msgstr "Daha Fazla Seçenek" #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__name msgid "Name" -msgstr "" +msgstr "İsim" #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__need_validation @@ -450,7 +482,7 @@ msgstr "Yapacak inceleme yok." #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_accepted msgid "Notify Reviewers on Accepted" -msgstr "" +msgstr "Onaylandığında İnceleyenlere Bildir" #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_create @@ -460,12 +492,21 @@ msgstr "İncelemeleri Oluşturma Hakkında Bilgilendir" #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_rejected msgid "Notify Reviewers on Rejected" -msgstr "" +msgstr "Reddedildiğinde İnceleyenlere Bildir" #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_restarted msgid "Notify Reviewers on Restarted" +msgstr "Yeniden Başlatıldığında İnceleyenlere Bildir" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "" +"Number of days after which a message must be posted to remind about pending " +"validation (0 = no reminder)" msgstr "" +"Bekleyen doğrulamayı hatırlatmak için bir mesajın gönderilmesi gereken gün " +"sayısı (0 = hatırlatma yok)" #. module: base_tier_validation #: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action @@ -473,6 +514,8 @@ msgid "" "Once created, you can decide which fields you want to be editable when the " "record:" msgstr "" +"Oluşturulduktan sonra, kayıt sırasında hangi alanların düzenlenebilir " +"olmasını istediğinize karar verebilirsiniz:" #. module: base_tier_validation #. odoo-python @@ -492,11 +535,14 @@ msgstr "İşlem doğrulandı!" #: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget msgid "Option to forward a tier validation to other reviewer, and backward" msgstr "" +"Bir aşama doğrulamasını diğer incelemeciye ve geriye doğru iletme seçeneği" #. module: base_tier_validation #: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget msgid "Option to use python formula to get reviewers and find documents" msgstr "" +"Gözden geçirenleri almak ve belgeleri bulmak için python formülünü kullanma " +"seçeneği" #. module: base_tier_validation #. odoo-javascript @@ -507,6 +553,11 @@ msgstr "" msgid "Pending" msgstr "Bekleyen" +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Reevaluate Reviews" +msgstr "İncelemeleri Yeniden Değerlendir" + #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model_id msgid "Referenced Model" @@ -559,7 +610,7 @@ msgstr "İsteyen" #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_id msgid "Res" -msgstr "" +msgstr "Temsilci" #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_model @@ -609,11 +660,21 @@ msgstr "İnceleyenler" msgid "Reviews" msgstr "İncelemeler" +#. module: base_tier_validation +#: model:ir.actions.server,name:base_tier_validation.ir_cron_auto_tier_validation_ir_actions_server +#: model:ir.cron,cron_name:base_tier_validation.ir_cron_auto_tier_validation +msgid "Send Tier Review Reminder" +msgstr "Katman İnceleme Hatırlatıcısı Gönder" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "Send reminder message on pending reviews" +msgstr "Bekleyen incelemelerle ilgili hatırlatma mesajı gönder" + #. module: base_tier_validation #. odoo-javascript #: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__sequence -#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence #, python-format msgid "Sequence" msgstr "Sıra" @@ -663,6 +724,11 @@ msgstr "" "Bu eylemin en az bir kayıt için doğrulanması gerekir.\n" "Lütfen doğrulama isteğinde bulunun." +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence +msgid "Tier" +msgstr "Seviye" + #. module: base_tier_validation #: model:ir.actions.act_window,name:base_tier_validation.tier_definition_action #: model:ir.model,name:base_tier_validation.model_tier_definition @@ -674,12 +740,12 @@ msgstr "Seviye Tanımı" #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_formula msgid "Tier Formula" -msgstr "" +msgstr "Katman Formülü" #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_forward msgid "Tier Forward & Backward" -msgstr "" +msgstr "Katman İleri & Geri" #. module: base_tier_validation #: model:ir.model,name:base_tier_validation.model_tier_review @@ -689,7 +755,7 @@ msgstr "Seviye İncelemesi" #. module: base_tier_validation #: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget msgid "Tier Validation" -msgstr "" +msgstr "Katman Doğrulama" #. module: base_tier_validation #: model:ir.model,name:base_tier_validation.model_tier_validation @@ -706,18 +772,24 @@ msgstr "Seviye Doğrulama Kabul Bildirimi" #: model:ir.ui.menu,name:base_tier_validation.menu_tier_validation_exception #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_form msgid "Tier Validation Exception" -msgstr "" +msgstr "Katman Doğrulama İstisnası" #. module: base_tier_validation #: model:ir.model,name:base_tier_validation.model_tier_validation_exception msgid "Tier Validation Exceptions" -msgstr "" +msgstr "Katman Doğrulama İstisnaları" #. module: base_tier_validation #: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_rejected msgid "Tier Validation Rejected Notification" msgstr "Seviye Doğrulaması Reddedildi Bildirimi" +#. module: base_tier_validation +#: model:mail.activity.type,name:base_tier_validation.mail_act_tier_validation_reminder +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_reminder +msgid "Tier Validation Reminder" +msgstr "Katman Doğrulama Hatırlatıcısı" + #. module: base_tier_validation #: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested msgid "Tier Validation Requested" @@ -741,14 +813,14 @@ msgstr "Mesajı Doğrulamak İçin" #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__todo_by msgid "Todo By" -msgstr "" +msgstr "Yapılacak" #. module: base_tier_validation #. odoo-javascript #: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 #, python-format msgid "Todo by" -msgstr "" +msgstr "Yapılacak" #. module: base_tier_validation #: model:ir.model,name:base_tier_validation.model_res_users @@ -758,7 +830,7 @@ msgstr "Kullanıcı" #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__valid_model_field_ids msgid "Valid Model Field" -msgstr "" +msgstr "Geçerli Model Alanı" #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__valid_reviewer_field_ids @@ -808,7 +880,7 @@ msgstr "Doğrulama Format Tarihi" #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validation_status msgid "Validation Status" -msgstr "" +msgstr "Doğrulama Durumu" #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__review_ids @@ -818,27 +890,27 @@ msgstr "Doğrulamalar" #. module: base_tier_validation #: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__no msgid "Without validation" -msgstr "" +msgstr "Doğrulama olmadan" #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_after_validation msgid "Write after Validation" -msgstr "" +msgstr "Doğrulamadan sonra Yaz" #. module: base_tier_validation #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search msgid "Write after validation" -msgstr "" +msgstr "Doğrulamadan sonra yaz" #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_under_validation msgid "Write under Validation" -msgstr "" +msgstr "Doğrulama esnasında Yaz" #. module: base_tier_validation #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search msgid "Write under validation" -msgstr "" +msgstr "Doğrulama esnasında yaz" #. module: base_tier_validation #. odoo-python @@ -851,6 +923,11 @@ msgid "" "Only those fields can be modified:\n" "- %(allowed_fields)s" msgstr "" +"Doğrulamadan sonra bu alanları yazmanıza izin verilmez.\n" +"- %(not_allowed_fields)s\n" +"\n" +"Yalnızca bu alanlar değiştirilebilir:\n" +"- %(allowed_fields)s" #. module: base_tier_validation #. odoo-python @@ -863,6 +940,11 @@ msgid "" "Only those fields can be modified:\n" "- %(allowed_fields)s" msgstr "" +"Doğrulama esnasındai bu alanları yazmanıza izin verilmiyor.\n" +"- %(not_allowed_fields)s\n" +"\n" +"Yalnızca bu alanlar değiştirilebilir:\n" +"- %(allowed_fields)s" #. module: base_tier_validation #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form @@ -903,6 +985,3 @@ msgstr "ör. Şunun için Seviye Doğrulaması..." #, python-format #~ msgid "The operation is under validation." #~ msgstr "İşlem doğrulama aşamasındadır." - -#~ msgid "Tier" -#~ msgstr "Seviye" diff --git a/base_tier_validation/i18n/zh_CN.po b/base_tier_validation/i18n/zh_CN.po index 8c6c2eca..be7893ea 100644 --- a/base_tier_validation/i18n/zh_CN.po +++ b/base_tier_validation/i18n/zh_CN.po @@ -45,7 +45,14 @@ msgstr "名称" #. module: base_tier_validation #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form -msgid "Bypassed, if previous tier was validated by same reviewer" +msgid "Bypass, if previous tier was validated by same reviewer" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +#, python-format +msgid "A review has been requested %s days ago." msgstr "" #. module: base_tier_validation @@ -359,6 +366,11 @@ msgid "" "definition are restarted." msgstr "" +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__is_reevaluation_required +msgid "Is Reevaluation Required" +msgstr "" + #. module: base_tier_validation #: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action msgid "It's fully validated" @@ -377,6 +389,11 @@ msgstr "" msgid "Last Modified on" msgstr "最近修改时间" +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__last_reminder_date +msgid "Last Reminder Date" +msgstr "" + #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid @@ -396,12 +413,16 @@ msgstr "最近更新时间" #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model #: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_id -#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_name #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search msgid "Model" msgstr "模型" +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__model_name +msgid "Model Name" +msgstr "" + #. module: base_tier_validation #: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form msgid "More Options" @@ -463,6 +484,13 @@ msgstr "" msgid "Notify Reviewers on Restarted" msgstr "" +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "" +"Number of days after which a message must be posted to remind about pending " +"validation (0 = no reminder)" +msgstr "" + #. module: base_tier_validation #: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action msgid "" @@ -503,6 +531,11 @@ msgstr "" msgid "Pending" msgstr "待审批" +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Reevaluate Reviews" +msgstr "" + #. module: base_tier_validation #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model_id msgid "Referenced Model" @@ -605,11 +638,21 @@ msgstr "审批者" msgid "Reviews" msgstr "审批" +#. module: base_tier_validation +#: model:ir.actions.server,name:base_tier_validation.ir_cron_auto_tier_validation_ir_actions_server +#: model:ir.cron,cron_name:base_tier_validation.ir_cron_auto_tier_validation +msgid "Send Tier Review Reminder" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "Send reminder message on pending reviews" +msgstr "" + #. module: base_tier_validation #. odoo-javascript #: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 #: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__sequence -#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence #, python-format msgid "Sequence" msgstr "序号" @@ -659,6 +702,11 @@ msgstr "" "此操作需要至少对一条记录进行审批。\n" "请发起审批申请。" +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence +msgid "Tier" +msgstr "层级" + #. module: base_tier_validation #: model:ir.actions.act_window,name:base_tier_validation.tier_definition_action #: model:ir.model,name:base_tier_validation.model_tier_definition @@ -716,6 +764,12 @@ msgstr "" msgid "Tier Validation Rejected Notification" msgstr "多层级审批(抽象)" +#. module: base_tier_validation +#: model:mail.activity.type,name:base_tier_validation.mail_act_tier_validation_reminder +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_reminder +msgid "Tier Validation Reminder" +msgstr "" + #. module: base_tier_validation #: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested msgid "Tier Validation Requested" @@ -871,9 +925,6 @@ msgstr "例如:审批层级用于..." #~ msgid "The operation is under validation." #~ msgstr "该操作正在审批中。" -#~ msgid "Tier" -#~ msgstr "层级" - #, python-format #~ msgid "Activities" #~ msgstr "活动项目" diff --git a/base_tier_validation/migrations/16.0.3.1.0/pre-migration.py b/base_tier_validation/migrations/16.0.3.1.0/pre-migration.py new file mode 100644 index 00000000..ecb5aa9e --- /dev/null +++ b/base_tier_validation/migrations/16.0.3.1.0/pre-migration.py @@ -0,0 +1,122 @@ +# Copyright 2025 Tecnativa - Víctor Martínez +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from openupgradelib import openupgrade + + +@openupgrade.migrate() +def migrate(env, version): + env.cr.execute( + """ + SELECT imf.model + FROM ir_model_fields AS imf + WHERE imf.name = 'review_ids' + AND imf.ttype = 'one2many' + AND imf.model != 'tier.validation' + """ + ) + for (model_name,) in env.cr.fetchall(): + table_name = model_name.replace(".", "_") + # validated column + if not openupgrade.column_exists(env.cr, table_name, "validated"): + openupgrade.logged_query( + env.cr, + f""" + ALTER TABLE {table_name} + ADD COLUMN IF NOT EXISTS validated BOOLEAN + """, + ) + # Define all those with reviews as validated and then define + # as not validated those with unapproved reviews. + openupgrade.logged_query( + env.cr, + f""" + UPDATE {table_name} SET validated = true WHERE id IN ( + SELECT DISTINCT(tr.res_id) + FROM tier_review AS tr + WHERE tr.model = '{model_name}' + ) + """, + ) + openupgrade.logged_query( + env.cr, + f""" + UPDATE {table_name} SET validated = false WHERE id IN ( + SELECT DISTINCT(tr.res_id) + FROM tier_review AS tr + WHERE tr.model = '{model_name}' + AND tr.status not in ('approved', 'forwarded') + ) + """, + ) + # rejected column + if not openupgrade.column_exists(env.cr, table_name, "rejected"): + openupgrade.logged_query( + env.cr, + f""" + ALTER TABLE {table_name} + ADD COLUMN IF NOT EXISTS rejected BOOLEAN + """, + ) + # Define rejected if any review is rejected + openupgrade.logged_query( + env.cr, + f""" + UPDATE {table_name} SET rejected = true WHERE id IN ( + SELECT DISTINCT(tr.res_id) + FROM tier_review AS tr + WHERE tr.model = '{model_name}' AND tr.status = 'rejected' + ) + """, + ) + # validation_status column + if not openupgrade.column_exists(env.cr, table_name, "validation_status"): + openupgrade.logged_query( + env.cr, + f""" + ALTER TABLE {table_name} + ADD COLUMN IF NOT EXISTS validation_status VARCHAR + """, + ) + openupgrade.logged_query( + env.cr, + f""" + UPDATE {table_name} SET validation_status = 'no' + """, + ) + openupgrade.logged_query( + env.cr, + f""" + UPDATE {table_name} SET validation_status = 'validated' + WHERE validated = true AND coalesce(rejected, false) = false + """, + ) + openupgrade.logged_query( + env.cr, + f""" + UPDATE {table_name} SET validation_status = 'rejected' + WHERE validated = false AND rejected = true; + """, + ) + openupgrade.logged_query( + env.cr, + f""" + UPDATE {table_name} SET validation_status = 'pending' + WHERE validation_status = 'no' AND id IN ( + SELECT DISTINCT(tr.res_id) + FROM tier_review AS tr + WHERE tr.model = '{model_name}' AND tr.status = 'pending' + ) + """, + ) + openupgrade.logged_query( + env.cr, + f""" + UPDATE {table_name} SET validation_status = 'waiting' + WHERE validation_status = 'no' AND id IN ( + SELECT DISTINCT(tr.res_id) + FROM tier_review AS tr + WHERE tr.model = '{model_name}' AND tr.status = 'waiting' + ) + """, + ) diff --git a/base_tier_validation/models/res_users.py b/base_tier_validation/models/res_users.py index 67c77293..ccf0e7e7 100644 --- a/base_tier_validation/models/res_users.py +++ b/base_tier_validation/models/res_users.py @@ -26,7 +26,9 @@ def review_user_count(self): self.env[model] .with_user(self.env.user) .search([("id", "in", reviews.mapped("res_id"))]) - .filtered(lambda x: not x.rejected and x.can_review) + .filtered( + lambda x: x.validation_status != "rejected" and x.can_review + ) ) # Excludes any cancelled records depending on the structure of the model if self.env[model]._state_field in self.env[model]._fields: diff --git a/base_tier_validation/models/tier_definition.py b/base_tier_validation/models/tier_definition.py index 5aa88c32..97132828 100644 --- a/base_tier_validation/models/tier_definition.py +++ b/base_tier_validation/models/tier_definition.py @@ -83,6 +83,11 @@ def _get_tier_validation_model_names(self): "to this definition are restarted.", ) has_comment = fields.Boolean(string="Comment", default=False) + notify_reminder_delay = fields.Integer( + string="Send reminder message on pending reviews", + help="Number of days after which a message must be posted to remind about " + "pending validation (0 = no reminder)", + ) approve_sequence = fields.Boolean( string="Approve by sequence", default=False, @@ -105,3 +110,33 @@ def _compute_domain_reviewer_field(self): .sudo() .search([("model", "=", rec.model), ("relation", "=", "res.users")]) ) + + def _get_review_needing_reminder(self): + """Return all the reviews that have the reminder setup.""" + self.ensure_one() + if not self.notify_reminder_delay: + return self.env["tier.review"] + review_date = fields.Datetime.subtract( + fields.Datetime.now(), days=self.notify_reminder_delay + ) + return self.env["tier.review"].search( + [ + ("definition_id", "=", self.id), + ("status", "=", "pending"), + "|", + "&", + ("create_date", "<", review_date), + ("last_reminder_date", "=", False), + ("last_reminder_date", "<", review_date), + ], + limit=1, + ) + + def _cron_send_review_reminder(self): + definition_with_reminder = self.env["tier.definition"].search( + [("notify_reminder_delay", ">", 0)] + ) + for record in definition_with_reminder: + review_to_remind = record._get_review_needing_reminder() + if review_to_remind: + review_to_remind._send_review_reminder() diff --git a/base_tier_validation/models/tier_review.py b/base_tier_validation/models/tier_review.py index 8d388826..749f40e1 100644 --- a/base_tier_validation/models/tier_review.py +++ b/base_tier_validation/models/tier_review.py @@ -1,11 +1,15 @@ # Copyright 2017-19 ForgeFlow S.L. (https://www.forgeflow.com) # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +import logging + import pytz from odoo import _, api, fields, models from odoo.exceptions import ValidationError +_logger = logging.getLogger(__name__) + class TierReview(models.Model): _name = "tier.review" @@ -21,7 +25,11 @@ class TierReview(models.Model): default="pending", ) model = fields.Char(string="Related Document Model", index=True) - res_id = fields.Integer(string="Related Document ID", index=True) + res_id = fields.Many2oneReference( + string="Related Document ID", + index=True, + model_field="model", + ) definition_id = fields.Many2one(comodel_name="tier.definition") company_id = fields.Many2one( related="definition_id.company_id", @@ -64,6 +72,7 @@ class TierReview(models.Model): approve_sequence_bypass = fields.Boolean( related="definition_id.approve_sequence_bypass", readonly=True ) + last_reminder_date = fields.Datetime(readonly=True) @api.depends("status") def _compute_display_status(self): @@ -138,3 +147,38 @@ def _get_reviewers(self): if not reviewer_field or not reviewer_field._name == "res.users": raise ValidationError(_("There are no res.users in the selected field")) return reviewer_field + + def _get_reminder_notification_subtype(self): + return "base_tier_validation.mt_tier_validation_reminder" + + def _get_reminder_activity_type(self): + return "base_tier_validation.mail_act_tier_validation_reminder" + + def _notify_review_reminder_body(self): + delay = (fields.Datetime.now() - self.create_date).days + return _("A review has been requested %s days ago.") % (delay) + + def _send_review_reminder(self): + record = self.env[self.model].browse(self.res_id) + # Only schedule activity if reviewer is a single user and model has activities + if len(self.reviewer_ids) == 1 and hasattr(record, "activity_ids"): + self._schedule_review_reminder_activity(record) + elif hasattr(record, "message_post"): + self._notify_review_reminder(record) + else: + msg = "Could not send reminder for record %s" % record + _logger.exception(msg) + self.last_reminder_date = fields.Datetime.now() + + def _notify_review_reminder(self, record): + record.message_post( + subtype_xmlid=self._get_reminder_notification_subtype(), + body=self._notify_review_reminder_body(), + ) + + def _schedule_review_reminder_activity(self, record): + record.activity_schedule( + act_type_xmlid=self._get_reminder_activity_type(), + note=self._notify_review_reminder_body(), + act_values={"user_id": self.reviewer_ids.id}, + ) diff --git a/base_tier_validation/models/tier_validation.py b/base_tier_validation/models/tier_validation.py index 5204c70f..302fd61a 100644 --- a/base_tier_validation/models/tier_validation.py +++ b/base_tier_validation/models/tier_validation.py @@ -12,7 +12,12 @@ from odoo.osv.expression import OR from odoo.tools.misc import frozendict -BASE_EXCEPTION_FIELDS = ["message_follower_ids", "access_token"] +BASE_EXCEPTION_FIELDS = [ + "message_main_attachment_id", + "message_follower_ids", + "access_token", + "need_validation", +] class TierValidation(models.AbstractModel): @@ -21,6 +26,7 @@ class TierValidation(models.AbstractModel): _tier_validation_buttons_xpath = "/form/header/button[last()]" _tier_validation_manual_config = True + _tier_validation_company_field = "company_id" _state_field = "state" _state_from = ["draft"] @@ -36,19 +42,18 @@ class TierValidation(models.AbstractModel): domain=lambda self: [("model", "=", self._name)], auto_join=True, ) - to_validate_message = fields.Html(compute="_compute_validated_rejected") - # TODO: Delete in v17 in favor of validation_status field + # TODO: Delete in v19 in favor of validation_status field validated = fields.Boolean( compute="_compute_validated_rejected", search="_search_validated" ) - validated_message = fields.Html(compute="_compute_validated_rejected") + to_validate_message = fields.Html(compute="_compute_to_validate_message") + validated_message = fields.Html(compute="_compute_validated_message") need_validation = fields.Boolean(compute="_compute_need_validation") - # TODO: Delete in v17 in favor of validation_status field + # TODO: Delete in v19 in favor of validation_status field rejected = fields.Boolean( compute="_compute_validated_rejected", search="_search_rejected" ) - rejected_message = fields.Html(compute="_compute_validated_rejected") - # Informative field (used in purchase_tier_validation), will be reliable as of v17 + rejected_message = fields.Html(compute="_compute_rejected_message") validation_status = fields.Selection( selection=[ ("no", "Without validation"), @@ -58,6 +63,7 @@ class TierValidation(models.AbstractModel): ], default="no", compute="_compute_validation_status", + store=True, ) reviewer_ids = fields.Many2many( string="Reviewers", @@ -70,6 +76,9 @@ class TierValidation(models.AbstractModel): ) has_comment = fields.Boolean(compute="_compute_has_comment") next_review = fields.Char(compute="_compute_next_review") + is_reevaluation_required = fields.Boolean( + compute="_compute_is_reevaluation_required" + ) def _compute_has_comment(self): for rec in self: @@ -94,6 +103,8 @@ def _get_sequences_to_approve(self, user): sequences.append(my_sequence) return sequences + @api.depends_context("uid") + @api.depends("review_ids.status") def _compute_can_review(self): for rec in self: rec.can_review = rec._get_sequences_to_approve(self.env.user) @@ -104,7 +115,7 @@ def _search_can_review(self, operator, value): ("review_ids.reviewer_ids", "=", self.env.user.id), ("review_ids.status", "=", "pending"), ("review_ids.can_review", "=", True), - ("rejected", "=", False), + ("validation_status", "!=", "rejected"), ] if "active" in self._fields: domain.append(("active", "in", [True, False])) @@ -118,23 +129,21 @@ def _compute_reviewer_ids(self): lambda r: r.status == "pending" ).mapped("reviewer_ids") + # TODO: delete in 19.0 migration in favor of validation_status field @api.model def _search_validated(self, operator, value): assert operator in ("=", "!="), "Invalid domain operator" assert value in (True, False), "Invalid domain value" - pos = self.search( - [(self._state_field, "in", self._state_from), ("review_ids", "!=", False)] - ).filtered(lambda r: r.validated == value) - return [("id", "in", pos.ids)] + operator_equal = (operator == "=" and value) or (operator == "!=" and not value) + return [("validation_status", operator_equal and "=" or "!=", "validated")] + # TODO: delete in 19.0 migration in favor of validation_status field @api.model def _search_rejected(self, operator, value): assert operator in ("=", "!="), "Invalid domain operator" assert value in (True, False), "Invalid domain value" - pos = self.search( - [(self._state_field, "in", self._state_from), ("review_ids", "!=", False)] - ).filtered(lambda r: r.rejected == value) - return [("id", "in", pos.ids)] + operator_equal = (operator == "=" and value) or (operator == "!=" and not value) + return [("validation_status", operator_equal and "=" or "!=", "rejected")] @api.model def _search_reviewer_ids(self, operator, value): @@ -168,33 +177,57 @@ def _get_validated_message(self): msg = """ %s""" % _( """Operation has been validated!""" ) - return self.validated and msg or "" + return self.validation_status == "validated" and msg or "" def _get_rejected_message(self): msg = """ %s""" % _( """Operation has been rejected.""" ) - return self.rejected and msg or "" + return self.validation_status == "rejected" and msg or "" + # TODO: delete in 19.0 migration in favor of validation_status field + @api.depends("validation_status") def _compute_validated_rejected(self): for rec in self: - rec.validated = self._calc_reviews_validated(rec.review_ids) + for field in ("validated", "rejected"): + rec[field] = rec.validation_status == field + + @api.depends("validation_status") + def _compute_to_validate_message(self): + for rec in self: + rec.to_validate_message = rec._get_to_validate_message() + + def _validated_states(self): + """Override for different validation policy.""" + return ["approved"] + + @api.depends("validation_status") + def _compute_validated_message(self): + for rec in self: rec.validated_message = rec._get_validated_message() - rec.rejected = self._calc_reviews_rejected(rec.review_ids) + + def _rejected_states(self): + """Override for different rejected policy.""" + return ["rejected"] + + @api.depends("validation_status") + def _compute_rejected_message(self): + for rec in self: rec.rejected_message = rec._get_rejected_message() - rec.to_validate_message = rec._get_to_validate_message() + @api.depends("review_ids", "review_ids.status") def _compute_validation_status(self): + validated_states = self._validated_states() + rejected_states = self._rejected_states() for item in self: - if item.validated and not item.rejected: + reviews = item.review_ids + any_rejected = any(reviews.filtered(lambda x: x.status in rejected_states)) + any_pending = any(reviews.filtered(lambda x: x.status == "pending")) + if reviews and all(x.status in validated_states for x in reviews): item.validation_status = "validated" - elif not item.validated and item.rejected: + elif any_rejected: item.validation_status = "rejected" - elif ( - not item.validated - and not item.rejected - and any(item.review_ids.filtered(lambda x: x.status == "pending")) - ): + elif any_pending: item.validation_status = "pending" else: item.validation_status = "no" @@ -206,17 +239,26 @@ def _compute_next_review(self): )[:1] rec.next_review = review and _("Next: %s") % review.name or "" - @api.model - def _calc_reviews_validated(self, reviews): - """Override for different validation policy.""" - if not reviews: - return False - return not any([s != "approved" for s in reviews.mapped("status")]) - - @api.model - def _calc_reviews_rejected(self, reviews): - """Override for different rejection policy.""" - return any([s == "rejected" for s in reviews.mapped("status")]) + def _compute_is_reevaluation_required(self): + for rec in self: + if isinstance(rec.id, models.NewId): + rec.is_reevaluation_required = False + continue + tiers = ( + self.env["tier.definition"] + .with_context(active_test=True) + .search( + [ + ("model", "=", self._name), + ("company_id", "in", [False] + rec._get_company().ids), + ] + ) + ) + rec.is_reevaluation_required = False + valid_tiers = tiers.filtered(lambda x: rec.evaluate_tier(x)) + if valid_tiers and rec.review_ids.definition_id: + if len(valid_tiers) != len(rec.review_ids.definition_id): + rec.is_reevaluation_required = True def _compute_need_validation(self): for rec in self: @@ -229,14 +271,16 @@ def _compute_need_validation(self): .search( [ ("model", "=", self._name), - ("company_id", "in", [False] + self.env.company.ids), + ("company_id", "in", [False] + rec._get_company().ids), ] ) ) - valid_tiers = any([rec.evaluate_tier(tier) for tier in tiers]) - rec.need_validation = ( - not rec.review_ids and valid_tiers and rec._check_state_from_condition() - ) + valid_tiers = tiers.filtered(lambda x: rec.evaluate_tier(x)) + requested_tiers = rec.review_ids.filtered( + lambda x: x.status != "pending" + ).mapped("definition_id") + new_tiers = valid_tiers - requested_tiers + rec.need_validation = new_tiers and rec._check_state_from_condition() def evaluate_tier(self, tier): if tier.definition_domain: @@ -254,7 +298,7 @@ def _get_validation_exceptions(self, extra_domain=None, add_base_exceptions=True .search( [ ("model_name", "=", self._name), - ("company_id", "in", [False] + self.env.company.ids), + ("company_id", "in", [False] + self._get_company().ids), "|", ("group_ids", "in", self.env.user.groups_id.ids), ("group_ids", "=", False), @@ -332,14 +376,14 @@ def write(self, vals): # try to validate operation reviews = rec.request_validation() rec._validate_tier(reviews) - if not self._calc_reviews_validated(reviews): + if rec.validation_status != "validated": raise ValidationError( _( "This action needs to be validated for at least " "one record. \nPlease request a validation." ) ) - if rec.review_ids and not rec.validated: + if rec.review_ids and rec.validation_status != "validated": raise ValidationError( _( "A validation process is still open for at least " @@ -447,13 +491,29 @@ def _validate_tier(self, tiers=False): reviews_to_notify = user_reviews.filtered( lambda r: r.definition_id.notify_on_accepted ) + # We need to notify all pending users if there is approve sequence + if tier_reviews and any(review.approve_sequence for review in tier_reviews): + reviews_to_notify = self.review_ids.filtered( + lambda r: r.status == "pending" and r.definition_id.notify_on_accepted + ) + # If there are approve sequence, only the following should be + # considered to notify + if reviews_to_notify and any( + review.approve_sequence for review in reviews_to_notify + ): + reviews_to_notify = reviews_to_notify.filtered( + lambda x: x.approve_sequence + )[0] if reviews_to_notify: subscribe = "message_subscribe" if hasattr(self, subscribe): getattr(self, subscribe)( partner_ids=reviews_to_notify.mapped("reviewer_ids") .mapped("partner_id") - .ids + .ids, + subtype_ids=self.env.ref( + self._get_accepted_notification_subtype() + ).ids, ) for review in reviews_to_notify: rec = self.env[review.model].browse(review.res_id) @@ -568,13 +628,29 @@ def _rejected_tier(self, tiers=False): reviews_to_notify = user_reviews.filtered( lambda r: r.definition_id.notify_on_rejected ) + # We need to notify all pending users if there is approve sequence + if tier_reviews and any(review.approve_sequence for review in tier_reviews): + reviews_to_notify = self.review_ids.filtered( + lambda r: r.status == "pending" and r.definition_id.notify_on_rejected + ) + # If there are approve sequence, only the following should be + # considered to notify + if reviews_to_notify and any( + review.approve_sequence for review in reviews_to_notify + ): + reviews_to_notify = reviews_to_notify.filtered( + lambda x: x.approve_sequence + )[0] if reviews_to_notify: subscribe = "message_subscribe" if hasattr(self, subscribe): getattr(self, subscribe)( partner_ids=reviews_to_notify.mapped("reviewer_ids") .mapped("partner_id") - .ids + .ids, + subtype_ids=self.env.ref( + self._get_rejected_notification_subtype() + ).ids, ) for review in reviews_to_notify: rec = self.env[review.model].browse(review.res_id) @@ -594,7 +670,10 @@ def _notify_review_requested(self, tier_reviews): # Subscribe reviewers and notify if len(users_to_notify) > 0: getattr(rec, subscribe)( - partner_ids=users_to_notify.mapped("partner_id").ids + partner_ids=users_to_notify.mapped("partner_id").ids, + subtype_ids=self.env.ref( + self._get_requested_notification_subtype() + ).ids, ) getattr(rec, post)( subtype_xmlid=self._get_requested_notification_subtype(), @@ -610,6 +689,17 @@ def _prepare_tier_review_vals(self, definition, sequence): "sequence": sequence, } + @api.model + def _get_company(self): + company_id = self.env.company + if ( + self + and self._tier_validation_company_field in self.env[self._name] + and self[self._tier_validation_company_field] + ): + company_id = self[self._tier_validation_company_field] + return company_id + def request_validation(self): td_obj = self.env["tier.definition"] tr_obj = self.env["tier.review"] @@ -619,7 +709,8 @@ def request_validation(self): tier_definitions = td_obj.search( [ ("model", "=", self._name), - ("company_id", "in", [False] + self.env.company.ids), + ("company_id", "in", [False] + rec._get_company().ids), + ("id", "not in", rec.review_ids.mapped("definition_id").ids), ], order="sequence desc", ) @@ -628,8 +719,9 @@ def request_validation(self): if rec.evaluate_tier(td): sequence += 1 vals_list.append(rec._prepare_tier_review_vals(td, sequence)) - self._update_counter({"review_created": True}) created_trs = tr_obj.create(vals_list) + if any(self.mapped("can_review")): + self._update_counter({"review_created": True}) self._notify_review_requested(created_trs) return created_trs @@ -671,9 +763,21 @@ def restart_validation(self): lambda r: r.definition_id.notify_on_restarted ) if hasattr(self, subscribe): - getattr(self, subscribe)(partner_ids=partners_to_notify_ids) + getattr(self, subscribe)( + partner_ids=partners_to_notify_ids, + subtype_ids=self.env.ref( + self._get_restarted_notification_subtype() + ).ids, + ) rec._notify_restarted_review() + def reevaluate_reviews(self): + reviews = self.env["tier.review"] + for rec in self: + rec._compute_need_validation() + reviews += rec.request_validation() + return reviews + @api.model def _update_counter(self, review_counter): self.review_ids._compute_can_review() @@ -713,12 +817,7 @@ def _get_tier_validation_readonly_domain(self): @api.model def get_view(self, view_id=None, view_type="form", **options): res = super().get_view(view_id=view_id, view_type=view_type, **options) - View = self.env["ir.ui.view"] - - # Override context for postprocessing - if view_id and res.get("base_model", self._name) != self._name: - View = View.with_context(base_model_name=res["base_model"]) if view_type == "form" and not self._tier_validation_manual_config: doc = etree.XML(res["arch"]) params = { @@ -726,7 +825,7 @@ def get_view(self, view_id=None, view_type="form", **options): "state_operator": "not in", "state_value": self._state_from, } - all_models = res["models"].copy() + all_models = res["models"].copy() # {modelname(str) ➔ fields(tuple)} for node in doc.xpath(self._tier_validation_buttons_xpath): # By default, after the last button of the header # _add_tier_validation_buttons process @@ -735,6 +834,7 @@ def get_view(self, view_id=None, view_type="form", **options): new_node = etree.fromstring(new_arch) for new_element in new_node: node.addnext(new_element) + _merge_view_fields(all_models, new_models) for node in doc.xpath("/form/sheet"): # _add_tier_validation_label process new_node = self._add_tier_validation_label(node, params) @@ -742,18 +842,13 @@ def get_view(self, view_id=None, view_type="form", **options): new_node = etree.fromstring(new_arch) for new_element in new_node: node.addprevious(new_element) + _merge_view_fields(all_models, new_models) # _add_tier_validation_reviews process new_node = self._add_tier_validation_reviews(node, params) new_arch, new_models = View.postprocess_and_fields(new_node, self._name) - for model in new_models: - if model in all_models: - continue - if model not in res["models"]: - all_models[model] = new_models[model] - else: - all_models[model] = res["models"][model] new_node = etree.fromstring(new_arch) node.append(new_node) + _merge_view_fields(all_models, new_models) excepted_fields = self._get_all_validation_exceptions() for node in doc.xpath("//field[@name][not(ancestor::field)]"): if node.attrib.get("name") in excepted_fields: @@ -772,3 +867,12 @@ def get_view(self, view_id=None, view_type="form", **options): res["arch"] = etree.tostring(doc) res["models"] = frozendict(all_models) return res + + +def _merge_view_fields(all_models: dict, new_models: dict): + """Merge new_models into all_models. Both are {modelname(str) ➔ fields(tuple)}.""" + for model, view_fields in new_models.items(): + if model in all_models: + all_models[model] = tuple(set(all_models[model]) | set(view_fields)) + else: + all_models[model] = tuple(view_fields) diff --git a/base_tier_validation/models/tier_validation_exception.py b/base_tier_validation/models/tier_validation_exception.py index f7e92368..1a732b3b 100644 --- a/base_tier_validation/models/tier_validation_exception.py +++ b/base_tier_validation/models/tier_validation_exception.py @@ -28,7 +28,7 @@ def _get_tier_validation_model_names(self): ) model_name = fields.Char( related="model_id.model", - string="Model", + string="Model Name", store=True, readonly=True, index=True, diff --git a/base_tier_validation/readme/CONTRIBUTORS.rst b/base_tier_validation/readme/CONTRIBUTORS.rst index a89b027c..7723eafc 100644 --- a/base_tier_validation/readme/CONTRIBUTORS.rst +++ b/base_tier_validation/readme/CONTRIBUTORS.rst @@ -8,3 +8,6 @@ * Evan Soh * Manuel Regidor * Eduardo de Miguel +* `XCG Consulting `_: + + * Houzéfa Abbasbhay diff --git a/base_tier_validation/static/description/index.html b/base_tier_validation/static/description/index.html index 44e16d45..6aa77978 100644 --- a/base_tier_validation/static/description/index.html +++ b/base_tier_validation/static/description/index.html @@ -3,7 +3,7 @@ -Base Tier Validation +README.rst -
-

Base Tier Validation

+
+ + +Odoo Community Association + +
+

Base Tier Validation

-

Mature License: AGPL-3 OCA/server-ux Translate me on Weblate Try me on Runboat

+

Mature License: AGPL-3 OCA/server-ux Translate me on Weblate Try me on Runboat

Validating some operations is a common need across different areas in a company and sometimes it also involves several people and stages in the process. With this module you will be able to define your custom validation workflows for @@ -412,7 +417,7 @@

Base Tier Validation

-

Configuration

+

Configuration

To configure Tier Validations, you need to:

  1. Go to Settings > Technical > Tier Validations > Tier Definition.
  2. @@ -443,7 +448,7 @@

    Configuration

-

Known issues / Roadmap

+

Known issues / Roadmap

This is the list of known issues for this module. Any proposal for improvement will be very valuable.

-

Changelog

+

Changelog

-

13.0.1.2.2 (2020-08-30)

+

13.0.1.2.2 (2020-08-30)

Fixes:

  • When using approve_sequence option in any tier.definition there can be inconsistencies in the systray notifications
  • @@ -478,7 +483,7 @@

    13.0.1.2.2 (2020-08-30)

-

12.0.3.3.1 (2019-12-02)

+

12.0.3.3.1 (2019-12-02)

Fixes:

-

12.0.3.3.0 (2019-11-27)

+

12.0.3.3.0 (2019-11-27)

New features:

-

12.0.3.2.1 (2019-11-26)

+

12.0.3.2.1 (2019-11-26)

Fixes:

  • Remove message_subscribe_users
-

12.0.3.2.0 (2019-11-25)

+

12.0.3.2.0 (2019-11-25)

New features:

  • Notify reviewers
-

12.0.3.0.0 (2019-12-02)

+

12.0.3.0.0 (2019-12-02)

Fixes:

  • Edit Reviews Table
-

12.0.2.1.0 (2019-05-29)

+

12.0.2.1.0 (2019-05-29)

Fixes:

  • Edit drop-down style width and position
-

12.0.2.0.0 (2019-05-28)

+

12.0.2.0.0 (2019-05-28)

New features:

-

Bug Tracker

+

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 @@ -562,15 +567,15 @@

Bug Tracker

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

-

Credits

+

Credits

-

Authors

+

Authors

  • ForgeFlow
-

Contributors

+

Contributors

-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association @@ -600,5 +609,6 @@

Maintainers

+
diff --git a/base_tier_validation/templates/tier_validation_templates.xml b/base_tier_validation/templates/tier_validation_templates.xml index 9629b2de..cf89deec 100644 --- a/base_tier_validation/templates/tier_validation_templates.xml +++ b/base_tier_validation/templates/tier_validation_templates.xml @@ -2,12 +2,14 @@