diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a28fed06e4..d28a7d7712 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -20,6 +20,8 @@ exclude: | /tests/samples/.*| # You don't usually want a bot to modify your legal texts (LICENSE.*|COPYING.*) + # Modules + ^base_tier_validation/static/src/components/.*$| default_language_version: python: python3 node: "22.9.0" diff --git a/base_tier_validation/README.rst b/base_tier_validation/README.rst new file mode 100644 index 0000000000..9d1b8e75e0 --- /dev/null +++ b/base_tier_validation/README.rst @@ -0,0 +1,295 @@ +==================== +Base Tier Validation +==================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:1d286dc389232f0cc60fd6012ae72c5eaf918284c9e7ef73da914cd6691cf822 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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/18.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-18-0/server-ux-18-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=18.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. + +Additionally, if your state field is a (stored) computed field, you need +to set ``_tier_validation_state_field_is_computed`` to ``True`` in your +model Python file, and you will want to add the dependent fields of the +compute method in ``_get_after_validation_exceptions`` and +``_get_under_validation_exceptions``. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +To configure this module, you need to: + +1. Go to *Settings > Technical > Tier Validations > Tier Definition*. +2. 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 *Notify reviewers on reaching pending* if you want to send a + notification when pending status is reached. This is usefull in a + approve by sequence scenario to only notify reviewers when it is their + turn in the sequence. +- 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. Create as many tiers validation exceptions as you want for any model + having tier validation functionality. +3. Add desired fields to be checked in *Fields*. +4. Add desired groups that can use this Exception in *Groups*. +5. 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 +========= + +17.0.1.0.0 (2024-01-10) +----------------------- + +Migrated to Odoo 17. Merged module with tier_validation_waiting. To +support sending messages in a validation sequence when it is their turn +to validate. + +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. +- Carlos Lopez +- Javier Colmeiro +- bosd +- Evan Soh +- Manuel Regidor +- Eduardo de Miguel +- `XCG Consulting `__: + + - Houzéfa Abbasbhay + +- Stefan Rijnhart + +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 0000000000..93aa2c1f84 --- /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 0000000000..d26b15679e --- /dev/null +++ b/base_tier_validation/__manifest__.py @@ -0,0 +1,37 @@ +# Copyright 2017-24 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": "18.0.1.0.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/components/tier_review_menu/tier_review_menu.esm.js", # pylint: disable=no-undef + "/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml", + "/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.esm.js", + "/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.scss", + "/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml", + "/base_tier_validation/static/src/js/services/tier_review_service.esm.js", + ], + }, +} diff --git a/base_tier_validation/data/mail_data.xml b/base_tier_validation/data/mail_data.xml new file mode 100644 index 0000000000..8207bc4c77 --- /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 0000000000..bfd6432569 --- /dev/null +++ b/base_tier_validation/i18n/base_tier_validation.pot @@ -0,0 +1,891 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_tier_validation +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.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 +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" This Record needs to be\n" +" validated." +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" Operation has been\n" +" rejected\n" +" ." +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" Operation has been\n" +" validated\n" +" !" +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 "Bypass, 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 record to be reviewed has been created by %s." +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/components/tier_review_menu/tier_review_menu.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/components/tier_review_widget/tier_review_widget.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/components/tier_review_widget/tier_review_widget.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/components/tier_review_widget/tier_review_widget.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_tier_validation__hide_reviews +msgid "Hide Reviews" +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_validation__has_comment +msgid "If set, Allow the reviewer to leave a comment on the review." +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_pending +msgid "" +"If set, all possible reviewers will be notified by email when this status is" +" reached.Usefull in an Approve by sequence scenario. An notification request" +" to review is sent out when it's their turn to review." +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__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_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" +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/components/tier_review_menu/tier_review_menu.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:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_pending +msgid "Notify Reviewers on reaching Pending" +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 use python formula to get reviewers and find documents" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.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/components/tier_review_widget/tier_review_widget.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/components/tier_review_menu/tier_review_menu.xml:0 +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.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/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__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/components/tier_review_widget/tier_review_widget.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.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 +#: 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,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/components/tier_review_widget/tier_review_widget.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/components/tier_review_widget/tier_review_widget.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_review__status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__waiting +msgid "Waiting" +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 0000000000..d6e4a5e0ec --- /dev/null +++ b/base_tier_validation/i18n/es.po @@ -0,0 +1,981 @@ +# 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-04-23 10:39+0000\n" +"Last-Translator: Ivorra78 \n" +"Language-Team: none\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: Weblate 4.17\n" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" This Record needs to be\n" +" validated." +msgstr "" +"\n" +" Este registro debe ser\n" +" validado." + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" Operation has been\n" +" rejected\n" +" ." +msgstr "" +"\n" +" La operación ha sido\n" +" rechazada\n" +" ." + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" Operation has been\n" +" validated\n" +" !" +msgstr "" +"\n" +" La operación ha sido\n" +" validada\n" +" !" + +#. 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 "Bypass, if previous tier was validated by same reviewer" +msgstr "" +"Omitir, 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 record to be reviewed has been created by %s." +msgstr "Un registro a revisar ha sido creado por %s." + +#. 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/components/tier_review_menu/tier_review_menu.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 "" + +#. 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 "" + +#. 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/components/tier_review_widget/tier_review_widget.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 "Configuración de Ajustes" + +#. 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" + +#. 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/components/tier_review_widget/tier_review_widget.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 "Mostrar Estado" + +#. 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/components/tier_review_widget/tier_review_widget.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 "" + +#. 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 "Ha comentado" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__hide_reviews +msgid "Hide Reviews" +msgstr "Ocultar Reseñas" + +#. 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_validation__has_comment +msgid "If set, Allow the reviewer to leave a comment on the review." +msgstr "" +"Si se establece, permite al revisor dejar un comentario sobre la reseña." + +#. 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_pending +msgid "" +"If set, all possible reviewers will be notified by email when this status is " +"reached.Usefull in an Approve by sequence scenario. An notification request " +"to review is sent out when it's their turn to review." +msgstr "" +"Si se establece, todos los posibles revisores recibirán una notificación por " +"correo electrónico cuando se alcance este estado. Es útil en un escenario de " +"aprobación por secuencia. Se envía una solicitud de notificación de revisión " +"cuando les toca revisar." + +#. 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 se establece, los revisores recibirán una notificación por correo " +"electrónico cuando se acepte una revisión relacionada con esta definición." + +#. 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 se establece, los revisores recibirán una notificación por correo " +"electrónico cuando se rechace una revisión relacionada con esta definición." + +#. 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 se establece, los revisores recibirán una notificación por correo " +"electrónico cuando se reinicie una revisión relacionada con esta definición." + +#. 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__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_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" +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 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/components/tier_review_menu/tier_review_menu.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 la Aceptación a los Revisores" + +#. 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 el Rechazo a los Revisores" + +#. 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 a los Revisores al Reiniciar" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_pending +msgid "Notify Reviewers on reaching Pending" +msgstr "Notificar a los Revisores sobre la recepción de Pendientes" + +#. 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 "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 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/components/tier_review_menu/tier_review_menu.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/components/tier_review_widget/tier_review_widget.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/components/tier_review_menu/tier_review_menu.xml:0 +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.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/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__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/components/tier_review_widget/tier_review_widget.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.model.fields,field_description:base_tier_validation.field_tier_review__sequence +msgid "Tier" +msgstr "Nivel" + +#. 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,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 "" + +#. 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 "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/components/tier_review_widget/tier_review_widget.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/components/tier_review_widget/tier_review_widget.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_review__status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__waiting +msgid "Waiting" +msgstr "Esperando" + +#. 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 "" + +#. 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 "ej. Validación de Nivel por..." + +#, python-format +#~ msgid "The operation is under validation." +#~ msgstr "Esta operación está en proceso de validación." + +#~ 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 "" +#~ "Bypassed, if previous tier was validated by same reviewer" +#~ msgstr "" +#~ "Omitido, si el nivel anterior fue validado por el mismo revisor" + +#, python-format +#~ msgid "0 Pending" +#~ msgstr "0 Pendientes" + +#~ msgid "Last Modified on" +#~ msgstr "Última modificación en" + +#~ 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" + +#~ msgid "Tier Forward & Backward" +#~ msgstr "Nivel hacia delante y hacia atrás" diff --git a/base_tier_validation/i18n/es_MX.po b/base_tier_validation/i18n/es_MX.po new file mode 100644 index 0000000000..89c2c751bf --- /dev/null +++ b/base_tier_validation/i18n/es_MX.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: 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 +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" This Record needs to be\n" +" validated." +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" Operation has been\n" +" rejected\n" +" ." +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" Operation has been\n" +" validated\n" +" !" +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 "Bypass, 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 record to be reviewed has been created by %s." +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/components/tier_review_menu/tier_review_menu.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/components/tier_review_widget/tier_review_widget.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/components/tier_review_widget/tier_review_widget.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/components/tier_review_widget/tier_review_widget.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_tier_validation__hide_reviews +msgid "Hide Reviews" +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 "Identificación" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_validation__has_comment +msgid "If set, Allow the reviewer to leave a comment on the review." +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_pending +msgid "" +"If set, all possible reviewers will be notified by email when this status is " +"reached.Usefull in an Approve by sequence scenario. An notification request " +"to review is sent out when it's their turn to review." +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__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_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" +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/components/tier_review_menu/tier_review_menu.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:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_pending +msgid "Notify Reviewers on reaching Pending" +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 use python formula to get reviewers and find documents" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.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/components/tier_review_widget/tier_review_widget.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/components/tier_review_menu/tier_review_menu.xml:0 +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.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/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__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/components/tier_review_widget/tier_review_widget.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.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 +#: 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,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/components/tier_review_widget/tier_review_widget.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/components/tier_review_widget/tier_review_widget.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_review__status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__waiting +msgid "Waiting" +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 "p.ej. Validación de nivel para ..." + +#, python-format +#~ msgid "The operation is under validation." +#~ msgstr "La operación está en proceso de validación." + +#~ 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 "0 Pending" +#~ msgstr "0 Pendientes" + +#~ msgid "Last Modified on" +#~ msgstr "Última modificación el" + +#, 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 0000000000..2156807597 --- /dev/null +++ b/base_tier_validation/i18n/fr.po @@ -0,0 +1,967 @@ +# 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: 2023-10-19 12:51+0000\n" +"Last-Translator: Houzéfa Abbasbhay \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 +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" This Record needs to be\n" +" validated." +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" Operation has been\n" +" rejected\n" +" ." +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" Operation has been\n" +" validated\n" +" !" +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 "Bypass, 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 record to be reviewed has been created by %s." +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 "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/components/tier_review_menu/tier_review_menu.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 "" + +#. 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 "" + +#. 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 "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/components/tier_review_widget/tier_review_widget.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 "" + +#. 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/components/tier_review_widget/tier_review_widget.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 "" + +#. 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/components/tier_review_widget/tier_review_widget.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 "" + +#. 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_tier_validation__hide_reviews +msgid "Hide Reviews" +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_validation__has_comment +msgid "If set, Allow the reviewer to leave a comment on the review." +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 "" +"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_pending +msgid "" +"If set, all possible reviewers will be notified by email when this status is " +"reached.Usefull in an Approve by sequence scenario. An notification request " +"to review is sent out when it's their turn to review." +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__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_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 "" + +#. 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/components/tier_review_menu/tier_review_menu.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 "" + +#. 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 "" + +#. 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:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_pending +msgid "Notify Reviewers on reaching Pending" +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 "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 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/components/tier_review_menu/tier_review_menu.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/components/tier_review_widget/tier_review_widget.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/components/tier_review_menu/tier_review_menu.xml:0 +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.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/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__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/components/tier_review_widget/tier_review_widget.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.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 +#: 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,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/components/tier_review_widget/tier_review_widget.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/components/tier_review_widget/tier_review_widget.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_review__status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__waiting +msgid "Waiting" +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 "par ex Niveau de validation pour..." + +#, python-format +#~ msgid "The operation is under validation." +#~ msgstr "Cette opération est en cours de validation." + +#~ 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 "0 Pending" +#~ msgstr "0 en attente" + +#~ msgid "Last Modified on" +#~ msgstr "Dernière modification le" + +#~ 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" + +#~ msgid "Tier Forward & Backward" +#~ msgstr "Délégation des niveaux" + +#, 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 0000000000..4827c61760 --- /dev/null +++ b/base_tier_validation/i18n/it.po @@ -0,0 +1,1004 @@ +# 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-29 08: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 +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" This Record needs to be\n" +" validated." +msgstr "" +"\n" +" Questo record necessita di\n" +" approvazione." + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" Operation has been\n" +" rejected\n" +" ." +msgstr "" +"\n" +" L'operazione è stata\n" +" rifiutata\n" +" ." + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" Operation has been\n" +" validated\n" +" !" +msgstr "" +"\n" +" L'operazione è stata\n" +" approvata\n" +" !" + +#. 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 "Bypass, if previous tier was validated by same reviewer" +msgstr "" +"Aggira, 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 record to be reviewed has been created by %s." +msgstr "Un record a revisionare è stato creato da %s." + +#. 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 "Un'approvazione è 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/components/tier_review_menu/tier_review_menu.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/components/tier_review_widget/tier_review_widget.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 "Wizard 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/components/tier_review_widget/tier_review_widget.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/components/tier_review_widget/tier_review_widget.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_tier_validation__hide_reviews +msgid "Hide Reviews" +msgstr "Nascondi revisioni" + +#. 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_validation__has_comment +msgid "If set, Allow the reviewer to leave a comment on the review." +msgstr "" +"Se attivata, consente al revisore di lasciare un commento nella revisione." + +#. 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 impostato, tutti i possibili approvatori saranno notificati via email " +"quando la definizione è attivata." + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_pending +msgid "" +"If set, all possible reviewers will be notified by email when this status is " +"reached.Usefull in an Approve by sequence scenario. An notification request " +"to review is sent out when it's their turn to review." +msgstr "" +"Se impostata, tutti i possibili revisori verranno avvisati per e-mail quando " +"questo stato è raggiunto. Utile in uno scenario di approvazione in sequenza. " +"Una notifica di revisione è inviata quando è il turno di revisione." + +#. 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__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_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" +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/components/tier_review_menu/tier_review_menu.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:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_pending +msgid "Notify Reviewers on reaching Pending" +msgstr "Notifica i revisori quando passa a \"In sospeso\"" + +#. 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 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/components/tier_review_menu/tier_review_menu.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/components/tier_review_widget/tier_review_widget.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 approvatore" + +#. 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/components/tier_review_menu/tier_review_menu.xml:0 +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.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/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__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/components/tier_review_widget/tier_review_widget.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.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 +#: 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,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 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/components/tier_review_widget/tier_review_widget.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 "Approvato da" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.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_review__status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__waiting +msgid "Waiting" +msgstr "In attesa" + +#. 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 "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." + +#~ 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" +#~ " !" + +#, python-format +#~ msgid "0 Pending" +#~ msgstr "0 In attesa" + +#~ msgid "Last Modified on" +#~ msgstr "Ultima Modifica il" + +#, 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 0000000000..897344dd05 --- /dev/null +++ b/base_tier_validation/i18n/nl_NL.po @@ -0,0 +1,947 @@ +# 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-02-18 12:37+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 +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" This Record needs to be\n" +" validated." +msgstr "" +"\n" +" Dit Record dient te worden\n" +" beoordeeld." + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" Operation has been\n" +" rejected\n" +" ." +msgstr "" +"\n" +" Aanvraag is \n" +" afgewezen\n" +" ." + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" Operation has been\n" +" validated\n" +" !" +msgstr "" +"\n" +" Aanvraag is\n" +" Gevalideerd\n" +" !" + +#. 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 "Bypass, 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 record to be reviewed has been created by %s." +msgstr "Een record dat dient te worden beoordeeld, is aangemaakt door %s." + +#. 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/components/tier_review_menu/tier_review_menu.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 "gearchiveerd" + +#. 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/components/tier_review_widget/tier_review_widget.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 +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/components/tier_review_widget/tier_review_widget.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/components/tier_review_widget/tier_review_widget.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_tier_validation__hide_reviews +msgid "Hide Reviews" +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_validation__has_comment +msgid "If set, Allow the reviewer to leave a comment on the review." +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 "" +"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_pending +msgid "" +"If set, all possible reviewers will be notified by email when this status is " +"reached.Usefull in an Approve by sequence scenario. An notification request " +"to review is sent out when it's their turn to review." +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__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_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" +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/components/tier_review_menu/tier_review_menu.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:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_pending +msgid "Notify Reviewers on reaching Pending" +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 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/components/tier_review_menu/tier_review_menu.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/components/tier_review_widget/tier_review_widget.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/components/tier_review_menu/tier_review_menu.xml:0 +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.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/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__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/components/tier_review_widget/tier_review_widget.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.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 +#: 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,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 +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 +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/components/tier_review_widget/tier_review_widget.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/components/tier_review_widget/tier_review_widget.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_review__status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__waiting +msgid "Waiting" +msgstr "" + +#. 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..." + +#, python-format +#~ msgid "The operation is under validation." +#~ msgstr "De bewerking is onder validatie." + +#, python-format +#~ msgid "0 Pending" +#~ msgstr "0 In afwachting" + +#~ msgid "Last Modified on" +#~ msgstr "Laatst gewijzigd op" + +#, 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 0000000000..a58a6a002f --- /dev/null +++ b/base_tier_validation/i18n/sv.po @@ -0,0 +1,1002 @@ +# 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-06-12 12:39+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 +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" This Record needs to be\n" +" validated." +msgstr "" +"\n" +" Denna post behöver\n" +" bekräftas." + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" Operation has been\n" +" rejected\n" +" ." +msgstr "" +"\n" +" Operationen har blivit\n" +" avslås\n" +" ." + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" Operation has been\n" +" validated\n" +" !" +msgstr "" +"\n" +" Operationen har blivit\n" +" bekräftad\n" +" !" + +#. 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 "Bypass, if previous tier was validated by same reviewer" +msgstr "" +"Hoppa över, om föregående nivå bekräftades av samma granskare" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A record to be reviewed has been created by %s." +msgstr "En post som ska granskas har skapats av %s." + +#. 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 recension avvisades 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/components/tier_review_menu/tier_review_menu.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 "Godkänna förbikoppling av sekvens" + +#. 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 "Godkänn efter sekvens" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__approved +msgid "Approved" +msgstr "Godkänd" + +#. 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örbigås (bekräftas automatiskt), om föregående nivå bekräftades 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 granska kommer att vara ikryssad om granskningen är väntande och\n" +" godkännandesekvensen 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/components/tier_review_widget/tier_review_widget.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/components/tier_review_widget/tier_review_widget.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 "Visa status" + +#. 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/components/tier_review_widget/tier_review_widget.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_tier_validation__hide_reviews +msgid "Hide Reviews" +msgstr "Dölj recensioner" + +#. 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_validation__has_comment +msgid "If set, Allow the reviewer to leave a comment on the review." +msgstr "" +"Om inställd, Tillåt granskaren att lämna en kommentar till granskningen." + +#. 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 granskare 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_pending +msgid "" +"If set, all possible reviewers will be notified by email when this status is " +"reached.Usefull in an Approve by sequence scenario. An notification request " +"to review is sent out when it's their turn to review." +msgstr "" +"Om den är inställd kommer alla möjliga granskare att meddelas via e-post när " +"den här statusen uppnås.Användbar i ett Approve by sequence-scenario. Ett " +"meddelande med en begäran om granskning skickas ut när det är deras tur att " +"granska." + +#. 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 "" +"Om den är inställd kommer granskare att meddelas via e-post när en " +"granskning som är relaterad till denna definition accepteras." + +#. 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 "" +"Om den är inställd kommer granskare att meddelas via e-post när en " +"granskning som är relaterad till denna definition avvisas." + +#. 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 "" +"Om den är inställd kommer granskare att meddelas via e-post när en " +"granskning som är relaterad till denna definition startas om." + +#. 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__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_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" +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/components/tier_review_menu/tier_review_menu.xml:0 +#, python-format +msgid "No reviews to do." +msgstr "Inga granskningar 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 "Meddela granskare om accepterad" + +#. 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 "Meddela granskare om avvisade" + +#. 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 "Meddela granskare vid omstart" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_pending +msgid "Notify Reviewers on reaching Pending" +msgstr "Meddela granskare om att nå Pending" + +#. 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 "Operationen har avslagits." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "Operation has been validated!" +msgstr "Operationen 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 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/components/tier_review_menu/tier_review_menu.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 "Avvisat 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 validering" + +#. 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/components/tier_review_widget/tier_review_widget.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 "Res" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_model +msgid "Res Model" +msgstr "Res modell" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Restart Validation" +msgstr "Starta om validering" + +#. 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/components/tier_review_menu/tier_review_menu.xml:0 +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.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/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__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/components/tier_review_widget/tier_review_widget.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 "Granskningen 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 bekräftas" + +#. 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 bekräftas 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 "Djur" + +#. 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,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 "För att validera meddelandet" + +#. 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/components/tier_review_widget/tier_review_widget.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 "Giltigt fält för granskare" + +#. 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 "Validerat 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 "Validerad av" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewed_date +#, python-format +msgid "Validation Date" +msgstr "Valideringsdatum" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewed_formated_date +msgid "Validation Formated Date" +msgstr "Validering Formated Date" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validation_status +msgid "Validation Status" +msgstr "Status för validering" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__review_ids +msgid "Validations" +msgstr "Valideringar" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__waiting +msgid "Waiting" +msgstr "Väntar på" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__no +msgid "Without validation" +msgstr "Utan validering" + +#. 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. attestvalidering för..." + +#, python-format +#~ msgid "The operation is under validation." +#~ msgstr "Åtgärden håller på att bekräftas." + +#~ 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 "0 Pending" +#~ msgstr "0 väntande" + +#~ msgid "Last Modified on" +#~ msgstr "Senast ändrad den" + +#~ 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" + +#~ msgid "Tier Forward & Backward" +#~ msgstr "Attest framåt och bakåt" + +#, 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 0000000000..49099ee259 --- /dev/null +++ b/base_tier_validation/i18n/tr.po @@ -0,0 +1,942 @@ +# 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 +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" This Record needs to be\n" +" validated." +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" Operation has been\n" +" rejected\n" +" ." +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" Operation has been\n" +" validated\n" +" !" +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 "Bypass, 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 record to be reviewed has been created by %s." +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/components/tier_review_menu/tier_review_menu.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/components/tier_review_widget/tier_review_widget.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/components/tier_review_widget/tier_review_widget.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/components/tier_review_widget/tier_review_widget.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_tier_validation__hide_reviews +msgid "Hide Reviews" +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_validation__has_comment +msgid "If set, Allow the reviewer to leave a comment on the review." +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 "" +"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_pending +msgid "" +"If set, all possible reviewers will be notified by email when this status is " +"reached.Usefull in an Approve by sequence scenario. An notification request " +"to review is sent out when it's their turn to review." +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__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_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 "" + +#. 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/components/tier_review_menu/tier_review_menu.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:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_pending +msgid "Notify Reviewers on reaching Pending" +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 use python formula to get reviewers and find documents" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.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/components/tier_review_widget/tier_review_widget.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/components/tier_review_menu/tier_review_menu.xml:0 +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.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/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__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/components/tier_review_widget/tier_review_widget.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.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 +#: 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,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/components/tier_review_widget/tier_review_widget.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/components/tier_review_widget/tier_review_widget.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_review__status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__waiting +msgid "Waiting" +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 "ör. Şunun için Seviye Doğrulaması..." + +#, python-format +#~ msgid "The operation is under validation." +#~ msgstr "İşlem doğrulama aşamasındadır." + +#~ 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 "0 Pending" +#~ msgstr "0 Bekleyen" + +#~ msgid "Last Modified on" +#~ msgstr "Son Düzenleme" diff --git a/base_tier_validation/i18n/zh_CN.po b/base_tier_validation/i18n/zh_CN.po new file mode 100644 index 0000000000..43717d93ff --- /dev/null +++ b/base_tier_validation/i18n/zh_CN.po @@ -0,0 +1,934 @@ +# 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 +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" This Record needs to be\n" +" validated." +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" Operation has been\n" +" rejected\n" +" ." +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" Operation has been\n" +" validated\n" +" !" +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 "Bypass, 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 record to be reviewed has been created by %s." +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/components/tier_review_menu/tier_review_menu.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/components/tier_review_widget/tier_review_widget.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/components/tier_review_widget/tier_review_widget.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/components/tier_review_widget/tier_review_widget.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_tier_validation__hide_reviews +msgid "Hide Reviews" +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_validation__has_comment +msgid "If set, Allow the reviewer to leave a comment on the review." +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_pending +msgid "" +"If set, all possible reviewers will be notified by email when this status is " +"reached.Usefull in an Approve by sequence scenario. An notification request " +"to review is sent out when it's their turn to review." +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__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_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" +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/components/tier_review_menu/tier_review_menu.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:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_pending +msgid "Notify Reviewers on reaching Pending" +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 use python formula to get reviewers and find documents" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.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/components/tier_review_widget/tier_review_widget.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/components/tier_review_menu/tier_review_menu.xml:0 +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.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/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__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/components/tier_review_widget/tier_review_widget.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.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 +#: 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,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/components/tier_review_widget/tier_review_widget.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/components/tier_review_widget/tier_review_widget.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_review__status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__waiting +msgid "Waiting" +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 "该操作正在审批中。" + +#, python-format +#~ msgid "0 Pending" +#~ msgstr "0 待审批" + +#~ msgid "Last Modified on" +#~ 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 0000000000..5cf03dbb4d --- /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 0000000000..6ca8844a82 --- /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 0000000000..ce56998341 --- /dev/null +++ b/base_tier_validation/models/res_users.py @@ -0,0 +1,47 @@ +# 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()) diff --git a/base_tier_validation/models/tier_definition.py b/base_tier_validation/models/tier_definition.py new file mode 100644 index 0000000000..96b6528d99 --- /dev/null +++ b/base_tier_validation/models/tier_definition.py @@ -0,0 +1,115 @@ +# 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_pending = fields.Boolean( + string="Notify Reviewers on reaching Pending", + help="If set, all possible reviewers will be notified by email when " + "this status is reached." + "Usefull in an Approve by sequence scenario. " + "An notification request to review is sent out when it's their turn to review.", + ) + 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 0000000000..087ffdce18 --- /dev/null +++ b/base_tier_validation/models/tier_review.py @@ -0,0 +1,161 @@ +# 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( + [ + ("waiting", "Waiting"), + ("pending", "Pending"), + ("rejected", "Rejected"), + ("approved", "Approved"), + ], + default="waiting", + ) + 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): + reviews = self.filtered(lambda rev: rev.status in ["waiting", "pending"]) + if reviews: + # get minimum sequence of all to prevent jumps + next_seq = min(reviews.mapped("sequence")) + for record in reviews: + # if approve by sequence, check sequence has been reached + if record.approve_sequence: + if record.sequence == next_seq: + record.status = "pending" + # if there is no approval sequence go directly to pending state + elif not record.approve_sequence: + record.status = "pending" + if record.status == "pending": + if record.definition_id.notify_on_pending: + record._notify_pending_status(record) + for record in self: + record.can_review = record._can_review_value() + + def _can_review_value(self): + if self.status not in ("pending", "waiting"): + 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 = f"{todo_by} (and {num_users - num_show} more)" + 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 + + def _notify_pending_status(self, review_ids): + """Method to call and reuse abstract notification method""" + resource = self.env[self.model].browse(self.res_id) + resource._notify_review_available(review_ids) diff --git a/base_tier_validation/models/tier_validation.py b/base_tier_validation/models/tier_validation.py new file mode 100644 index 0000000000..adade4307d --- /dev/null +++ b/base_tier_validation/models/tier_validation.py @@ -0,0 +1,862 @@ +# 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). + +from ast import literal_eval + +from lxml import etree +from psycopg2.extensions import AsIs + +from odoo import _, api, fields, models +from odoo.exceptions import ValidationError +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 + _tier_validation_state_field_is_computed = False + + _state_field = "state" + _state_from = ["draft"] + _state_to = ["confirmed"] + _cancel_state = "cancel" + + 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"), + ("waiting", "Waiting"), + ("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", + help="If set, Allow the reviewer to leave a comment on the review.", + ) + next_review = fields.Char(compute="_compute_next_review") + hide_reviews = fields.Boolean(compute="_compute_hide_reviews") + + def _compute_has_comment(self): + for rec in self: + has_comment = rec.review_ids.filtered( + lambda r: r.status in ("waiting", "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 in ("waiting", "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", "in", ["pending", "waiting"]), + ("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 in ("waiting", "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), + ] + ) + 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 _( + f""" Operation has been validated!""" + ) + return self.validated and msg or "" + + def _get_rejected_message(self): + msg = _( + """ 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" + elif ( + not item.validated + and not item.rejected + and any(item.review_ids.filtered(lambda x: x.status == "waiting")) + ): + item.validation_status = "waiting" + else: + item.validation_status = "no" + + def _compute_next_review(self): + for rec in self: + review = rec.review_ids.sorted("sequence").filtered( + lambda x: x.status == "pending" + )[:1] + rec.next_review = review and _("Next: %s") % review.name or "" + + def _compute_hide_reviews(self): + for rec in self: + rec.hide_reviews = rec[self._state_field] not in self._state_from + + @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): + self._tier_validation_check_state_on_write(vals) + self._tier_validation_check_write_allowed(vals) + self._tier_validation_check_write_remove_reviews(vals) + return super().write(vals) + + def _write(self, vals): + if self._tier_validation_state_field_is_computed: + self._tier_validation_check_state_on_write(vals) + self._tier_validation_check_write_remove_reviews(vals) + return super()._write(vals) + + def _tier_validation_get_current_state_value(self): + """Get the current value from the cache or the database. + + If the field is set in a computed method, the value in the cache will + already be the updated value, so we need to revert to the raw data. + """ + self.ensure_one() + if self._tier_validation_state_field_is_computed and isinstance(self.id, int): + self.env.cr.execute( + "select %(field)s from %(table)s where id = %(res_id)s", + { + "field": AsIs(self._state_field), + "table": AsIs(self._table), + "res_id": self.id, + }, + ) + rows = self.env.cr.fetchall() + if rows: + return rows[0][0] + return self[self._state_field] + + def _tier_validation_check_state_on_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." + ) + ) + + def _tier_validation_check_write_allowed(self, vals): + for rec in self: + # Write under validation + if ( + rec.review_ids + and getattr(rec, self._state_field) in self._state_from + and vals.get(self._state_field) + not 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 rec._tier_validation_get_current_state_value() + 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), + } + ) + + def _tier_validation_check_write_remove_reviews(self, vals): + for rec in self: + if rec._allow_to_remove_reviews(vals): + rec.mapped("review_ids").unlink() + + 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._tier_validation_get_current_state_value() + # 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 self._tier_validation_get_current_state_value() 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 + waiting_reviews = tier_reviews.filtered( + lambda r: r.status == "waiting" + or r.approve_sequence_bypass + and self.env.user in r.reviewer_ids + ) + if waiting_reviews: + waiting_reviews.write( + { + "status": "pending", + } + ) + + 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 x: x.sequence in sequences or x.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 x: x.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 in ("waiting", "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_created_review_body(self): + return _("A record to be reviewed has been created by %s.") % ( + self.env.user.name + ) + + 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): + """method to notify when tier validation is created""" + 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, x=rec: r.definition_id.notify_on_create + and r.res_id == x.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_created_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 in ("waiting", "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() + channel = "base.tier.validation/updated" + self.env["bus.bus"]._sendone( + channel, + "inbox", + f"Base tier validation for partner " + f"{self.env.user.partner_id}, counter {review_counter}", + ) + + 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 "bool(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"] + if view_type == "form" and not self._tier_validation_manual_config: + doc = etree.XML(res["arch"]) + params = {} + 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 + 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) + _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) + 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) + _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) + 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: + continue + new_r_modifier = self._get_tier_validation_readonly_domain() + old_r_modifier = node.attrib.get("readonly") + if old_r_modifier: + new_r_modifier = f"({old_r_modifier}) or ({new_r_modifier})" + node.attrib["readonly"] = new_r_modifier + res["arch"] = etree.tostring(doc) + res["models"] = frozendict(all_models) + return res + + def _notify_review_available(self, tier_reviews): + """method to notify when reaching pending""" + 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, x=rec: r.definition_id.notify_on_pending + and r.res_id == x.id + ).mapped("reviewer_ids") + # Subscribe reviewers and notify + rec.message_subscribe( + partner_ids=users_to_notify.mapped("partner_id").ids + ) + rec.message_post( + subtype_xmlid=self._get_requested_notification_subtype(), + body=rec._notify_requested_review_body(), + ) + + +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 new file mode 100644 index 0000000000..1a732b3b08 --- /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 Name", + 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/pyproject.toml b/base_tier_validation/pyproject.toml new file mode 100644 index 0000000000..4231d0cccb --- /dev/null +++ b/base_tier_validation/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/base_tier_validation/readme/CONFIGURE.md b/base_tier_validation/readme/CONFIGURE.md new file mode 100644 index 0000000000..4bd817e662 --- /dev/null +++ b/base_tier_validation/readme/CONFIGURE.md @@ -0,0 +1,33 @@ +To configure this module, you need to: + +1. Go to *Settings \> Technical \> Tier Validations \> Tier + Definition*. +2. 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 *Notify reviewers on reaching pending* if you want to send a notification when pending status is reached. + This is usefull in a approve by sequence scenario to only notify reviewers when it is their turn in the sequence. +- 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. Create as many tiers validation exceptions as you want for any model + having tier validation functionality. +3. Add desired fields to be checked in *Fields*. +4. Add desired groups that can use this Exception in *Groups*. +5. 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.md b/base_tier_validation/readme/CONTRIBUTORS.md new file mode 100644 index 0000000000..2e42939529 --- /dev/null +++ b/base_tier_validation/readme/CONTRIBUTORS.md @@ -0,0 +1,16 @@ +- Lois Rilo \<\> +- Naglis Jonaitis \<\> +- Adrià Gil Sorribes \<\> +- Pimolnat Suntian \<\> +- Pedro Gonzalez \<\> +- Kitti U. \<\> +- Saran Lim. \<\> +- Carlos Lopez \<\> +- Javier Colmeiro \<\> +- bosd +- Evan Soh \<\> +- Manuel Regidor \<\> +- Eduardo de Miguel \<\> +- [XCG Consulting](https://xcg-consulting.fr): + - Houzéfa Abbasbhay +- Stefan Rijnhart \<\> diff --git a/base_tier_validation/readme/DESCRIPTION.md b/base_tier_validation/readme/DESCRIPTION.md new file mode 100644 index 0000000000..6f5bd94502 --- /dev/null +++ b/base_tier_validation/readme/DESCRIPTION.md @@ -0,0 +1,19 @@ +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](https://github.com/OCA/purchase-workflow) +as an example of implementation. + +Additionally, if your state field is a (stored) computed field, you need to +set `_tier_validation_state_field_is_computed` to `True` in your model Python +file, and you will want to add the dependent fields of the compute method +in `_get_after_validation_exceptions` and `_get_under_validation_exceptions`. diff --git a/base_tier_validation/readme/HISTORY.md b/base_tier_validation/readme/HISTORY.md new file mode 100644 index 0000000000..3d438da687 --- /dev/null +++ b/base_tier_validation/readme/HISTORY.md @@ -0,0 +1,85 @@ +## 17.0.1.0.0 (2024-01-10) + +Migrated to Odoo 17. +Merged module with tier_validation_waiting. +To support sending messages in a validation sequence when it is their turn to validate. + +## 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.md b/base_tier_validation/readme/ROADMAP.md new file mode 100644 index 0000000000..40f705c03e --- /dev/null +++ b/base_tier_validation/readme/ROADMAP.md @@ -0,0 +1,22 @@ +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 0000000000..3d283364e9 --- /dev/null +++ b/base_tier_validation/security/ir.model.access.csv @@ -0,0 +1,11 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_tier_review_group_public,access_tier_review_group_public,model_tier_review,base.group_public,1,0,0,0 +access_tier_definition_group_public,access_tier_definition_group_public,model_tier_definition,base.group_public,1,0,0,0 +access_tier_review_group_portal,access_tier_review_group_portal,model_tier_review,base.group_portal,1,0,0,0 +access_tier_definition_group_portal,access_tier_definition_group_portal,model_tier_definition,base.group_portal,1,0,0,0 +access_tier_review,access.tier.review,model_tier_review,base.group_user,1,1,1,1 +access_tier_definition_all,tier.definition.all,model_tier_definition,base.group_user,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,base.group_user,1,1,1,1 +access_tier_validation_exceptions_all,tier.validation.exceptions,model_tier_validation_exception,base.group_user,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 0000000000..2ad71f5749 --- /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 0000000000..3a0328b516 Binary files /dev/null and b/base_tier_validation/static/description/icon.png differ diff --git a/base_tier_validation/static/description/index.html b/base_tier_validation/static/description/index.html new file mode 100644 index 0000000000..e62bfc3e8c --- /dev/null +++ b/base_tier_validation/static/description/index.html @@ -0,0 +1,643 @@ + + + + + +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.

+

Additionally, if your state field is a (stored) computed field, you need +to set _tier_validation_state_field_is_computed to True in your +model Python file, and you will want to add the dependent fields of the +compute method in _get_after_validation_exceptions and +_get_under_validation_exceptions.

+

Table of contents

+ +
+

Configuration

+

To configure this module, 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 Notify reviewers on reaching pending if you want to send a +notification when pending status is reached. This is usefull in a +approve by sequence scenario to only notify reviewers when it is their +turn in the sequence.
  • +
  • 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

+
+

17.0.1.0.0 (2024-01-10)

+

Migrated to Odoo 17. Merged module with tier_validation_waiting. To +support sending messages in a validation sequence when it is their turn +to validate.

+
+
+

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/components/tier_review_menu/tier_review_menu.esm.js b/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.esm.js new file mode 100644 index 0000000000..5869e55172 --- /dev/null +++ b/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.esm.js @@ -0,0 +1,73 @@ +/* @odoo-module */ + +import {Component, useState} from "@odoo/owl"; +import {Dropdown} from "@web/core/dropdown/dropdown"; +import {DropdownItem} from "@web/core/dropdown/dropdown_item"; +import {registry} from "@web/core/registry"; +import {useDiscussSystray} from "@mail/utils/common/hooks"; +import {useService} from "@web/core/utils/hooks"; + +const systrayRegistry = registry.category("systray"); + +export class TierReviewMenu extends Component { + setup() { + this.discussSystray = useDiscussSystray(); + this.orm = useService("orm"); + this.store = useState(useService("mail.store")); + this.action = useService("action"); + this.fetchSystrayReviewer(); + } + async fetchSystrayReviewer() { + const groups = await this.orm.call("res.users", "review_user_count"); + let total = 0; + for (const group of groups) { + total += group.pending_count || 0; + } + this.store.tierReviewCounter = total; + this.store.tierReviewGroups = groups; + } + onBeforeOpen() { + this.fetchSystrayReviewer(); + } + availableViews() { + return [ + [false, "kanban"], + [false, "list"], + [false, "form"], + [false, "activity"], + ]; + } + openReviewGroup(group) { + document.body.click(); + // Hack to close dropdown + const context = {}; + var domain = [["can_review", "=", true]]; + if (group.active_field) { + domain.push(["active", "in", [true, false]]); + } + const views = this.availableViews(); + + this.action.doAction( + { + context, + domain, + name: group.name, + res_model: group.model, + search_view_id: [false], + type: "ir.actions.act_window", + views, + }, + { + clearBreadcrumbs: true, + } + ); + } +} + +TierReviewMenu.template = "base_tier_validation.TierReviewMenu"; +TierReviewMenu.components = {Dropdown, DropdownItem}; +TierReviewMenu.props = []; + +export const systrayItem = {Component: TierReviewMenu}; + +systrayRegistry.add("base_tier_validation.ReviewerMenu", systrayItem, {sequence: 99}); diff --git a/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml b/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml new file mode 100644 index 0000000000..77e256c0c2 --- /dev/null +++ b/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml @@ -0,0 +1,70 @@ + + + + + + + + + + +
+
+ No reviews to do. +
+
+ +
+ Activity +
+
+
+ + Pending + +
+
+
+ +
+
+ + + + + diff --git a/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.esm.js b/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.esm.js new file mode 100644 index 0000000000..953ebd76c3 --- /dev/null +++ b/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.esm.js @@ -0,0 +1,40 @@ +/** @odoo-module **/ + +import {registry} from "@web/core/registry"; + +import {useService} from "@web/core/utils/hooks"; + +const {Component} = owl; + +export class ReviewsTable extends Component { + setup() { + 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"; + +export const reviewsTableComponent = { + component: ReviewsTable, +}; + +registry.category("fields").add("form.tier_validation", reviewsTableComponent); diff --git a/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.scss b/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.scss new file mode 100644 index 0000000000..4342206dce --- /dev/null +++ b/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.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/components/tier_review_widget/tier_review_widget.xml b/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml new file mode 100644 index 0000000000..5195bce81f --- /dev/null +++ b/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml @@ -0,0 +1,124 @@ + + + +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SequenceRequested byDescriptionStatusTodo byDone byValidation DateComment
+ + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
diff --git a/base_tier_validation/static/src/js/services/tier_review_service.esm.js b/base_tier_validation/static/src/js/services/tier_review_service.esm.js new file mode 100644 index 0000000000..41b2708aea --- /dev/null +++ b/base_tier_validation/static/src/js/services/tier_review_service.esm.js @@ -0,0 +1,34 @@ +/** @odoo-module **/ + +import {registry} from "@web/core/registry"; + +export class TierReviewService { + constructor(env, services) { + this.env = env; + this.store = services["mail.store"]; + this.busService = services.bus_service; + } + setup() { + this.busService.subscribe("base.tier.validation/updated", (payload) => { + if (payload.review_created) { + this.store.tierReviewCounter++; + } + if (payload.review_deleted) { + this.store.tierReviewCounter--; + } + }); + this.busService.start(); + } +} + +export const tierReviewService = { + dependencies: ["bus_service", "mail.store"], + + start(env, services) { + const tier_review_service = new TierReviewService(env, services); + tier_review_service.setup(env, services); + return tier_review_service; + }, +}; + +registry.category("services").add("tierReviewService", tierReviewService); 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 0000000000..3eb98995be --- /dev/null +++ b/base_tier_validation/templates/tier_validation_templates.xml @@ -0,0 +1,105 @@ + + + + + + diff --git a/base_tier_validation/tests/__init__.py b/base_tier_validation/tests/__init__.py new file mode 100644 index 0000000000..c5d19b1934 --- /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 0000000000..0017110976 --- /dev/null +++ b/base_tier_validation/tests/common.py @@ -0,0 +1,167 @@ +# 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, + TierValidationTesterComputed, + ) + + cls.loader.update_registry( + ( + TierValidationTester, + TierValidationTester2, + TierValidationTesterComputed, + TierDefinition, + ) + ) + + cls.test_model = cls.env[TierValidationTester._name] + cls.test_model_2 = cls.env[TierValidationTester2._name] + cls.test_model_computed = cls.env[TierValidationTesterComputed._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")] + ) + cls.tester_model_computed = cls.env["ir.model"].search( + [("model", "=", "tier.validation.tester.computed")] + ) + + models = ( + cls.tester_model, + cls.tester_model_2, + cls.tester_model_computed, + ) + for model in models: + # Access record: + cls.env["ir.model.access"].create( + { + "name": f"access {model.name}", + "model_id": model.id, + "perm_read": 1, + "perm_write": 1, + "perm_create": 1, + "perm_unlink": 1, + } + ) + + # Define views to avoid automatic views with all fields. + cls.env["ir.ui.view"].create( + { + "model": model.model, + "name": f"Demo view for {model}", + "arch": """
+
+
+ + + +
""", + } + ) + + # 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": 1.0}) + cls.test_record_2 = cls.test_model_2.create({"test_field": 1.0}) + cls.test_record_computed = cls.test_model_computed.create({"test_field": 1.0}) + + 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', '>', 3.0)]", + "approve_sequence": True, + "notify_on_pending": False, + "sequence": 20, + "name": "Definition for test 19 - sequence - user 1", + } + ) + cls.tier_def_obj.create( + { + "model_id": cls.tester_model.id, + "review_type": "individual", + "reviewer_id": cls.test_user_2.id, + "definition_domain": "[('test_field', '>', 3.0)]", + "approve_sequence": True, + "notify_on_pending": True, + "sequence": 10, + "name": "Definition for test 19 - sequence - user 2", + } + ) + # Create definition for test 20 + 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', '=', 0.9)]", + "approve_sequence": False, + "notify_on_pending": True, + "sequence": 10, + "name": "Definition for test 20 - no sequence - user 1 - no sequence", + } + ) + + cls.tier_def_obj.create( + { + "model_id": cls.tester_model_computed.id, + "review_type": "individual", + "reviewer_id": cls.test_user_1.id, + "definition_domain": "[]", + "approve_sequence": True, + "notify_on_pending": False, + "sequence": 20, + "name": "Definition for computed model", + } + ) + + @classmethod + def tearDownClass(cls): + cls.loader.restore_registry() + return super().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 0000000000..03b3090879 --- /dev/null +++ b/base_tier_validation/tests/test_tier_validation.py @@ -0,0 +1,1024 @@ +# Copyright 2018-19 ForgeFlow S.L. (https://www.forgeflow.com) +# Copyright (c) 2022 brain-tec AG (https://braintec.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 import Form +from odoo.tests.common import tagged + +from ..models.tier_validation import BASE_EXCEPTION_FIELDS as BEF +from ..models.tier_validation import 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() + record.invalidate_recordset() + 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() + review.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.filtered("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() + review.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.filtered("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( + 2, len(record1.review_ids.filtered(lambda x: x.status == "waiting")) + ) + self.assertEqual( + 0, len(record1.review_ids.filtered(lambda x: x.status == "pending")) + ) + record1.validate_tier() + self.assertEqual( + 0, len(record1.review_ids.filtered(lambda x: x.status == "waiting")) + ) + self.assertEqual( + 1, len(record1.review_ids.filtered(lambda x: x.status == "pending")) + ) + record1.validate_tier() + self.assertEqual( + 0, len(record1.review_ids.filtered(lambda x: x.status == "waiting")) + ) + record1.validate_tier() + self.assertEqual( + 0, len(record1.review_ids.filtered(lambda x: x.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( + 2, len(record1.review_ids.filtered(lambda x: x.status == "waiting")) + ) + self.assertEqual( + 0, len(record1.review_ids.filtered(lambda x: x.status == "pending")) + ) + record1.validate_tier() + self.assertEqual( + 0, len(record1.review_ids.filtered(lambda x: x.status == "pending")) + ) + self.assertEqual( + 0, len(record1.review_ids.filtered(lambda x: x.status == "waiting")) + ) + + 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.env.invalidate_all() + 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)) + # test notification message bodies + self.assertIn("created", self.test_record._notify_created_review_body()) + 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_record3 = self.test_model.create({"test_field": 1.0}) + # 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_record3.with_user(self.test_user_2).request_validation() + record1 = test_record3.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) + review = self.test_record.with_user(self.test_user_2.id).request_validation() + self.assertTrue(review) + self.test_record.with_user(self.test_user_1.id).request_validation() + + 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_waiting_tier(self): + # Create new test record + tier_review_obj = self.env["tier.review"] + test_record = self.test_model.create({"test_field": 3.5}) + # Request validation + review = test_record.request_validation() + + self.assertTrue(review) + # both reviews should be waiting when created + review_1 = tier_review_obj.browse(review.ids[0]) + review_2 = tier_review_obj.browse(review.ids[1]) + self.assertTrue(review_1.status == "waiting") + self.assertTrue(review_2.status == "waiting") + # and then normal workflow will follow... + review_1.invalidate_model() + review_1._compute_can_review() + self.assertTrue(review_1.status == "pending") + # first reviewer does not want notifications + # chatter should be empty + self.assertFalse(test_record.message_ids) + self.assertTrue(review_1.done_by.id is False) + self.assertTrue(review_1.reviewed_date is False) + self.assertTrue(review_2.status == "waiting") + self.assertTrue(review_2.done_by.id is False) + self.assertTrue(review_2.reviewed_date is False) + record = test_record.with_user(self.test_user_1.id) + record.invalidate_model() + record.validate_tier() + self.assertTrue(review_1.status == "approved") + self.assertFalse(review_1.reviewed_date is False) + self.assertTrue(review_1.done_by.id == self.test_user_1.id) + self.assertTrue(review_2.status == "pending") + self.assertTrue(review_2.done_by.id is False) + self.assertTrue(review_2.reviewed_date is False) + + def test_20_no_sequence(self): + # Create new test record + tier_review_obj = self.env["tier.review"] + test_record2 = self.test_model.create({"test_field": 0.9}) + # request validation + review = test_record2.request_validation() + self.assertTrue(review) + review_1 = tier_review_obj.browse(review.ids[0]) + self.assertTrue(review_1.status == "waiting") + review_1.invalidate_model() + review_1._compute_can_review() + self.assertTrue(review_1.status == "pending") + msg2 = test_record2.message_ids[0].body + request = test_record2._notify_requested_review_body() + self.assertIn(request, msg2) + + def test_21_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": 1}) + 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": 1}) + 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_22_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": 1}) + 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": 1}) + 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_23_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": 1}) + 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": 1}) + 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_24_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": 1}) + 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": 1}) + 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_25_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": 1}) + + # 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_26_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": 1}) + + # 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) + + def test_26_computed_state_field(self): + """Test the regular flow on a model where state is a computed field""" + # The record cannot be confirmed without validation + with self.assertRaises(ValidationError): + self.test_record_computed.action_confirm() + self.assertEqual(self.test_record_computed.state, "draft") + # The validation is performed + self.test_record_computed.request_validation() + self.test_record_computed.invalidate_recordset() + self.assertEqual(self.test_record_computed.review_ids.status, "waiting") + self.test_record_computed.with_user(self.test_user_1).validate_tier() + self.test_record_computed.invalidate_recordset() + self.assertEqual(self.test_record_computed.review_ids.status, "approved") + # After validation, the record can be confirmed + self.test_record_computed.action_confirm() + self.test_record_computed.flush_recordset() + self.assertEqual(self.test_record_computed.state, "confirmed") + # After cancelling, the reviews are removed + self.test_record_computed.action_cancel() + self.assertFalse(self.test_record_computed.review_ids) + self.test_record_computed.invalidate_recordset() + + +@tagged("at_install") +class TierTierValidationView(CommonTierValidation): + def test_view_manual(self): + view = self.env[self.test_record._name].get_view(False, "form") + with Form(self.test_record) as f: + self.assertNotIn("review_ids", f._values) + form = etree.fromstring(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): + view = self.env[self.test_record_2._name].get_view(False, "form") + with Form(self.test_record_2) as f: + self.assertIn("review_ids", f._values) + form = etree.fromstring(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']")) + + def test_get_view(self): + view = self.test_record_2.get_view() + model = "tier.validation.tester2" + self.assertEqual(view["model"], model) + self.assertEqual(view["models"].keys(), {model, "tier.review"}) + self.assertIn("id", view["models"][model]) + self.assertIn("need_validation", view["models"][model]) + self.assertIn("next_review", view["models"][model]) + self.assertIn("review_ids", view["models"][model]) 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 0000000000..2d08309a0a --- /dev/null +++ b/base_tier_validation/tests/tier_validation_tester.py @@ -0,0 +1,117 @@ +# 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 +from odoo.exceptions import ValidationError + + +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 TierValidationTesterComputed(models.Model): + _name = "tier.validation.tester.computed" + _description = "Tier Validation Tester Computed" + _inherit = ["tier.validation"] + _tier_validation_manual_config = False + _tier_validation_state_field_is_computed = True + + confirmed = fields.Boolean() + cancelled = fields.Boolean() + state = fields.Selection( + selection=[ + ("draft", "Draft"), + ("confirmed", "Confirmed"), + ("cancel", "Cancel"), + ], + compute="_compute_state", + store=True, + ) + test_field = fields.Float() + test_validation_field = fields.Float() + user_id = fields.Many2one(string="Assigned to:", comodel_name="res.users") + + @api.model + def _get_after_validation_exceptions(self): + return super()._get_after_validation_exceptions() + [ + "confirmed", + "cancelled", + ] + + @api.model + def _get_under_validation_exceptions(self): + return super()._get_under_validation_exceptions() + [ + "confirmed", + "cancelled", + ] + + @api.depends("confirmed", "cancelled") + def _compute_state(self): + for rec in self: + if rec.cancelled: + rec.state = "cancel" + elif rec.confirmed: + rec.state = "confirmed" + else: + rec.state = "draft" + + def action_confirm(self): + if self.need_validation: + raise ValidationError(_("This action needs to be validated")) + self.write({"confirmed": True}) + + def action_cancel(self): + self.review_ids.unlink() + self.write({"cancelled": True}) + + +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") + res.append("tier.validation.tester.computed") + 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 0000000000..0c3cbd92f1 --- /dev/null +++ b/base_tier_validation/views/res_config_settings_views.xml @@ -0,0 +1,54 @@ + + + + + + res.config.settings.view.form.budget + res.config.settings + + + + +
+ + + +
+ Option to use python formula to get reviewers and find documents +
+
+ + + +
+
+
+
+
+
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 0000000000..e4f8d74670 --- /dev/null +++ b/base_tier_validation/views/tier_definition_view.xml @@ -0,0 +1,173 @@ + + + + + tier.definition.tree + tier.definition + + + + + + + + + + + + + + + + + + + tier.definition.form + tier.definition + +
+ +
+ +
+ Name +

+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + tier.definition.search + tier.definition + + + + + + + + + + + + + + + + + Tier Definition + ir.actions.act_window + tier.definition + list,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 0000000000..3795080432 --- /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 0000000000..5b53538fff --- /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 + list,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 0000000000..92bd0df50b --- /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 0000000000..5c5a6c933d --- /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 0000000000..70c1a9285a --- /dev/null +++ b/base_tier_validation/wizard/comment_wizard_view.xml @@ -0,0 +1,26 @@ + + + + + Comment Wizard + comment.wizard + form + +
+ + + + +
+
+
+
diff --git a/test-requirements.txt b/test-requirements.txt new file mode 100644 index 0000000000..3eb9f01471 --- /dev/null +++ b/test-requirements.txt @@ -0,0 +1 @@ +odoo-test-helper==2.1.1