diff --git a/base_tier_validation/README.rst b/base_tier_validation/README.rst new file mode 100644 index 000000000..19d329e2d --- /dev/null +++ b/base_tier_validation/README.rst @@ -0,0 +1,355 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + +==================== +Base Tier Validation +==================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:547701e5e0d2b1fc25c2f5410d9841b577003e28491c083f6342d6d5c8f35a82 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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/license-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Ftier--validation-lightgray.png?logo=github + :target: https://github.com/OCA/tier-validation/tree/20.0/base_tier_validation + :alt: OCA/tier-validation +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/tier-validation-20-0/tier-validation-20-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/tier-validation&target_branch=20.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. + +Changelog +========= + +19.0.1.0.4 (2026-05-13) +----------------------- + +UI improvement: + +- The "needs to be validated" banner shown above tier-validated + documents now surfaces *who* is expected to act, when known. Reads + "Pending validation by John" or "Pending validation by Group + Accountants" instead of the generic "This Record needs to be + validated", with a fallback to the model-name phrasing for the + defensive edge case where no review has reached ``pending`` yet. + Reuses ``tier.review.todo_by`` so every review type (individual user, + group, ``res.users`` / ``res.groups`` field) is handled uniformly. The + banner template now reads from the long-standing + ``to_validate_message`` Html field, which was previously defined on + the model but never rendered. + +19.0.1.0.3 (2026-05-13) +----------------------- + +Improvements: + +- ``notify_on_pending`` chatter body now names the assignee(s) so the + recipient can tell at a glance that the message is for them. Reuses + ``tier.review.todo_by`` so every review type (individual user, group, + ``res.users`` / ``res.groups`` field) is handled uniformly. +- ``notify_on_pending`` chatter body now attributes the request to + ``review.requested_by`` (the user who actually pressed *Request + Validation*) instead of ``env.user``. On second-and-later tier + promotions ``env.user`` is the previous-tier approver, which was the + wrong person to credit. + +19.0.1.0.1 (2026-05-12) +----------------------- + +Fixes: + +- Restore auto-promotion of the lowest-sequence review to ``pending`` + immediately after ``request_validation`` so the workflow can move + forward without an external trigger. The 19.0 migration had moved this + side-effect out of ``_compute_can_review`` into a separate + ``_update_review_status`` that was only invoked when the requester was + themself the first reviewer or when ``notify_on_create`` was set, + leaving reviews stuck in ``waiting`` in every other case. +- Coerce ``next_review`` to ``False`` when no review is pending, so the + "needs to be validated" banner no longer leaks the empty + ``tier.review()`` recordset repr into its ``Char`` field. +- Fix ``_notify_review_available`` so the reviewer reached by + ``notify_on_pending`` is actually delivered the message. The + tier-validation subtypes have ``default=False`` so a plain + ``message_subscribe(partner_ids=...)`` left the reviewer subscribed + only to default subtypes; ``message_post`` with the + ``mt_tier_validation_requested`` subtype then routed to nobody. Pass + ``subtype_ids`` explicitly (mirroring ``_notify_review_requested``). + +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 +- Kevin Khao +- Do Anh Duy +- Panithan k. + +Other credits +------------- + + + +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/tier-validation `_ 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 000000000..93aa2c1f8 --- /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 000000000..f32fcfeda --- /dev/null +++ b/base_tier_validation/__manifest__.py @@ -0,0 +1,36 @@ +# 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": "20.0.1.0.0", + "development_status": "Mature", + "maintainers": ["LoisRForgeFlow"], + "category": "Tools", + "website": "https://github.com/OCA/tier-validation", + "author": "ForgeFlow, Odoo Community Association (OCA)", + "license": "AGPL-3", + "application": False, + "installable": True, + "depends": ["mail"], + "data": [ + # Security + "security/ir.access.csv", + # Data + "data/cron_data.xml", + "data/mail_data.xml", + # Views + "views/tier_definition_view.xml", + "views/tier_review_view.xml", + "views/tier_validation_exception_view.xml", + # Wizards + "wizard/comment_wizard_view.xml", + # Templates + "templates/tier_validation_templates.xml", + ], + "assets": { + "web.assets_backend": [ + "base_tier_validation/static/src/components/**/*", + ], + }, +} diff --git a/base_tier_validation/data/cron_data.xml b/base_tier_validation/data/cron_data.xml new file mode 100644 index 000000000..0928d7da4 --- /dev/null +++ b/base_tier_validation/data/cron_data.xml @@ -0,0 +1,15 @@ + + + + Send Tier Review Reminder + + days + + + model._cron_send_review_reminder() + code + + diff --git a/base_tier_validation/data/mail_data.xml b/base_tier_validation/data/mail_data.xml new file mode 100644 index 000000000..83c1f88cd --- /dev/null +++ b/base_tier_validation/data/mail_data.xml @@ -0,0 +1,61 @@ + + + + Tier Validation Requested + + + + + + Tier Validation Accepted Notification + + + + + + Tier Validation Rejected Notification + + + + + + Tier Validation Restarted + + + + + + Tier Validation Reminder + + + + + + Tier Validation Reminder + notifications + + 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 000000000..2513e8bf0 --- /dev/null +++ b/base_tier_validation/i18n/base_tier_validation.pot @@ -0,0 +1,943 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_tier_validation +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 19.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "%(icon)s Pending validation by %(todo_by)s" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "%(icon)s This %(model_name)s needs to be 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 +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_review.py:0 +msgid "A review has been requested %s days ago." +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +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 +msgid "A review was accepted" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was accepted. (%s)" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +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 +msgid "A review was rejected by %s." +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +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 +#: 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,field_description:base_tier_validation.field_tier_definition__allow_write_for_reviewer +msgid "Allow Write For Reviewers" +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__comment_approve_default +msgid "Approve Comment" +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 +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:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__cancel +#: 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 +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_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,help:base_tier_validation.field_tier_definition__comment_approve_default +msgid "Default comment prefilled when approval comments are enabled." +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 +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_res_users__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__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 +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 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__exclude_requester +msgid "Four-eyes Principle" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Group %s" +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_res_users__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__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_tier_review__last_reminder_date +msgid "Last Reminder Date" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid +#: 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_review__name +#: 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 +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 +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 +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:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "" +"Number of days after which a message must be posted to remind about pending " +"validation (0 = no reminder)" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "" +"Once created, you can decide which fields you want to be editable when the " +"record:" +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__account_move__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__pending +#: 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 +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.selection,name:base_tier_validation.selection__account_move__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__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 +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 +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__review_ids +msgid "Review" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "Review pending for %(assignees)s, requested by %(requester)s." +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 +#. odoo-python +#: code:addons/base_tier_validation/models/tier_definition.py:0 +msgid "Reviewer may lack access" +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 +msgid "Reviews" +msgstr "" + +#. module: base_tier_validation +#: model:ir.actions.server,name:base_tier_validation.ir_cron_auto_tier_validation_ir_actions_server +msgid "Send Tier Review Reminder" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "Send reminder message on pending reviews" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__sequence +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 +msgid "Status" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_definition.py:0 +msgid "" +"The following reviewer(s) may not be able to read '%(model)s' records and so cannot act on the reviews this tier will create: %(reviewers)s.\n" +"\n" +"This is a best-effort check against model-level access rights only -- record rules may still grant or revoke access at runtime. Make sure these users belong to a group with read access on the target model, or pick different reviewers." +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "The review has been reset by %s." +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"This action needs to be validated for at least one record. Reviews pending:\n" +" - %s \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,name:base_tier_validation.model_tier_review +msgid "Tier Review" +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.activity.type,name:base_tier_validation.mail_act_tier_validation_reminder +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_reminder +msgid "Tier Validation Reminder" +msgstr "" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested +msgid "Tier Validation Requested" +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 +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.selection,name:base_tier_validation.selection__account_move__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__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 +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 +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Validation reviewer field should be of the appropriate type" +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__account_move__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__waiting +#: 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,help:base_tier_validation.field_tier_definition__exclude_requester +msgid "" +"When set, the user who requested the validation is removed from this tier's " +"reviewer pool. Anyone else in the configured group can validate -- except " +"the requester themselves. Without this flag, a requester who happens to be " +"in the same group as the configured reviewers can auto-validate their own " +"request. Only meaningful for review_type='group'; the form hides this field " +"for the other review types." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__account_move__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__no +#: 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 +msgid "" +"You are not allowed to write those fields after validation.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields_str)s" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"You are not allowed to write those fields under validation.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields_str)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 "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "the assigned reviewer" +msgstr "" diff --git a/base_tier_validation/i18n/de.po b/base_tier_validation/i18n/de.po new file mode 100644 index 000000000..323100ed8 --- /dev/null +++ b/base_tier_validation/i18n/de.po @@ -0,0 +1,1022 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_tier_validation +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2026-09-18 08:07+0000\n" +"Last-Translator: Florian Gruber \n" +"Language-Team: none\n" +"Language: de\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.15.2\n" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "%(icon)s Pending validation by %(todo_by)s" +msgstr "%(icon)s Warten auf Überprüfung durch %(todo_by)s" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "%(icon)s This %(model_name)s needs to be validated" +msgstr "%(icon)s Dieses %(model_name)s muss validiert werden" + +#. 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" +" Der Vorgang wurde\n" +" abgelehnt\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" +" Der Vorgang wurde\n" +" bestätigt\n" +" !" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Name" +msgstr "Name" + +#. 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 "" +"Überspringen, wenn die vorherige Stufe vom selben Genehmiger bestätigt " +"wurde" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A record to be reviewed has been created by %s." +msgstr "" +"Es wurde ein Datensatz von %s erstellt, welcher eine Überprüfung benötigt." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "A review has been requested %s days ago." +msgstr "Vor %s Tagen wurde eine Überprüfung angefordert." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review has been requested by %s." +msgstr "Eine Überprüfung wurde von %s angefragt." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was accepted" +msgstr "Eine Überprüfung wurde akzeptiert" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was accepted. (%s)" +msgstr "Eine Überprüfung wurde akzeptiert. (%s)" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was rejected by %(user)s. (%(comment)s)" +msgstr "Eine Überprüfung wurde von %(user)s abgelehnt. (%(comment)s)" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was rejected by %s." +msgstr "Eine Überprüfung wurde von %s abgelehnt." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A validation process is still open for at least one record." +msgstr "Für mindestens einen Datensatz läuft noch ein Validierungsprozess." + +#. 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 +#: 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,field_description:base_tier_validation.field_tier_definition__allow_write_for_reviewer +msgid "Allow Write For Reviewers" +msgstr "Schreibrechte für Genehmiger gewähren" + +#. 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 "Gruppen, die diese Ausnahme bei der Stufenvalidierung nutzen dürfen" + +#. 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 "Jeder Benutzer einer bestimmten Gruppe" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Apply On" +msgstr "Anwenden auf" + +#. 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 "Genehmigungsanordnung nach der angegebenen Sequenznummer" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__comment_approve_default +msgid "Approve Comment" +msgstr "Kommentar genehmigen" + +#. 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 "Überspringen von Sequenzen erlauben" + +#. 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 "Nach Reihenfolge genehmigen" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__approved +msgid "Approved" +msgstr "Genehmigt" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Archived" +msgstr "Archiviert" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation_exception.py:0 +msgid "" +"At least one of these fields must be checked! Write under Validation, Write " +"after Validation" +msgstr "" +"Mindestens eines dieser Felder muss angekreuzt werden! Vor der Validierung " +"schreiben, nach der Validierung schreiben" + +#. 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 "" +"Übersprungen (automatisch validiert), wenn die vorherige Stufe vom selben " +"Genehmiger bestätigt wurde" + +#. 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 "kann prüfen" + +#. 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 "" +"\"Überprüfung möglich\" wird angezeigt, wenn die Überprüfung noch aussteht " +"und die\n" +" Genehmigungssequenz abgeschlossen ist" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__cancel +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +msgid "Cancel" +msgstr "Abbrechen" + +#. 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 +msgid "Comment" +msgstr "Kommentar" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_comment_wizard +msgid "Comment Wizard" +msgstr "Kommentar-Assistent" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__comment +msgid "Comments" +msgstr "Kommentare" + +#. 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 "Unternehmen" + +#. 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 "Erstellen Sie eine neue Validierungsausnahme!" + +#. 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 "Erstellt von" + +#. 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 "Erstellt am" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__comment_approve_default +msgid "Default comment prefilled when approval comments are enabled." +msgstr "" +"Standardkommentar, der automatisch ausgefüllt wird, wenn Genehmigungs-" +"Kommentare aktiviert sind." + +#. 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 "Definitionsbereich" + +#. 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 +msgid "Description" +msgstr "Beschreibung" + +#. 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_res_users__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__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__display_name +msgid "Display Name" +msgstr "Anzeigename" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_status +msgid "Display Status" +msgstr "Anzeigestatus" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__definition_type__domain +msgid "Domain" +msgstr "Bereich" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__done_by +msgid "Done By" +msgstr "Erledigt von" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +msgid "Done by" +msgstr "Erledigt von" + +#. 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 "Feld im zugehörigen Datensatz" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__field_ids +msgid "Fields" +msgstr "Felder" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__exclude_requester +msgid "Four-eyes Principle" +msgstr "Vier Augen Prinzip" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Group %s" +msgstr "Gruppe %s" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__group_ids +msgid "Groups" +msgstr "Gruppen" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__has_comment +msgid "Has Comment" +msgstr "hat einen Kommentar" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__hide_reviews +msgid "Hide Reviews" +msgstr "Überprüfungen ausblenden" + +#. 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_res_users__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__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 "" +"Wenn diese Option aktiviert ist, kann der Genehmiger einen Kommentar zur " +"Prüfung hinterlassen." + +#. 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 "" +"Wenn diese Option aktiviert ist, werden alle möglichen Genehmiger per E-Mail " +"benachrichtigt, sobald diese Option ausgelöst wird." + +#. 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 "" +"Wenn diese Option aktiviert ist, werden alle möglichen Genehmiger per E-Mail " +"benachrichtigt, sobald dieser Status erreicht ist. Dies ist nützlich in " +"einem Szenario mit einer „Genehmigung durch“-Abfolge. Eine Benachrichtigung " +"mit der Aufforderung zur Überprüfung wird versendet, sobald die jeweilige " +"Person an der Reihe ist, die Überprüfung durchzuführen." + +#. 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 "" +"Wenn diese Option aktiviert ist, werden die Genehmiger per E-Mail " +"benachrichtigt, sobald eine Überprüfung zu dieser Option angenommen wurde." + +#. 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 "" +"Wenn diese Option aktiviert ist, werden die Genehmiger per E-Mail " +"benachrichtigt, sobald eine zu dieser Option gehörende Überprüfung abgelehnt " +"wurde." + +#. 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 "" +"Wenn diese Option aktiviert ist, werden die Genehmiger per E-Mail " +"benachrichtigt, sobald eine mit dieser Option verbundene Prüfung wieder " +"aufgenommen wurde." + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "It's fully validated" +msgstr "Es ist vollständig genehmigt" + +#. 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 "Es befindet sich im Validierungsprozess" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__last_reminder_date +msgid "Last Reminder Date" +msgstr "Letztes Erinnerungsdatum" + +#. 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 "Zuletzt geändert von" + +#. 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 "Zuletzt geändert am" + +#. 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 "Modellname" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "More Options" +msgstr "Weitere Optionen" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__name +msgid "Name" +msgstr "Name" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__need_validation +msgid "Need Validation" +msgstr "Genehmigung erforderlich" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_definition.py:0 +msgid "New Tier Validation" +msgstr "Neue Genehmigungsstufe" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__next_review +msgid "Next Review" +msgstr "Nächste Überprüfung" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "Next: %s" +msgstr "Weiter: %s" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +msgid "No reviews to do." +msgstr "Keine Überprüfungen zu erledigen." + +#. 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 "Genehmiger bei Annahme benachrichtigen" + +#. 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 "Genehmiger bei der Erstellung benachrichtigen" + +#. 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 "Genehmiger bei der Ablehnung benachrichtigen" + +#. 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 "Genehmiger bei Neustart benachrichtigen" + +#. 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 "Genehmiger bei Status \"Ausstehend\" benachrichtigen" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "" +"Number of days after which a message must be posted to remind about pending " +"validation (0 = no reminder)" +msgstr "" +"Anzahl der Tage, nach deren Ablauf eine Nachricht gesendet werden muss, um " +"an die ausstehende Validierung zu erinnern (0 = keine Erinnerung)" + +#. 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 "" +"Nach der Erstellung können Sie festlegen, welche Felder bei folgenden " +"Vorgängen bearbeitbar sein sollen:" + +#. 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__account_move__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__pending +#: 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 +msgid "Pending" +msgstr "Ausstehend" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model_id +msgid "Referenced Model" +msgstr "Referenziertes Modell" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Reject" +msgstr "Ablehnen" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__account_move__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__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 "Abgelehnt" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__rejected_message +msgid "Rejected Message" +msgstr "Abgelehnte Nachricht" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__res_id +msgid "Related Document ID" +msgstr "ID des zugehörigen Dokuments" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__model +msgid "Related Document Model" +msgstr "Zugehöriges Dokumentmodell" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Request Validation" +msgstr "Genehmigung anfragen" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__requested_by +msgid "Requested By" +msgstr "Angefragt von" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +msgid "Requested by" +msgstr "Angefragt von" + +#. 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 "Genehmigung neu starten" + +#. 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,field_description:base_tier_validation.field_comment_wizard__review_ids +msgid "Review" +msgstr "Überprüfung" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "Review pending for %(assignees)s, requested by %(requester)s." +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 "Prüfer" + +#. 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 "Prüfer Feld" + +#. 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 "Prüfer-Gruppe" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_definition.py:0 +msgid "Reviewer may lack access" +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 "Prüfer" + +#. 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 +msgid "Reviews" +msgstr "Prüfungen" + +#. module: base_tier_validation +#: model:ir.actions.server,name:base_tier_validation.ir_cron_auto_tier_validation_ir_actions_server +msgid "Send Tier Review Reminder" +msgstr "Erinnerung zur Überprüfung der Stufe senden" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "Send reminder message on pending reviews" +msgstr "Erinnerungsnachricht zu ausstehenden Überprüfungen senden" + +#. 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 +msgid "Sequence" +msgstr "Sequenz" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__individual +msgid "Specific user" +msgstr "Bestimmter Benutzer" + +#. 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 +msgid "Status" +msgstr "Status" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_definition.py:0 +msgid "" +"The following reviewer(s) may not be able to read '%(model)s' records and so " +"cannot act on the reviews this tier will create: %(reviewers)s.\n" +"\n" +"This is a best-effort check against model-level access rights only -- record " +"rules may still grant or revoke access at runtime. Make sure these users " +"belong to a group with read access on the target model, or pick different " +"reviewers." +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "The review has been reset by %s." +msgstr "Die Prüfung wurde von %s zurückgesetzt." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"This action needs to be validated for at least one record. Reviews pending:\n" +" - %s \n" +"Please request a validation." +msgstr "" +"Diese Aktion muss für mindestens einen Datensatz genehmigt werden. " +"Überprüfungen stehen noch aus:\n" +" - %s \n" +"Bitte beantragen Sie eine Genehmigung." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence +msgid "Tier" +msgstr "Stufe" + +#. 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 "Genehmigungsstufen" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_review +msgid "Tier Review" +msgstr "Stufenübersicht" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation +msgid "Tier Validation (abstract)" +msgstr "Genehmigungen (Abstrakt)" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_accepted +msgid "Tier Validation Accepted Notification" +msgstr "Benachrichtigung über erfolgreiche Genehmigung" + +#. 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 "Genehmigungsausnahme" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation_exception +msgid "Tier Validation Exceptions" +msgstr "Genehmigungsausnahmen" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_rejected +msgid "Tier Validation Rejected Notification" +msgstr "Benachrichtigung über die Ablehnung der Überprüfung" + +#. module: base_tier_validation +#: model:mail.activity.type,name:base_tier_validation.mail_act_tier_validation_reminder +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_reminder +msgid "Tier Validation Reminder" +msgstr "Erinnerung an Überprüfung" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested +msgid "Tier Validation Requested" +msgstr "Überprüfung angefragt" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_restarted +msgid "Tier Validation Restarted" +msgstr "Überprüfung erneut gestartet" + +#. module: base_tier_validation +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_confirmation +msgid "Tier Validations" +msgstr "Genehmigungen" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__to_validate_message +msgid "To Validate Message" +msgstr "Genehmigungsnachricht" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__todo_by +msgid "Todo By" +msgstr "Zu erledigende Aufgaben von" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +msgid "Todo by" +msgstr "Zu erledigende Aufgaben von" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_users +msgid "User" +msgstr "Benutzer" + +#. 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 "Gültiges Modellfeld" + +#. 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 "Erlaubte Genehmiger" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Validate" +msgstr "Validieren" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__validate_reject +msgid "Validate Reject" +msgstr "Ablehnung bestätigen" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__account_move__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__validated +msgid "Validated" +msgstr "Validiert" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validated_message +msgid "Validated Message" +msgstr "Validierte Nachricht" + +#. 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 "Geprüft von" + +#. 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 +msgid "Validation Date" +msgstr "Prüfdatum" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewed_formated_date +msgid "Validation Formated Date" +msgstr "Überprüfung des Datumsformats" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validation_status +msgid "Validation Status" +msgstr "Genehmigungsstatus" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Validation reviewer field should be of the appropriate type" +msgstr "Das Feld \"Validierungsprüfer\" sollte den entsprechenden Typ haben" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__review_ids +msgid "Validations" +msgstr "Genehmigungen" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__account_move__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__waiting +#: 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 "Warten" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__exclude_requester +msgid "" +"When set, the user who requested the validation is removed from this tier's " +"reviewer pool. Anyone else in the configured group can validate -- except " +"the requester themselves. Without this flag, a requester who happens to be " +"in the same group as the configured reviewers can auto-validate their own " +"request. Only meaningful for review_type='group'; the form hides this field " +"for the other review types." +msgstr "" +"Wenn diese Option gesetzt ist, wird der Benutzer, der die Validierung " +"angefordert hat, aus dem Prüferpool dieser Ebene entfernt. Jeder andere in " +"der konfigurierten Gruppe kann die Validierung vornehmen -- mit Ausnahme des " +"Anforderers selbst. Ohne diese Option kann ein Anforderer, der zufällig " +"derselben Gruppe angehört wie die konfigurierten Prüfer, seine eigene " +"Anfrage automatisch validieren. Dies ist nur bei review_type='group'; von " +"Bedeutung. Bei den anderen Überprüfungstypen wird dieses Feld im Formular " +"ausgeblendet." + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__account_move__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__no +msgid "Without validation" +msgstr "Ohne Genehmigung" + +#. 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 "Nach der Validierung schreiben" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Write after validation" +msgstr "Nach der Validierung schreiben" + +#. 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 "Unter Validierung schreiben" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Write under validation" +msgstr "Unter Validierung schreiben" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"You are not allowed to write those fields after validation.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields_str)s" +msgstr "" +"Nach der Validierung dürfen Sie diese Felder nicht mehr bearbeiten.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Nur diese Felder können geändert werden:\n" +"- %(allowed_fields_str)s" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"You are not allowed to write those fields under validation.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields_str)s" +msgstr "" +"Während der Validierung dürfen diese Felder nicht bearbeitet werden.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Nur diese Felder können bearbeitet werden:\n" +"- %(allowed_fields_str)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 "z.B. Genehmigungsstufen für..." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "the assigned reviewer" +msgstr "" + +#~ msgid "" +#~ "\n" +#~ " This Record needs to be\n" +#~ " validated." +#~ msgstr "" +#~ "\n" +#~ " Dieser Datensatz benötigt\n" +#~ " eine Bestätigung." diff --git a/base_tier_validation/i18n/es.po b/base_tier_validation/i18n/es.po new file mode 100644 index 000000000..18884dea2 --- /dev/null +++ b/base_tier_validation/i18n/es.po @@ -0,0 +1,1103 @@ +# 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: 2026-03-25 13:45+0000\n" +"Last-Translator: David Vidal \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 5.15.2\n" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "%(icon)s Pending validation by %(todo_by)s" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "%(icon)s This %(model_name)s needs to be 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 "" +"\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 +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_review.py:0 +msgid "A review has been requested %s days ago." +msgstr "Se solicitó una revisión hace %s días." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +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 +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 +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 +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 +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 +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 +#: 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,field_description:base_tier_validation.field_tier_definition__allow_write_for_reviewer +msgid "Allow Write For Reviewers" +msgstr "Permitir editar a revisores" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_validation_exception__group_ids +msgid "Allowed groups to use this Tier Validation Exception" +msgstr "Grupos permitidos para utilizar esta excepción de validación de nivel" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__group +msgid "Any user in a specific group" +msgstr "Cualquier usuario de un grupo específico" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Apply On" +msgstr "Aplicar en" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__approve_sequence +msgid "Approval order by the specified sequence number" +msgstr "Orden de aprobación por el número de secuencia especificado" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__comment_approve_default +msgid "Approve Comment" +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 "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 +msgid "" +"At least one of these fields must be checked! Write under Validation, Write " +"after Validation" +msgstr "" +"¡Al menos uno de estos campos debe ser comprobado! Escribir en validación, " +"Escribir tras validación" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence_bypass +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__approve_sequence_bypass +msgid "" +"Bypassed (auto validated), if previous tier was validated by same reviewer" +msgstr "" +"Omitido (validado automático), si el mismo revisor validó el nivel anterior" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__can_review +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__can_review +msgid "Can Review" +msgstr "Puede revisar" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__can_review +msgid "" +"Can review will be marked if the review is pending and the\n" +" approve sequence has been achieved" +msgstr "" +"Puede revisar será establecido si la revisión está pendiente y la\n" +" secuencia de aprobación se ha alcanzado" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__cancel +#: 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 +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_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "Create a new Validation Exception!" +msgstr "¡Crear una nueva excepción de validación!" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__create_date +msgid "Created on" +msgstr "Creado en" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__comment_approve_default +msgid "Default comment prefilled when approval comments are enabled." +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 "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 +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_res_users__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__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 +msgid "Done by" +msgstr "Hecho Por" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__field +msgid "Field in related record" +msgstr "Campo en el registro relacionado" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__field_ids +msgid "Fields" +msgstr "Campos" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__exclude_requester +msgid "Four-eyes Principle" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Group %s" +msgstr "Grupo %s" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__group_ids +msgid "Groups" +msgstr "Grupos" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__has_comment +msgid "Has Comment" +msgstr "Ha comentado" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_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_res_users__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__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 "Está totalmente validado" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "It's in the validation process" +msgstr "Está en proceso de validación" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__last_reminder_date +msgid "Last Reminder Date" +msgstr "Última fecha de recordatorio" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid +#: 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 "Nombre de modelo" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "More Options" +msgstr "Más opciones" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__name +msgid "Name" +msgstr "Nombre" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__need_validation +msgid "Need Validation" +msgstr "Necesita validación" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_definition.py:0 +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 +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 +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:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "" +"Number of days after which a message must be posted to remind about pending " +"validation (0 = no reminder)" +msgstr "" +"Número de días tras los cuales se debe enviar un mensaje recordando la " +"validación pendiente (0 = sin recordatorio)" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "" +"Once created, you can decide which fields you want to be editable when the " +"record:" +msgstr "" +"Una vez creado, puedes decidir qué campos quieres que sean editables cuando " +"el registro:" + +#. 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__account_move__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__pending +#: 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 +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.selection,name:base_tier_validation.selection__account_move__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__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 +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 +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__review_ids +msgid "Review" +msgstr "Revisor" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "Review pending for %(assignees)s, requested by %(requester)s." +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 "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 +#. odoo-python +#: code:addons/base_tier_validation/models/tier_definition.py:0 +msgid "Reviewer may lack access" +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 "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 +msgid "Reviews" +msgstr "Revisiones" + +#. module: base_tier_validation +#: model:ir.actions.server,name:base_tier_validation.ir_cron_auto_tier_validation_ir_actions_server +msgid "Send Tier Review Reminder" +msgstr "Enviar recordatorio de validación de nivel" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "Send reminder message on pending reviews" +msgstr "Enviar mensaje recordando las revisiones pendientes" + +#. 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 +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 +msgid "Status" +msgstr "Estado" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_definition.py:0 +msgid "" +"The following reviewer(s) may not be able to read '%(model)s' records and so " +"cannot act on the reviews this tier will create: %(reviewers)s.\n" +"\n" +"This is a best-effort check against model-level access rights only -- record " +"rules may still grant or revoke access at runtime. Make sure these users " +"belong to a group with read access on the target model, or pick different " +"reviewers." +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +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_validation.py:0 +msgid "" +"This action needs to be validated for at least one record. Reviews pending:\n" +" - %s \n" +"Please request a validation." +msgstr "" +"Esta acción necesita ser validada para al menos un registro. Revisiones " +"pendientes:\n" +" - %s \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,name:base_tier_validation.model_tier_review +msgid "Tier Review" +msgstr "Revisión de Nivel" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation +msgid "Tier Validation (abstract)" +msgstr "Validaciones de Nivel (abstracto)" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_accepted +msgid "Tier Validation Accepted Notification" +msgstr "Notificación de Validación de Nivel Aceptada" + +#. module: base_tier_validation +#: model:ir.actions.act_window,name:base_tier_validation.tier_validation_exception_action +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_validation_exception +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_form +msgid "Tier Validation Exception" +msgstr "Excepción de validación de nivel" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation_exception +msgid "Tier Validation Exceptions" +msgstr "Excepciones de validación de nivel" + +#. 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.activity.type,name:base_tier_validation.mail_act_tier_validation_reminder +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_reminder +msgid "Tier Validation Reminder" +msgstr "Recordatorio 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 "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 +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 "Campo de modelo válido" + +#. 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.selection,name:base_tier_validation.selection__account_move__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__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 +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 +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Validation reviewer field should be of the appropriate type" +msgstr "El campo de revisor de la validación debe ser del tipo apropiado" + +#. 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__account_move__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__waiting +#: 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,help:base_tier_validation.field_tier_definition__exclude_requester +msgid "" +"When set, the user who requested the validation is removed from this tier's " +"reviewer pool. Anyone else in the configured group can validate -- except " +"the requester themselves. Without this flag, a requester who happens to be " +"in the same group as the configured reviewers can auto-validate their own " +"request. Only meaningful for review_type='group'; the form hides this field " +"for the other review types." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__account_move__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__no +#: 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 "Editar tras la validación" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Write after validation" +msgstr "Editar tras la validación" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_under_validation +msgid "Write under Validation" +msgstr "Editar al validar" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Write under validation" +msgstr "Editar al validar" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"You are not allowed to write those fields after validation.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields_str)s" +msgstr "" +"No está permitido que edites esos campos tras la validación.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Solo estos campos pueden ser modificados:\n" +"- %(allowed_fields_str)s" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"You are not allowed to write those fields under validation.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields_str)s" +msgstr "" +"No puedes editar estos campos durante la validación.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Solo estos campos pueden ser modificados:\n" +"- %(allowed_fields_str)s" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "e.g. Tier Validation for..." +msgstr "ej. Validación de Nivel por..." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "the assigned reviewer" +msgstr "" + +#~ msgid "" +#~ "\n" +#~ " This Record needs to be\n" +#~ " validated." +#~ msgstr "" +#~ "\n" +#~ " Este registro debe ser\n" +#~ " validado." + +#~ msgid "Config Settings" +#~ msgstr "Configuración de Ajustes" + +#~ msgid "Group By" +#~ msgstr "Agrupar por" + +#~ 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" + +#~ msgid "Tier Formula" +#~ msgstr "Fórmula de niveles" + +#~ msgid "Tier Validation" +#~ msgstr "Validación por niveles" + +#~ msgid "There are no res.users in the selected field" +#~ msgstr "No hay res.usuarios en el campo seleccionado" + +#, python-format +#~ msgid "Activity" +#~ msgstr "Actividades" + +#, python-format +#~ msgid "Operation has been rejected." +#~ msgstr "La operación ha sido rechazada." + +#, python-format +#~ msgid "Operation has been validated!" +#~ msgstr "¡La operación ha sido validada!" + +#, python-format +#~ msgid "This %s needs to be validated" +#~ msgstr "Este %s necesita ser validado" + +#, 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." + +#, 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 000000000..d6bc3ad59 --- /dev/null +++ b/base_tier_validation/i18n/es_MX.po @@ -0,0 +1,1021 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_tier_validation +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 14.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2021-08-16 22:50+0000\n" +"Last-Translator: Jesús Alan Ramos Rodríguez \n" +"Language-Team: none\n" +"Language: es_MX\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 4.3.2\n" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "%(icon)s Pending validation by %(todo_by)s" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "%(icon)s This %(model_name)s needs to be 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 +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_review.py:0 +msgid "A review has been requested %s days ago." +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +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 +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 +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 +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 +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 +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 +#: 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,field_description:base_tier_validation.field_tier_definition__allow_write_for_reviewer +msgid "Allow Write For Reviewers" +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 "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__comment_approve_default +msgid "Approve Comment" +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 "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 +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:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__cancel +#: 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 +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_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,help:base_tier_validation.field_tier_definition__comment_approve_default +msgid "Default comment prefilled when approval comments are enabled." +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 "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 +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_res_users__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__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 +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 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__exclude_requester +msgid "Four-eyes Principle" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Group %s" +msgstr "Grupo %s" + +#. 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_res_users__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__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_tier_review__last_reminder_date +msgid "Last Reminder Date" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid +#: 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_review__name +#: 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 +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 +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 +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:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "" +"Number of days after which a message must be posted to remind about pending " +"validation (0 = no reminder)" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "" +"Once created, you can decide which fields you want to be editable when the " +"record:" +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__account_move__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__pending +#: 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 +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.selection,name:base_tier_validation.selection__account_move__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__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 +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 +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__review_ids +msgid "Review" +msgstr "Revisión" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "Review pending for %(assignees)s, requested by %(requester)s." +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 "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 +#. odoo-python +#: code:addons/base_tier_validation/models/tier_definition.py:0 +msgid "Reviewer may lack access" +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 "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 +msgid "Reviews" +msgstr "Comentarios" + +#. module: base_tier_validation +#: model:ir.actions.server,name:base_tier_validation.ir_cron_auto_tier_validation_ir_actions_server +msgid "Send Tier Review Reminder" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "Send reminder message on pending reviews" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__sequence +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 +msgid "Status" +msgstr "Estatus" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_definition.py:0 +msgid "" +"The following reviewer(s) may not be able to read '%(model)s' records and so " +"cannot act on the reviews this tier will create: %(reviewers)s.\n" +"\n" +"This is a best-effort check against model-level access rights only -- record " +"rules may still grant or revoke access at runtime. Make sure these users " +"belong to a group with read access on the target model, or pick different " +"reviewers." +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +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_validation.py:0 +msgid "" +"This action needs to be validated for at least one record. Reviews pending:\n" +" - %s \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 "Definición de Nivel" + +#. 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: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.activity.type,name:base_tier_validation.mail_act_tier_validation_reminder +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_reminder +msgid "Tier Validation Reminder" +msgstr "" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested +msgid "Tier Validation Requested" +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 +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.selection,name:base_tier_validation.selection__account_move__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__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 +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 +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Validation reviewer field should be of the appropriate type" +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__account_move__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__waiting +#: 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,help:base_tier_validation.field_tier_definition__exclude_requester +msgid "" +"When set, the user who requested the validation is removed from this tier's " +"reviewer pool. Anyone else in the configured group can validate -- except " +"the requester themselves. Without this flag, a requester who happens to be " +"in the same group as the configured reviewers can auto-validate their own " +"request. Only meaningful for review_type='group'; the form hides this field " +"for the other review types." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__account_move__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__no +#: 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 +msgid "" +"You are not allowed to write those fields after validation.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields_str)s" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"You are not allowed to write those fields under validation.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields_str)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 ..." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "the assigned reviewer" +msgstr "" + +#~ msgid "Group By" +#~ msgstr "Agrupar por" + +#~ msgid "There are no res.users in the selected field" +#~ msgstr "No hay res.users en el campo seleccionado" + +#, 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." + +#, 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 000000000..5de5d7fea --- /dev/null +++ b/base_tier_validation/i18n/fr.po @@ -0,0 +1,1116 @@ +# 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: 2026-06-16 14:14+0000\n" +"Last-Translator: Vincent Hatakeyama \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 5.15.2\n" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "%(icon)s Pending validation by %(todo_by)s" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "%(icon)s This %(model_name)s needs to be 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 "" +"\n" +" L'opération a été\n" +" rejetée\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’opération a été\n" +" validée\n" +" !" + +#. 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 "" +"Sauter l’étape si le même approbateur a validé le niveau précédent" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A record to be reviewed has been created by %s." +msgstr "Un document en attente d'approbation a été créé par %s." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "A review has been requested %s days ago." +msgstr "Une validation a été demandée il y a %s jours." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +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 +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 +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 +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 +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 +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 +#: 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,field_description:base_tier_validation.field_tier_definition__allow_write_for_reviewer +msgid "Allow Write For Reviewers" +msgstr "Autoriser l'écriture pour les approbateurs" + +#. 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 "Groupes autorisés à utiliser l'exception à l’approbation par niveau" + +#. 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__comment_approve_default +msgid "Approve Comment" +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 "Contournement de la séquence d’approbation" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__approve_sequence +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__approve_sequence +msgid "Approve by sequence" +msgstr "Approuver dans l'ordre" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__approved +msgid "Approved" +msgstr "Approuvé" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Archived" +msgstr "Archivé" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation_exception.py:0 +msgid "" +"At least one of these fields must be checked! Write under Validation, Write " +"after Validation" +msgstr "" +"Au moins un de ces champs doit être vérifié ! Modification sous Validation, " +"Modification après validation" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence_bypass +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__approve_sequence_bypass +msgid "" +"Bypassed (auto validated), if previous tier was validated by same reviewer" +msgstr "" +"Sauté (approuvé automatiquement), si le niveau précédent a été approuvé par " +"le même approbateur" + +#. 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:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__cancel +#: 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 +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_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "Create a new Validation Exception!" +msgstr "Créer une nouvelle exception de validation !" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__create_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__create_uid +msgid "Created by" +msgstr "Créé par" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__create_date +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__create_date +msgid "Created on" +msgstr "Créé le" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__comment_approve_default +msgid "Default comment prefilled when approval comments are enabled." +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 "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 +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_res_users__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__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 "État affiché" + +#. 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 +msgid "Done by" +msgstr "Fait par" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__field +msgid "Field in related record" +msgstr "Champ dans l'enregistrement rattaché" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__field_ids +msgid "Fields" +msgstr "Champs" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__exclude_requester +msgid "Four-eyes Principle" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Group %s" +msgstr "Groupe %s" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__group_ids +msgid "Groups" +msgstr "Groupes" + +#. 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 "Cacher les Approbations" + +#. 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_res_users__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__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 défini, autoriser l’approbateur à laisser un commentaire sur la revue." + +#. 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 approbateurs autorisés seront notifiés par " +"courriel 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 "" +"Si défini, tous les approbateurs seront notifiés par courriel lorsque ce " +"statut est atteint. Utile dans un scénario d'approbation par séquence. Une " +"notification de requête à approuver est envoyé lorsque c'est leur tour " +"d'approuver." + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_accepted +msgid "" +"If set, reviewers will be notified by email when a review related to this " +"definition is accepted." +msgstr "" +"Si défini, les approbateurs seront notifiés par courriel lorsqu’une revue " +"liée à cette définition est acceptée." + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_rejected +msgid "" +"If set, reviewers will be notified by email when a review related to this " +"definition is rejected." +msgstr "" +"Si défini, les approbateurs seront notifiés par courriel lorsqu'une revue " +"liée à cette définition est rejetée." + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_restarted +msgid "" +"If set, reviewers will be notified by email when a reviews related to this " +"definition are restarted." +msgstr "" +"Si défini, les approbateurs seront notifiés par courriel lorsque des revues " +"liées à cette définition sont remises à zéro." + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "It's fully validated" +msgstr "C'est validé complétement" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "It's in the validation process" +msgstr "En cours de validation" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__last_reminder_date +msgid "Last Reminder Date" +msgstr "Date de dernier rappel" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid +#: 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 "Nom du modèle" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "More Options" +msgstr "Plus d'options" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__name +msgid "Name" +msgstr "Nom" + +#. 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 +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 +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 +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 "Notifier les approbateurs à l'acceptation" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_create +msgid "Notify Reviewers on Creation" +msgstr "Notifier les approbateurs à la création" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_rejected +msgid "Notify Reviewers on Rejected" +msgstr "Notifier les approbateurs au rejet" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_restarted +msgid "Notify Reviewers on Restarted" +msgstr "Notifier les approbateurs à la remise à zéro" + +#. 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 "Notifier les approbateurs en atteignant l’état « en attente »" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "" +"Number of days after which a message must be posted to remind about pending " +"validation (0 = no reminder)" +msgstr "" +"Nombre de jours pour l'envoi d'un message pour rappeler les validations en " +"attente (0 = pas de rappel)" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "" +"Once created, you can decide which fields you want to be editable when the " +"record:" +msgstr "" +"Une fois créé, vous pouvez décider quels champs vous souhaitez laisser " +"éditables sur l'enregistrement :" + +#. 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__account_move__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__pending +#: 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 +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.selection,name:base_tier_validation.selection__account_move__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__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 +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 +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__review_ids +msgid "Review" +msgstr "Revue" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "Review pending for %(assignees)s, requested by %(requester)s." +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 "Approbateur" + +#. 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 de l’approbateur" + +#. 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 approbateurs" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_definition.py:0 +msgid "Reviewer may lack access" +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 "Approbateurs" + +#. 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 +msgid "Reviews" +msgstr "Revues" + +#. module: base_tier_validation +#: model:ir.actions.server,name:base_tier_validation.ir_cron_auto_tier_validation_ir_actions_server +msgid "Send Tier Review Reminder" +msgstr "Envoyer un rappel de revue de niveau" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "Send reminder message on pending reviews" +msgstr "Envoyer un message de rappel sur les revues en attente" + +#. 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 +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 +msgid "Status" +msgstr "Statut" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_definition.py:0 +msgid "" +"The following reviewer(s) may not be able to read '%(model)s' records and so " +"cannot act on the reviews this tier will create: %(reviewers)s.\n" +"\n" +"This is a best-effort check against model-level access rights only -- record " +"rules may still grant or revoke access at runtime. Make sure these users " +"belong to a group with read access on the target model, or pick different " +"reviewers." +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +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_validation.py:0 +msgid "" +"This action needs to be validated for at least one record. Reviews pending:\n" +" - %s \n" +"Please request a validation." +msgstr "" +"Cette action doit être validée pour au moins un enregistrement. Validations " +"en attente :\n" +" - %s \n" +"Veuillez soumettre une demande de validation." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence +msgid "Tier" +msgstr "Niveau" + +#. 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,name:base_tier_validation.model_tier_review +msgid "Tier Review" +msgstr "Revue d'un 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 "Exception à la validation par niveau" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation_exception +msgid "Tier Validation Exceptions" +msgstr "Exceptions à la validation par niveau" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_rejected +msgid "Tier Validation Rejected Notification" +msgstr "Validation par niveau - Notification - Rejetée" + +#. module: base_tier_validation +#: model:mail.activity.type,name:base_tier_validation.mail_act_tier_validation_reminder +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_reminder +msgid "Tier Validation Reminder" +msgstr "Rappel pour la validation par niveau" + +#. 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 +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 "Champs valides du modèle" + +#. 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 "Champ approbateur valide" + +#. 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.selection,name:base_tier_validation.selection__account_move__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__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 +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 "Statut de Validation" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Validation reviewer field should be of the appropriate type" +msgstr "Le champ de l’approbateur devrait être du type approprié" + +#. 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__account_move__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__waiting +#: 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 "En attente" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__exclude_requester +msgid "" +"When set, the user who requested the validation is removed from this tier's " +"reviewer pool. Anyone else in the configured group can validate -- except " +"the requester themselves. Without this flag, a requester who happens to be " +"in the same group as the configured reviewers can auto-validate their own " +"request. Only meaningful for review_type='group'; the form hides this field " +"for the other review types." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__account_move__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__no +msgid "Without validation" +msgstr "Sans validation" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_after_validation +msgid "Write after Validation" +msgstr "Écrire après validation" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Write after validation" +msgstr "Écrire après validation" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_under_validation +msgid "Write under Validation" +msgstr "Écrire sous validation" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Write under validation" +msgstr "Écrire sous validation" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"You are not allowed to write those fields after validation.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields_str)s" +msgstr "" +"Vous n'êtes pas autorisé à modifier ces champs après validation.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Seuls ces champs peuvent être modifiés :\n" +"- %(allowed_fields_str)s" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"You are not allowed to write those fields under validation.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields_str)s" +msgstr "" +"Vous n'êtes pas autorisé à modifier ces champs durant la validation.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Seuls ces champs peuvent être modifiés :\n" +"- %(allowed_fields_str)s" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "e.g. Tier Validation for..." +msgstr "par exemple : Niveau de validation pour …" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "the assigned reviewer" +msgstr "" + +#~ msgid "" +#~ "\n" +#~ " This Record needs to be\n" +#~ " validated." +#~ msgstr "" +#~ "\n" +#~ " Cet enregistrement doit être\n" +#~ " validé." + +#~ msgid "Config Settings" +#~ msgstr "Paramètres de configuration" + +#~ msgid "Group By" +#~ msgstr "Regrouper par" + +#~ 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" + +#~ msgid "Tier Formula" +#~ msgstr "Formules sur les niveaux" + +#~ msgid "Tier Validation" +#~ msgstr "Validation par niveau" + +#~ msgid "There are no res.users in the selected field" +#~ msgstr "Le champ sélectionné ne référence pas des res.users" + +#, python-format +#~ msgid "Activity" +#~ msgstr "Activité" + +#, python-format +#~ msgid "Operation has been rejected." +#~ msgstr "L'opération a été rejetée." + +#, python-format +#~ msgid "Operation has been validated!" +#~ msgstr "L'opération a été validée !" + +#, python-format +#~ msgid "This %s needs to be validated" +#~ msgstr "%s : Cet enregistrement requiert une validation" + +#, 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." + +#, 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 000000000..422f98f5f --- /dev/null +++ b/base_tier_validation/i18n/it.po @@ -0,0 +1,1156 @@ +# 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: 2026-10-05 10:46+0000\n" +"Last-Translator: mymage \n" +"Language-Team: none\n" +"Language: it\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" +"X-Generator: Weblate 5.15.2\n" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "%(icon)s Pending validation by %(todo_by)s" +msgstr "%(icon)s Validazione in sospeso da %(todo_by)s" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "%(icon)s This %(model_name)s needs to be validated" +msgstr "%(icon)s Questo %(model_name)s deve essere validato" + +#. 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 +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_review.py:0 +msgid "A review has been requested %s days ago." +msgstr "Una revisione è stata richiesta %s giorni fa." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +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 +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 +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 +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 +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 +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 +#: 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,field_description:base_tier_validation.field_tier_definition__allow_write_for_reviewer +msgid "Allow Write For Reviewers" +msgstr "Permetti scrittura ai revisori" + +#. 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__comment_approve_default +msgid "Approve Comment" +msgstr "Commento approvazione" + +#. 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 +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:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__cancel +#: 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 +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_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,help:base_tier_validation.field_tier_definition__comment_approve_default +msgid "Default comment prefilled when approval comments are enabled." +msgstr "Commento predefinito quanto è abilitata l'approvazione dei commenti." + +#. 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 +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_res_users__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__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 +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 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__exclude_requester +msgid "Four-eyes Principle" +msgstr "Principio dei quattro occhi" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Group %s" +msgstr "Gruppo %s" + +#. 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_res_users__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__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 impostata, tutti i possibili revisori saranno avvisati via e-mail quando " +"la definizione è attivata." + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_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_tier_review__last_reminder_date +msgid "Last Reminder Date" +msgstr "Data ultimo promemoria" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid +#: 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_review__name +#: 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 +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 +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 +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:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "" +"Number of days after which a message must be posted to remind about pending " +"validation (0 = no reminder)" +msgstr "" +"Numero di giorni dopo i quali un messaggio deve essere inviato per ricordare " +"della valutazione in attesa (0 = nessun promemoria)" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "" +"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-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__account_move__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__pending +#: 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 +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.selection,name:base_tier_validation.selection__account_move__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__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 +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 +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__review_ids +msgid "Review" +msgstr "Revisione" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "Review pending for %(assignees)s, requested by %(requester)s." +msgstr "Revisione in sospeso per %(assignees)s, richiesta da %(requester)s." + +#. 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 +#. odoo-python +#: code:addons/base_tier_validation/models/tier_definition.py:0 +msgid "Reviewer may lack access" +msgstr "Il revisore potrebbe non avere accesso" + +#. 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 +msgid "Reviews" +msgstr "Revisioni" + +#. module: base_tier_validation +#: model:ir.actions.server,name:base_tier_validation.ir_cron_auto_tier_validation_ir_actions_server +msgid "Send Tier Review Reminder" +msgstr "Invia promemoria revisione livello" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "Send reminder message on pending reviews" +msgstr "Invia messaggio promemoria per le revisioni in attesa" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__sequence +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 +msgid "Status" +msgstr "Stato" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_definition.py:0 +msgid "" +"The following reviewer(s) may not be able to read '%(model)s' records and so " +"cannot act on the reviews this tier will create: %(reviewers)s.\n" +"\n" +"This is a best-effort check against model-level access rights only -- record " +"rules may still grant or revoke access at runtime. Make sure these users " +"belong to a group with read access on the target model, or pick different " +"reviewers." +msgstr "" +"I seguenti revisori potrebbero non essere in grado di leggere i record di '%" +"(model)s' e, di conseguenza, non potranno gestire le revisioni generate da " +"questo livello: %(reviewers)s.\n" +"\n" +"Si tratta di un controllo preliminare basato esclusivamente sui diritti di " +"accesso a livello di modello, le regole sui record potrebbero comunque " +"concedere o revocare l'accesso in fase di esecuzione. Assicurarsi che questi " +"utenti appartengano a un gruppo con diritti di lettura sul modello di " +"destinazione oppure scegliere revisori diversi." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +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_validation.py:0 +msgid "" +"This action needs to be validated for at least one record. Reviews pending:\n" +" - %s \n" +"Please request a validation." +msgstr "" +"Quest'azione deve essere approvata per almeno un record. Approvazioni in " +"sospeso:\n" +" - %s \n" +"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,name:base_tier_validation.model_tier_review +msgid "Tier Review" +msgstr "Revisione 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.activity.type,name:base_tier_validation.mail_act_tier_validation_reminder +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_reminder +msgid "Tier Validation Reminder" +msgstr "Promemoria valutazione livello" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested +msgid "Tier Validation Requested" +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 +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.selection,name:base_tier_validation.selection__account_move__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__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 +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 +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Validation reviewer field should be of the appropriate type" +msgstr "Il campo del revisore di convalida deve essere del tipo appropriato" + +#. 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__account_move__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__waiting +#: 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,help:base_tier_validation.field_tier_definition__exclude_requester +msgid "" +"When set, the user who requested the validation is removed from this tier's " +"reviewer pool. Anyone else in the configured group can validate -- except " +"the requester themselves. Without this flag, a requester who happens to be " +"in the same group as the configured reviewers can auto-validate their own " +"request. Only meaningful for review_type='group'; the form hides this field " +"for the other review types." +msgstr "" +"Quando impostato, l'utente che ha richiesto la convalida viene rimosso dal " +"gruppo di revisori di questo livello. Chiunque altro nel gruppo configurato " +"può convalidare, ad eccezione del richiedente stesso. Senza questo flag, un " +"richiedente che si trova nello stesso gruppo dei revisori configurati può " +"convalidare automaticamente la propria richiesta. Rilevante solo per " +"review_type='group'; il modulo nasconde questo campo per gli altri tipi di " +"revisione." + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__account_move__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__no +#: 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 +msgid "" +"You are not allowed to write those fields after validation.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields_str)s" +msgstr "" +"Non è consentito scrivere quei campi dopo la convalida.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Solo quei campi possono essere modificati:\n" +"- %(allowed_fields_str)s" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"You are not allowed to write those fields under validation.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields_str)s" +msgstr "" +"Non è consentito scrivere quei campi sotto convalida.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Solo quei campi possono essere modificati:\n" +"- %(allowed_fields_str)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 ..." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "the assigned reviewer" +msgstr "il revisore assegnato" + +#~ msgid "" +#~ "\n" +#~ " This Record needs to be\n" +#~ " validated." +#~ msgstr "" +#~ "\n" +#~ " Questo record necessita di\n" +#~ " approvazione." + +#~ msgid "Config Settings" +#~ msgstr "Impostazioni configurazione" + +#~ msgid "Group By" +#~ msgstr "Raggruppa per" + +#~ 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" + +#~ msgid "Tier Formula" +#~ msgstr "Formula livello" + +#~ msgid "Tier Validation" +#~ msgstr "Conferma livello" + +#~ msgid "There are no res.users in the selected field" +#~ msgstr "Non ci sono res.users nel campo selezionato" + +#, python-format +#~ msgid "Activity" +#~ msgstr "Attività" + +#, python-format +#~ msgid "Operation has been rejected." +#~ msgstr "L'operazione è stata rifiutata." + +#, python-format +#~ msgid "Operation has been validated!" +#~ msgstr "L'operazione è stata validata!" + +#, python-format +#~ msgid "This %s needs to be validated" +#~ msgstr "Questo %s deve essere approvato" + +#, 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" + +#, 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" + +#, 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." + +#~ 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/ja.po b/base_tier_validation/i18n/ja.po new file mode 100644 index 000000000..a7832fa45 --- /dev/null +++ b/base_tier_validation/i18n/ja.po @@ -0,0 +1,948 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_tier_validation +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: Automatically generated\n" +"Language-Team: none\n" +"Language: ja\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" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "%(icon)s Pending validation by %(todo_by)s" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "%(icon)s This %(model_name)s needs to be 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 +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_review.py:0 +msgid "A review has been requested %s days ago." +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +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 +msgid "A review was accepted" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was accepted. (%s)" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +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 +msgid "A review was rejected by %s." +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +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 +#: 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,field_description:base_tier_validation.field_tier_definition__allow_write_for_reviewer +msgid "Allow Write For Reviewers" +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__comment_approve_default +msgid "Approve Comment" +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 +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:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__cancel +#: 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 +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_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,help:base_tier_validation.field_tier_definition__comment_approve_default +msgid "Default comment prefilled when approval comments are enabled." +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 +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_res_users__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__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 +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 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__exclude_requester +msgid "Four-eyes Principle" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Group %s" +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_res_users__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__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_tier_review__last_reminder_date +msgid "Last Reminder Date" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid +#: 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_review__name +#: 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 +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 +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 +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:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "" +"Number of days after which a message must be posted to remind about pending " +"validation (0 = no reminder)" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "" +"Once created, you can decide which fields you want to be editable when the " +"record:" +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__account_move__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__pending +#: 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 +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.selection,name:base_tier_validation.selection__account_move__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__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 +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 +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__review_ids +msgid "Review" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "Review pending for %(assignees)s, requested by %(requester)s." +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 +#. odoo-python +#: code:addons/base_tier_validation/models/tier_definition.py:0 +msgid "Reviewer may lack access" +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 +msgid "Reviews" +msgstr "" + +#. module: base_tier_validation +#: model:ir.actions.server,name:base_tier_validation.ir_cron_auto_tier_validation_ir_actions_server +msgid "Send Tier Review Reminder" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "Send reminder message on pending reviews" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__sequence +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 +msgid "Status" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_definition.py:0 +msgid "" +"The following reviewer(s) may not be able to read '%(model)s' records and so " +"cannot act on the reviews this tier will create: %(reviewers)s.\n" +"\n" +"This is a best-effort check against model-level access rights only -- record " +"rules may still grant or revoke access at runtime. Make sure these users " +"belong to a group with read access on the target model, or pick different " +"reviewers." +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "The review has been reset by %s." +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"This action needs to be validated for at least one record. Reviews pending:\n" +" - %s \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,name:base_tier_validation.model_tier_review +msgid "Tier Review" +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.activity.type,name:base_tier_validation.mail_act_tier_validation_reminder +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_reminder +msgid "Tier Validation Reminder" +msgstr "" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested +msgid "Tier Validation Requested" +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 +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.selection,name:base_tier_validation.selection__account_move__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__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 +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 +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Validation reviewer field should be of the appropriate type" +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__account_move__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__waiting +#: 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,help:base_tier_validation.field_tier_definition__exclude_requester +msgid "" +"When set, the user who requested the validation is removed from this tier's " +"reviewer pool. Anyone else in the configured group can validate -- except " +"the requester themselves. Without this flag, a requester who happens to be " +"in the same group as the configured reviewers can auto-validate their own " +"request. Only meaningful for review_type='group'; the form hides this field " +"for the other review types." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__account_move__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__no +#: 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 +msgid "" +"You are not allowed to write those fields after validation.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields_str)s" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"You are not allowed to write those fields under validation.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields_str)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 "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "the assigned reviewer" +msgstr "" diff --git a/base_tier_validation/i18n/nl.po b/base_tier_validation/i18n/nl.po new file mode 100644 index 000000000..e2e1e78c8 --- /dev/null +++ b/base_tier_validation/i18n/nl.po @@ -0,0 +1,1046 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_tier_validation +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2026-10-02 23:46+0000\n" +"Last-Translator: Bosd \n" +"Language-Team: none\n" +"Language: 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 5.15.2\n" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "%(icon)s Pending validation by %(todo_by)s" +msgstr "%(icon)s Wacht op validatie door %(todo_by)s" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "%(icon)s This %(model_name)s needs to be validated" +msgstr "%(icon)s Deze %(model_name)s moet worden gevalideerd" + +#. 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" +" Bewerking is \n" +" geweigerd\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" +" Bewerking 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 indien het vorige niveau door dezelfde beoordelaar is " +"gevalideerd" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A record to be reviewed has been created by %s." +msgstr "Er is een te beoordelen record aangemaakt door %s." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "A review has been requested %s days ago." +msgstr "Een beoordeling is %s dagen geleden aangevraagd." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +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 +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 +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 +msgid "A review was rejected by %(user)s. (%(comment)s)" +msgstr "Een beoordeling is geweigerd door %(user)s. (%(comment)s)" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was rejected by %s." +msgstr "Een beoordeling is geweigerd door %s." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A validation process is still open for at least one record." +msgstr "Er is nog een validatieproces open voor minstens éé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 +#: 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,field_description:base_tier_validation.field_tier_definition__allow_write_for_reviewer +msgid "Allow Write For Reviewers" +msgstr "Schrijven toestaan voor beoordelaars" + +#. 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 "Groepen die deze validatie-uitzondering mogen gebruiken" + +#. 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 volgnummer" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__comment_approve_default +msgid "Approve Comment" +msgstr "Goedkeur Comment" + +#. 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 "Omzeiling goedkeuringsvolgorde" + +#. 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 via 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 +msgid "" +"At least one of these fields must be checked! Write under Validation, Write " +"after Validation" +msgstr "" +"Minstens één van deze velden moet zijn aangevinkt: 'Schrijven tijdens " +"validatie' of 'Schrijven na validatie'" + +#. 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) indien 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 aangevinkt als de beoordeling in afwachting is en de\n" +" volgorde voor goedkeuring is bereikt" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__cancel +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +msgid "Cancel" +msgstr "Annuleren" + +#. 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 +msgid "Comment" +msgstr "Opmerking" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_comment_wizard +msgid "Comment Wizard" +msgstr "Opmerkingen-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_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "Create a new Validation Exception!" +msgstr "Maak een nieuwe validatie-uitzondering aan!" + +#. 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 "Aangemaakt door" + +#. 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 op" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__comment_approve_default +msgid "Default comment prefilled when approval comments are enabled." +msgstr "" +"Standaardopmerking die vooraf wordt ingevuld wanneer opmerkingen bij " +"goedkeuring zijn ingeschakeld." + +#. 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 "Definitie-domein" + +#. 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 +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_res_users__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__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__display_name +msgid "Display Name" +msgstr "Schermnaam" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_status +msgid "Display Status" +msgstr "Status weergeven" + +#. 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 +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 gerelateerd record" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__field_ids +msgid "Fields" +msgstr "Velden" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__exclude_requester +msgid "Four-eyes Principle" +msgstr "Vierogenprincipe" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Group %s" +msgstr "Groep %s" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__group_ids +msgid "Groups" +msgstr "Groepen" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__has_comment +msgid "Has Comment" +msgstr "Heeft opmerking" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__hide_reviews +msgid "Hide Reviews" +msgstr "Beoordelingen verbergen" + +#. 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_res_users__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__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 "" +"Indien ingeschakeld kan de beoordelaar een opmerking achterlaten bij de " +"beoordeling." + +#. 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 ingeschakeld worden alle mogelijke beoordelaars per e-mail " +"geïnformeerd 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 "" +"Indien ingeschakeld worden alle mogelijke beoordelaars per e-mail " +"geïnformeerd zodra deze status is bereikt. Handig bij goedkeuring op " +"volgorde: een verzoek wordt verzonden zodra zij aan de beurt zijn." + +#. 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 "" +"Indien ingeschakeld worden beoordelaars per e-mail geïnformeerd wanneer een " +"beoordeling voor deze definitie is geaccepteerd." + +#. 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 "" +"Indien ingeschakeld worden beoordelaars per e-mail geïnformeerd wanneer een " +"beoordeling voor deze definitie is geweigerd." + +#. 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 "" +"Indien ingeschakeld worden beoordelaars per e-mail geïnformeerd wanneer " +"beoordelingen voor deze definitie opnieuw zijn gestart." + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "It's fully validated" +msgstr "Het is volledig gevalideerd" + +#. 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 "Het validatieproces loopt nog" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__last_reminder_date +msgid "Last Reminder Date" +msgstr "Datum laatste herinnering" + +#. 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 "Modelnaam" + +#. 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_review__name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__name +msgid "Name" +msgstr "Naam" + +#. 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 +msgid "New Tier Validation" +msgstr "Nieuwe niveauvalidatie" + +#. 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 +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 +msgid "No reviews to do." +msgstr "Geen openstaande beoordelingen." + +#. 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 "Beoordelaars informeren bij acceptatie" + +#. 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 "Beoordelaars informeren bij aanmaak" + +#. 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 "Beoordelaars informeren bij weigering" + +#. 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 "Beoordelaars informeren bij herstart" + +#. 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 "Beoordelaars informeren bij status 'In afwachting'" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "" +"Number of days after which a message must be posted to remind about pending " +"validation (0 = no reminder)" +msgstr "" +"Aantal dagen waarna een herinnering wordt gestuurd voor een openstaande " +"validatie (0 = geen herinnering)" + +#. 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 "" +"Na aanmaak kunt u bepalen welke velden bewerkbaar moeten zijn wanneer het " +"record:" + +#. 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__account_move__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__pending +#: 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 +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 "Gerefereerd model" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Reject" +msgstr "Weigeren" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__account_move__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__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 "Geweigerd" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__rejected_message +msgid "Rejected Message" +msgstr "Bericht bij weigering" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__res_id +msgid "Related Document ID" +msgstr "Gerelateerd document-ID" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__model +msgid "Related Document Model" +msgstr "Gerelateerd documentmodel" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Request Validation" +msgstr "Validatie aanvragen" + +#. 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 +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 "Validatie herstarten" + +#. 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,field_description:base_tier_validation.field_comment_wizard__review_ids +msgid "Review" +msgstr "Beoordeling" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "Review pending for %(assignees)s, requested by %(requester)s." +msgstr "" +"Beoordeling in afwachting voor %(assignees)s, aangevraagd door %(requester)s." + +#. 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 "Veld voor beoordelaar" + +#. 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 "Groep voor beoordelaars" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_definition.py:0 +msgid "Reviewer may lack access" +msgstr "De beoordelaar heeft mogelijk geen toegang" + +#. 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 +msgid "Reviews" +msgstr "Beoordelingen" + +#. module: base_tier_validation +#: model:ir.actions.server,name:base_tier_validation.ir_cron_auto_tier_validation_ir_actions_server +msgid "Send Tier Review Reminder" +msgstr "Herinnering niveauvalidatie verzenden" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "Send reminder message on pending reviews" +msgstr "Herinnering sturen voor openstaande 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 +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 +msgid "Status" +msgstr "Status" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_definition.py:0 +msgid "" +"The following reviewer(s) may not be able to read '%(model)s' records and so " +"cannot act on the reviews this tier will create: %(reviewers)s.\n" +"\n" +"This is a best-effort check against model-level access rights only -- record " +"rules may still grant or revoke access at runtime. Make sure these users " +"belong to a group with read access on the target model, or pick different " +"reviewers." +msgstr "" +"De volgende beoordelaars kunnen mogelijk geen records van het type '%" +"(model)s' lezen en kunnen daarom niet werken met de beoordelingen die door " +"dit niveau worden gegenereerd: %(reviewers)s.\n" +"\n" +"Dit is een controle op basis van 'best effort' die uitsluitend kijkt naar " +"toegangsrechten op modelniveau; tijdens de uitvoering (runtime) kunnen " +"recordregels alsnog toegang verlenen of intrekken. Zorg ervoor dat deze " +"gebruikers deel uitmaken van een groep met leesrechten voor het doelmodel, " +"of kies andere beoordelaars." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "The review has been reset by %s." +msgstr "De beoordeling is gereset door %s." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"This action needs to be validated for at least one record. Reviews pending:\n" +" - %s \n" +"Please request a validation." +msgstr "" +"Deze actie moet voor minstens één record worden gevalideerd. Openstaande " +"beoordelingen:\n" +" - %s \n" +"Vraag a.u.b. om een validatie." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence +msgid "Tier" +msgstr "Niveau" + +#. 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 "Niveaudefinitie" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_review +msgid "Tier Review" +msgstr "Niveaubeoordeling" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation +msgid "Tier Validation (abstract)" +msgstr "Niveauvalidatie (abstract)" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_accepted +msgid "Tier Validation Accepted Notification" +msgstr "Notificatie: niveauvalidatie geaccepteerd" + +#. 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 "Uitzondering op niveauvalidatie" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation_exception +msgid "Tier Validation Exceptions" +msgstr "Uitzonderingen op niveauvalidatie" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_rejected +msgid "Tier Validation Rejected Notification" +msgstr "Notificatie: niveauvalidatie geweigerd" + +#. module: base_tier_validation +#: model:mail.activity.type,name:base_tier_validation.mail_act_tier_validation_reminder +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_reminder +msgid "Tier Validation Reminder" +msgstr "Herinnering voor niveauvalidatie" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested +msgid "Tier Validation Requested" +msgstr "Niveauvalidatie aangevraagd" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_restarted +msgid "Tier Validation Restarted" +msgstr "Niveauvalidatie herstart" + +#. module: base_tier_validation +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_confirmation +msgid "Tier Validations" +msgstr "Niveauvalidaties" + +#. 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 voor validatie" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__todo_by +msgid "Todo By" +msgstr "Uit te voeren door" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +msgid "Todo by" +msgstr "Uit te voeren 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 "Geldig modelveld" + +#. 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 "Valideren" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__validate_reject +msgid "Validate Reject" +msgstr "Valideren weigering" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__account_move__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__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 "Bericht na validatie" + +#. 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 +msgid "Validation Date" +msgstr "Validatiedatum" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewed_formated_date +msgid "Validation Formated Date" +msgstr "Geformatteerde validatiedatum" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validation_status +msgid "Validation Status" +msgstr "Validatiestatus" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Validation reviewer field should be of the appropriate type" +msgstr "Het validatieveld voor beoordelaars moet van het juiste type zijn" + +#. 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__account_move__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__waiting +#: 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 "Wachtend" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__exclude_requester +msgid "" +"When set, the user who requested the validation is removed from this tier's " +"reviewer pool. Anyone else in the configured group can validate -- except " +"the requester themselves. Without this flag, a requester who happens to be " +"in the same group as the configured reviewers can auto-validate their own " +"request. Only meaningful for review_type='group'; the form hides this field " +"for the other review types." +msgstr "" +"Indien ingesteld, wordt de gebruiker die de validatie heeft aangevraagd, " +"verwijderd uit de groep beoordelaars voor dit niveau. Iedereen in de " +"geconfigureerde groep kan de validatie uitvoeren, behalve de aanvrager zelf. " +"Zonder deze instelling zou een aanvrager die deel uitmaakt van dezelfde " +"groep als de geconfigureerde beoordelaars, zijn of haar eigen aanvraag " +"automatisch kunnen valideren. Dit is alleen relevant bij " +"`review_type='group'`; voor de andere beoordelingstypen verbergt het " +"formulier dit veld." + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__account_move__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__no +#: 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 "Schrijven na validatie" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Write after validation" +msgstr "Schrijven na validatie" + +#. 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 "Schrijven tijdens validatie" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Write under validation" +msgstr "Schrijven tijdens validatie" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"You are not allowed to write those fields after validation.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields_str)s" +msgstr "" +"U mag deze velden niet bewerken na validatie.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Alleen deze velden mogen worden gewijzigd:\n" +"- %(allowed_fields_str)s" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"You are not allowed to write those fields under validation.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields_str)s" +msgstr "" +"U mag deze velden niet bewerken tijdens de validatie.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Alleen deze velden mogen worden gewijzigd:\n" +"- %(allowed_fields_str)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 "bijv. Niveauvalidatie voor..." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "the assigned reviewer" +msgstr "de toegewezen beoordelaar" + +#~ msgid "" +#~ "\n" +#~ " This Record needs to be\n" +#~ " validated." +#~ msgstr "" +#~ "\n" +#~ " Dit record moet worden\n" +#~ " gevalideerd." + +#~ msgid "Config Settings" +#~ msgstr "Configuratie Instellingen" + +#~ msgid "Group By" +#~ msgstr "Groeperen op" + +#~ 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" + +#~ msgid "Tier Formula" +#~ msgstr "Niveau Formule" + +#~ msgid "Tier Validation" +#~ msgstr "Niveau Validatie" + +#~ msgid "There are no res.users in the selected field" +#~ msgstr "Er zijn geen res.users in het geselecteerde veld" diff --git a/base_tier_validation/i18n/nl_NL.po b/base_tier_validation/i18n/nl_NL.po new file mode 100644 index 000000000..9402e9fe3 --- /dev/null +++ b/base_tier_validation/i18n/nl_NL.po @@ -0,0 +1,1082 @@ +# 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: 2025-02-04 21:02+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 5.6.2\n" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "%(icon)s Pending validation by %(todo_by)s" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "%(icon)s This %(model_name)s needs to be 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 "" +"\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, indien het vorige niveau door dezelfde beoordelaar is " +"gevalideerd" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A record to be reviewed has been created by %s." +msgstr "Een record dat beoordeeld moet worden, is aangemaakt door %s." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "A review has been requested %s days ago." +msgstr "Een beoordeling is %s dagen geleden aangevraagd." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +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 +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 +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 +msgid "A review was rejected by %(user)s. (%(comment)s)" +msgstr "Een beoordeling is afgewezen door %(user)s. (%(comment)s)" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +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 +msgid "A validation process is still open for at least one record." +msgstr "Er is nog 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 +#: 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,field_description:base_tier_validation.field_tier_definition__allow_write_for_reviewer +msgid "Allow Write For Reviewers" +msgstr "Schrijven toestaan voor beoordelaars" + +#. 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 "Toegestane groepen om deze Tier Validatie Uitzondering te gebruiken" + +#. 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__comment_approve_default +msgid "Approve Comment" +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 "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 +msgid "" +"At least one of these fields must be checked! Write under Validation, Write " +"after Validation" +msgstr "" +"Minstens één van deze velden moet aangevinkt zijn! Schrijven tijdens " +"Validatie, Schrijven na Validatie" + +#. 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:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__cancel +#: 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 +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_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "Create a new Validation Exception!" +msgstr "Maak een nieuwe Validatie Uitzondering aan!" + +#. 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,help:base_tier_validation.field_tier_definition__comment_approve_default +msgid "Default comment prefilled when approval comments are enabled." +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 "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 +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_res_users__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__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 "Weergavestatus" + +#. 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 +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 "Velden" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__exclude_requester +msgid "Four-eyes Principle" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Group %s" +msgstr "Groep %s" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__group_ids +msgid "Groups" +msgstr "Groepen" + +#. 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 "Verberg Beoordelingen" + +#. 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_res_users__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__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 "" +"Indien ingesteld, staat de beoordelaar toe een opmerking achter te laten bij " +"de beoordeling." + +#. 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 "" +"Indien ingesteld, worden alle mogelijke beoordelaars per e-mail op de hoogte " +"gebracht wanneer deze status is bereikt. Handig in een 'Goedkeuren op " +"volgorde' scenario. Een verzoek om beoordeling wordt verstuurd wanneer zij " +"aan de beurt zijn om te beoordelen." + +#. 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 "" +"Indien ingesteld, worden beoordelaars per e-mail op de hoogte gebracht " +"wanneer een beoordeling met betrekking tot deze definitie wordt geaccepteerd." + +#. 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 "" +"Indien ingesteld, worden beoordelaars per e-mail op de hoogte gebracht " +"wanneer een beoordeling met betrekking tot deze definitie wordt afgewezen." + +#. 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 "" +"Indien ingesteld, worden beoordelaars per e-mail op de hoogte gebracht " +"wanneer beoordelingen met betrekking tot deze definitie opnieuw worden " +"gestart." + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "It's fully validated" +msgstr "Het is volledig gevalideerd" + +#. 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 "Het bevindt zich in het validatieproces" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__last_reminder_date +msgid "Last Reminder Date" +msgstr "Datum laatste herinnering" + +#. 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 "Model naam" + +#. 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_review__name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__name +msgid "Name" +msgstr "Naam" + +#. 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 +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 +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 +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 "Breng reviewers op de hoogte indien geaccepteerd" + +#. 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 "Waarschuw reviewers bij afwijzing" + +#. 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 "Waarschuw reviewers bij herstart" + +#. 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 "Informeer reviewers over het bereiken van de status In behandeling" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "" +"Number of days after which a message must be posted to remind about pending " +"validation (0 = no reminder)" +msgstr "" +"Aantal dagen waarna een bericht moet worden geplaatst om te herinneren aan " +"de in behandeling zijnde validatie (0 = geen herinnering)" + +#. 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 "" +"Nadat u het record hebt aangemaakt, kunt u bepalen welke velden u bewerkbaar " +"wilt maken wanneer het record:" + +#. 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__account_move__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__pending +#: 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 +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.selection,name:base_tier_validation.selection__account_move__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__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 +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 +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__review_ids +msgid "Review" +msgstr "Beoordeling" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "Review pending for %(assignees)s, requested by %(requester)s." +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 "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 +#. odoo-python +#: code:addons/base_tier_validation/models/tier_definition.py:0 +msgid "Reviewer may lack access" +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 "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 +msgid "Reviews" +msgstr "Beoordelingen" + +#. module: base_tier_validation +#: model:ir.actions.server,name:base_tier_validation.ir_cron_auto_tier_validation_ir_actions_server +msgid "Send Tier Review Reminder" +msgstr "Verzend Tier Beoordeling Herinnering" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "Send reminder message on pending reviews" +msgstr "Stuur herinneringsbericht voor openstaande 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 +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 +msgid "Status" +msgstr "Status" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_definition.py:0 +msgid "" +"The following reviewer(s) may not be able to read '%(model)s' records and so " +"cannot act on the reviews this tier will create: %(reviewers)s.\n" +"\n" +"This is a best-effort check against model-level access rights only -- record " +"rules may still grant or revoke access at runtime. Make sure these users " +"belong to a group with read access on the target model, or pick different " +"reviewers." +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +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_validation.py:0 +msgid "" +"This action needs to be validated for at least one record. Reviews pending:\n" +" - %s \n" +"Please request a validation." +msgstr "" +"Deze actie moet worden gevalideerd voor ten minste één record. Beoordelingen " +"in afwachting:\n" +" - %s \n" +"Vraag alstublieft 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,name:base_tier_validation.model_tier_review +msgid "Tier Review" +msgstr "Tier beoordeling" + +#. 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 "Niveau Validatie Uitzondering" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation_exception +msgid "Tier Validation Exceptions" +msgstr "Niveau Validatie Uitzonderingen" + +#. 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.activity.type,name:base_tier_validation.mail_act_tier_validation_reminder +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_reminder +msgid "Tier Validation Reminder" +msgstr "Niveau Validatie Herinnering" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested +msgid "Tier Validation Requested" +msgstr "Niveau Validatie Aangevraagd" + +#. 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 +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 "Geldig Modelveld" + +#. 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.selection,name:base_tier_validation.selection__account_move__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__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 +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 +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Validation reviewer field should be of the appropriate type" +msgstr "" + +#. 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__account_move__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__waiting +#: 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 "Wachtend" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__exclude_requester +msgid "" +"When set, the user who requested the validation is removed from this tier's " +"reviewer pool. Anyone else in the configured group can validate -- except " +"the requester themselves. Without this flag, a requester who happens to be " +"in the same group as the configured reviewers can auto-validate their own " +"request. Only meaningful for review_type='group'; the form hides this field " +"for the other review types." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__account_move__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__no +#: 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 "Schrijven na Validatie" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Write after validation" +msgstr "Schrijven na validatie" + +#. 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 "Schrijven tijdens Validatie" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Write under validation" +msgstr "Schrijven tijdens validatie" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"You are not allowed to write those fields after validation.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields_str)s" +msgstr "" +"U mag deze velden niet schrijven na validatie.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Alleen deze velden kunnen worden gewijzigd:\n" +"- %(allowed_fields_str)s" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"You are not allowed to write those fields under validation.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields_str)s" +msgstr "" +"U mag deze velden niet schrijven tijdens validatie.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Alleen deze velden kunnen worden gewijzigd:\n" +"- %(allowed_fields_str)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 "bijv. Tier validatie voor..." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "the assigned reviewer" +msgstr "" + +#~ msgid "" +#~ "\n" +#~ " This Record needs to be\n" +#~ " validated." +#~ msgstr "" +#~ "\n" +#~ " Dit Record dient te worden\n" +#~ " beoordeeld." + +#~ msgid "Config Settings" +#~ msgstr "Configuratie Instellingen" + +#~ msgid "Group By" +#~ msgstr "Groeperen op" + +#~ 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" + +#~ msgid "Tier Formula" +#~ msgstr "Niveau Formule" + +#~ msgid "Tier Validation" +#~ msgstr "Niveauvalidatie" + +#~ msgid "There are no res.users in the selected field" +#~ msgstr "Er zijn geen res.users in het geselecteerde veld" + +#, python-format +#~ msgid "Activity" +#~ msgstr "Activiteit" + +#, python-format +#~ msgid "Operation has been rejected." +#~ msgstr "Operatie is afgewezen." + +#, python-format +#~ msgid "Operation has been validated!" +#~ msgstr "Operation has been Goedgekeurd!" + +#, python-format +#~ msgid "This %s needs to be validated" +#~ msgstr "Dit %s dient te worden beoordeeld" + +#, 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." + +#, 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 000000000..c680f4be8 --- /dev/null +++ b/base_tier_validation/i18n/sv.po @@ -0,0 +1,1104 @@ +# 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 +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "%(icon)s Pending validation by %(todo_by)s" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "%(icon)s This %(model_name)s needs to be 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 "" +"\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 +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_review.py:0 +msgid "A review has been requested %s days ago." +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +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 +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 +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 +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 +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 +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 +#: 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,field_description:base_tier_validation.field_tier_definition__allow_write_for_reviewer +msgid "Allow Write For Reviewers" +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 "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__comment_approve_default +msgid "Approve Comment" +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 "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 +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:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__cancel +#: 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 +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_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,help:base_tier_validation.field_tier_definition__comment_approve_default +msgid "Default comment prefilled when approval comments are enabled." +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 "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 +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_res_users__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__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 +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 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__exclude_requester +msgid "Four-eyes Principle" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Group %s" +msgstr "Grupp %s" + +#. 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_res_users__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__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_tier_review__last_reminder_date +msgid "Last Reminder Date" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid +#: 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_review__name +#: 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 +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 +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 +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:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "" +"Number of days after which a message must be posted to remind about pending " +"validation (0 = no reminder)" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "" +"Once created, you can decide which fields you want to be editable when the " +"record:" +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__account_move__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__pending +#: 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 +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.selection,name:base_tier_validation.selection__account_move__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__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 +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 +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__review_ids +msgid "Review" +msgstr "Granska" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "Review pending for %(assignees)s, requested by %(requester)s." +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 "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 +#. odoo-python +#: code:addons/base_tier_validation/models/tier_definition.py:0 +msgid "Reviewer may lack access" +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 "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 +msgid "Reviews" +msgstr "Granskningar" + +#. module: base_tier_validation +#: model:ir.actions.server,name:base_tier_validation.ir_cron_auto_tier_validation_ir_actions_server +msgid "Send Tier Review Reminder" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "Send reminder message on pending reviews" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__sequence +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 +msgid "Status" +msgstr "Status" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_definition.py:0 +msgid "" +"The following reviewer(s) may not be able to read '%(model)s' records and so " +"cannot act on the reviews this tier will create: %(reviewers)s.\n" +"\n" +"This is a best-effort check against model-level access rights only -- record " +"rules may still grant or revoke access at runtime. Make sure these users " +"belong to a group with read access on the target model, or pick different " +"reviewers." +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +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_validation.py:0 +msgid "" +"This action needs to be validated for at least one record. Reviews pending:\n" +" - %s \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 "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,name:base_tier_validation.model_tier_review +msgid "Tier Review" +msgstr "Attestgranskning" + +#. 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.activity.type,name:base_tier_validation.mail_act_tier_validation_reminder +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_reminder +msgid "Tier Validation Reminder" +msgstr "" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested +msgid "Tier Validation Requested" +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 +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.selection,name:base_tier_validation.selection__account_move__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__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 +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 +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Validation reviewer field should be of the appropriate type" +msgstr "" + +#. 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__account_move__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__waiting +#: 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,help:base_tier_validation.field_tier_definition__exclude_requester +msgid "" +"When set, the user who requested the validation is removed from this tier's " +"reviewer pool. Anyone else in the configured group can validate -- except " +"the requester themselves. Without this flag, a requester who happens to be " +"in the same group as the configured reviewers can auto-validate their own " +"request. Only meaningful for review_type='group'; the form hides this field " +"for the other review types." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__account_move__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__no +#: 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 +msgid "" +"You are not allowed to write those fields after validation.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields_str)s" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"You are not allowed to write those fields under validation.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields_str)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..." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "the assigned reviewer" +msgstr "" + +#~ msgid "" +#~ "\n" +#~ " This Record needs to be\n" +#~ " validated." +#~ msgstr "" +#~ "\n" +#~ " Denna post behöver\n" +#~ " bekräftas." + +#~ msgid "Config Settings" +#~ msgstr "Konfigurationsinställningar" + +#~ msgid "Group By" +#~ msgstr "Gruppera efter" + +#~ 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" + +#~ msgid "Tier Formula" +#~ msgstr "Attestformel" + +#~ msgid "Tier Validation" +#~ msgstr "Attestering" + +#~ msgid "There are no res.users in the selected field" +#~ msgstr "Det finns inga res.users i det valda fältet" + +#, python-format +#~ msgid "Activity" +#~ msgstr "Aktivitet" + +#, python-format +#~ msgid "Operation has been rejected." +#~ msgstr "Operationen har avslagits." + +#, python-format +#~ msgid "Operation has been validated!" +#~ msgstr "Operationen har validerats!" + +#, python-format +#~ msgid "This %s needs to be validated" +#~ msgstr "Denna %s måste bekräftas" + +#, 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." + +#, 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 000000000..ff30797ae --- /dev/null +++ b/base_tier_validation/i18n/tr.po @@ -0,0 +1,1088 @@ +# 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: 2025-10-30 17:00+0000\n" +"Last-Translator: Betül Öğmen \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 5.10.4\n" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "%(icon)s Pending validation by %(todo_by)s" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "%(icon)s This %(model_name)s needs to be 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 "" +"\n" +" İşlem reddedildi\n" +" \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" +" İşlem Onaylandı\n" +" \n" +" !" + +#. 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 "" +"Önceki aşama aynı inceleyen tarafından doğrulandıysa atlandı" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A record to be reviewed has been created by %s." +msgstr "Gözden geçirilmesi gereken bir kayıt %s tarafından oluşturuldu." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "A review has been requested %s days ago." +msgstr "%s tarafından bir inceleme istendi." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +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 +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 +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 +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 +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 +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 +#: 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,field_description:base_tier_validation.field_tier_definition__allow_write_for_reviewer +msgid "Allow Write For Reviewers" +msgstr "İnceleyenler için yazmaya izin ver" + +#. 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 "Grupların bu Katman Doğrulama İstisnasını kullanmasına izin verildi" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__group +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__comment_approve_default +msgid "Approve Comment" +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 "Dizi Atlamasını Onayla" + +#. 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 "Arşivlendi" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation_exception.py:0 +msgid "" +"At least one of these fields must be checked! Write under Validation, Write " +"after Validation" +msgstr "" +"Bu alanlardan en az birinin işaretlenmesi gerekmektedir! Doğrulama Altında " +"Yaz, Doğrulama Sonrası Yaz\"" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence_bypass +#: 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 "" +"Önceki aşama aynı inceleyici tarafından doğrulandıysa atlandı (otomatik " +"olarak doğrulandı)" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__can_review +#: 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:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__cancel +#: 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 +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_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "Create a new Validation Exception!" +msgstr "Yeni bir Doğrulama İstisnası oluştur!" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__create_uid +#: 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,help:base_tier_validation.field_tier_definition__comment_approve_default +msgid "Default comment prefilled when approval comments are enabled." +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 "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 +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_res_users__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__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 "Durumu Göster" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__definition_type__domain +msgid "Domain" +msgstr "Etki Alanı" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__done_by +msgid "Done By" +msgstr "Tamamlayan" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +msgid "Done by" +msgstr "Tamamlayan" + +#. 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 "Alanlar" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__exclude_requester +msgid "Four-eyes Principle" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Group %s" +msgstr "Grup %s" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__group_ids +msgid "Groups" +msgstr "Gruplar" + +#. 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 "İncelemeleri Gizle" + +#. 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_res_users__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__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 "Ayarlanırsa, İnceleyenin inceleme üzerinde yorum yapmasına izin ver." + +#. 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 "" +"Ayarlanırsa, bu duruma ulaşıldığında tüm olası inceleyenler e-posta ile " +"bildirilecektir. Sıraya göre onay senaryosunda kullanışlıdır. İnceleme " +"sırası kendilerine geldiğinde bir inceleme isteği gönderilir." + +#. 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 "" +"Ayarlanırsa, bu tanımla ilgili bir inceleme kabul edildiğinde inceleyiciler " +"e-postayla bilgilendirilecektir." + +#. 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 "" +"Ayarlanırsa, bu tanımla ilgili bir inceleme reddedildiğinde inceleyiciler e-" +"postayla bilgilendirilecektir." + +#. 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 "" +"Ayarlanırsa, bu tanımla ilgili bir inceleme yeniden başlatıldığında " +"inceleyiciler e-postayla bilgilendirilecektir." + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "It's fully validated" +msgstr "Tamamen Doğrulandı" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "It's in the validation process" +msgstr "Doğrulama Aşamasında" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__last_reminder_date +msgid "Last Reminder Date" +msgstr "Son Bilgilendirme Tarihi" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid +#: 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 "Model İsmi" + +#. 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_review__name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__name +msgid "Name" +msgstr "İsim" + +#. 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 +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 +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 +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 "Kabul Edilenleri İnceleyicilere Bildir" + +#. 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 "Red Edilenleri İnceleyicilere Bildir" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_restarted +msgid "Notify Reviewers on Restarted" +msgstr "Yeniden Başlatmayı İnceleyicilere Bildir" + +#. 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 "Bekleme Durumuna ulaştıklarında İnceleyicilere Bildir" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "" +"Number of days after which a message must be posted to remind about pending " +"validation (0 = no reminder)" +msgstr "" +"Bekleyen doğrulamayı hatırlatmak için bir mesajın gönderilmesi gereken gün " +"sayısı (0 = hatırlatma yok)" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "" +"Once created, you can decide which fields you want to be editable when the " +"record:" +msgstr "" +"Oluşturulduktan sonra, kayıt sırasında hangi alanların düzenlenebilir " +"olmasını istediğinize karar verebilirsiniz:" + +#. module: base_tier_validation +#. odoo-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__account_move__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__pending +#: 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 +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.selection,name:base_tier_validation.selection__account_move__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__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 +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 "Temsilci" + +#. 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 +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__review_ids +msgid "Review" +msgstr "İncele" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "Review pending for %(assignees)s, requested by %(requester)s." +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 "İ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 +#. odoo-python +#: code:addons/base_tier_validation/models/tier_definition.py:0 +msgid "Reviewer may lack access" +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 "İ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 +msgid "Reviews" +msgstr "İncelemeler" + +#. module: base_tier_validation +#: model:ir.actions.server,name:base_tier_validation.ir_cron_auto_tier_validation_ir_actions_server +msgid "Send Tier Review Reminder" +msgstr "Katman İnceleme Hatırlatıcısı Gönder" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "Send reminder message on pending reviews" +msgstr "Bekleyen incelemelerle ilgili hatırlatma mesajı gönder" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__sequence +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 +msgid "Status" +msgstr "Durumu" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_definition.py:0 +msgid "" +"The following reviewer(s) may not be able to read '%(model)s' records and so " +"cannot act on the reviews this tier will create: %(reviewers)s.\n" +"\n" +"This is a best-effort check against model-level access rights only -- record " +"rules may still grant or revoke access at runtime. Make sure these users " +"belong to a group with read access on the target model, or pick different " +"reviewers." +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +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_validation.py:0 +msgid "" +"This action needs to be validated for at least one record. Reviews pending:\n" +" - %s \n" +"Please request a validation." +msgstr "" +"Bu eylemin en az bir kayıt için doğrulanması gerekir. İnceleme bekliyor:\n" +" - %s \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,name:base_tier_validation.model_tier_review +msgid "Tier Review" +msgstr "Seviye İncelemesi" + +#. 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 "Katman Doğrulama İstisnası" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation_exception +msgid "Tier Validation Exceptions" +msgstr "Katman Doğrulama İstisnaları" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_rejected +msgid "Tier Validation Rejected Notification" +msgstr "Seviye Doğrulaması Reddedildi Bildirimi" + +#. module: base_tier_validation +#: model:mail.activity.type,name:base_tier_validation.mail_act_tier_validation_reminder +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_reminder +msgid "Tier Validation Reminder" +msgstr "Katman Doğrulama Hatırlatıcısı" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested +msgid "Tier Validation Requested" +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 "Yapılacak" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +msgid "Todo by" +msgstr "Yapılacak" + +#. 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 "Geçerli Model Alanı" + +#. 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.selection,name:base_tier_validation.selection__account_move__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__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 +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 "Doğrulama Durumu" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Validation reviewer field should be of the appropriate type" +msgstr "Doğrulama gözden geçiren alanı uygun türde olmalıdır" + +#. 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__account_move__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__waiting +#: 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 "Bekleyenler" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__exclude_requester +msgid "" +"When set, the user who requested the validation is removed from this tier's " +"reviewer pool. Anyone else in the configured group can validate -- except " +"the requester themselves. Without this flag, a requester who happens to be " +"in the same group as the configured reviewers can auto-validate their own " +"request. Only meaningful for review_type='group'; the form hides this field " +"for the other review types." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__account_move__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_validation__validation_status__no +msgid "Without validation" +msgstr "Doğrulama olmadan" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_after_validation +msgid "Write after Validation" +msgstr "Doğrulamadan sonra Yaz" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Write after validation" +msgstr "Doğrulamadan sonra yaz" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation_exception__allowed_to_write_under_validation +msgid "Write under Validation" +msgstr "Doğrulama esnasında Yaz" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_exception_search +msgid "Write under validation" +msgstr "Doğrulama esnasında yaz" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"You are not allowed to write those fields after validation.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields_str)s" +msgstr "" +"Doğrulamadan sonra bu alanları yazmanıza izin verilmez.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Yalnızca bu alanlar değiştirilebilir:\n" +"- %(allowed_fields_str)s" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"You are not allowed to write those fields under validation.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields_str)s" +msgstr "" +"Doğrulamadan sonra bu alanları yazmanıza izin verilmez.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Yalnızca bu alanlar değiştirilebilir:\n" +"- %(allowed_fields_str)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 "ör. Şunun için Seviye Doğrulaması..." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "the assigned reviewer" +msgstr "" + +#~ msgid "" +#~ "\n" +#~ " This Record needs to be\n" +#~ " validated." +#~ msgstr "" +#~ "\n" +#~ " Bu kaydın onaylanması\n" +#~ " gerekmektedir." + +#~ msgid "Config Settings" +#~ msgstr "Yapılandırma Ayarları" + +#~ msgid "Group By" +#~ msgstr "Grupla" + +#~ msgid "Option to use python formula to get reviewers and find documents" +#~ msgstr "" +#~ "Gözden geçirenleri almak ve belgeleri bulmak için python formülünü " +#~ "kullanma seçeneği" + +#~ msgid "Tier Formula" +#~ msgstr "Seviye Formülü" + +#~ msgid "Tier Validation" +#~ msgstr "Katman Doğrulama" + +#~ msgid "There are no res.users in the selected field" +#~ msgstr "Seçili alanda res.kullanıcı yok" + +#, python-format +#~ msgid "Activity" +#~ msgstr "Aktivite" + +#, python-format +#~ msgid "Operation has been rejected." +#~ msgstr "İşlem reddedildi." + +#, python-format +#~ msgid "Operation has been validated!" +#~ msgstr "İşlem doğrulandı!" + +#, python-format +#~ msgid "This %s needs to be validated" +#~ msgstr "Bu %s 'nin doğrulanması gerekiyor" + +#, 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." + +#, 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/vi_VN.po b/base_tier_validation/i18n/vi_VN.po new file mode 100644 index 000000000..387c34683 --- /dev/null +++ b/base_tier_validation/i18n/vi_VN.po @@ -0,0 +1,972 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_tier_validation +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2025-04-04 12:06+0000\n" +"Last-Translator: ductdm \n" +"Language-Team: none\n" +"Language: vi_VN\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 5.10.2\n" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "%(icon)s Pending validation by %(todo_by)s" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "%(icon)s This %(model_name)s needs to be 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 "" +"\n" +" Hoạt động đã bị\n" +" từ chối\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" +" Hoạt động này đã được\n" +" xác thực\n" +" !" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Name" +msgstr "Tên" + +#. 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 "" +"Bỏ qua, nếu cấp độ trước đó đã được xác thực bởi cùng một người xem " +"xét" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A record to be reviewed has been created by %s." +msgstr "Một bản ghi cần được xem xét đã được tạo bởi %s." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "A review has been requested %s days ago." +msgstr "Một yêu cầu xem xét đã được tạo %s ngày trước." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review has been requested by %s." +msgstr "Một yêu cầu xem xét đã được tạo bởi %s." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was accepted" +msgstr "Yêu cầu xem xét đã được chấp nhận" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was accepted. (%s)" +msgstr "Yêu cầu xem xét đã được chấp nhận. (%s)" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was rejected by %(user)s. (%(comment)s)" +msgstr "Yêu cầu xem xét đã bị từ chối bởi %(user)s. (%(comment)s)" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was rejected by %s." +msgstr "Yêu cầu xem xét đã bị từ chối bởi %s." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A validation process is still open for at least one record." +msgstr "Quá trình xác thực vẫn mở cho ít nhất một bản ghi." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__active +msgid "Active" +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,field_description:base_tier_validation.field_tier_definition__allow_write_for_reviewer +msgid "Allow Write For Reviewers" +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__comment_approve_default +msgid "Approve Comment" +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 +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:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__cancel +#: 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 +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_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,help:base_tier_validation.field_tier_definition__comment_approve_default +msgid "Default comment prefilled when approval comments are enabled." +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 +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_res_users__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__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 +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 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__exclude_requester +msgid "Four-eyes Principle" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Group %s" +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_res_users__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__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_tier_review__last_reminder_date +msgid "Last Reminder Date" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid +#: 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_review__name +#: 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 +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 +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 +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:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "" +"Number of days after which a message must be posted to remind about pending " +"validation (0 = no reminder)" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "" +"Once created, you can decide which fields you want to be editable when the " +"record:" +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__account_move__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__pending +#: 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 +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.selection,name:base_tier_validation.selection__account_move__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__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 +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 +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__review_ids +msgid "Review" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "Review pending for %(assignees)s, requested by %(requester)s." +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 +#. odoo-python +#: code:addons/base_tier_validation/models/tier_definition.py:0 +msgid "Reviewer may lack access" +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 +msgid "Reviews" +msgstr "" + +#. module: base_tier_validation +#: model:ir.actions.server,name:base_tier_validation.ir_cron_auto_tier_validation_ir_actions_server +msgid "Send Tier Review Reminder" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "Send reminder message on pending reviews" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__sequence +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 +msgid "Status" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_definition.py:0 +msgid "" +"The following reviewer(s) may not be able to read '%(model)s' records and so " +"cannot act on the reviews this tier will create: %(reviewers)s.\n" +"\n" +"This is a best-effort check against model-level access rights only -- record " +"rules may still grant or revoke access at runtime. Make sure these users " +"belong to a group with read access on the target model, or pick different " +"reviewers." +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "The review has been reset by %s." +msgstr "Đánh giá đã được thiết lập lại bởi %s." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"This action needs to be validated for at least one record. Reviews pending:\n" +" - %s \n" +"Please request a validation." +msgstr "" +"Hành động này cần được xác thực cho ít nhất một bản ghi. Đang chờ đánh giá:\n" +" - %s \n" +"Please request a 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 "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_review +msgid "Tier Review" +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.activity.type,name:base_tier_validation.mail_act_tier_validation_reminder +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_reminder +msgid "Tier Validation Reminder" +msgstr "" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested +msgid "Tier Validation Requested" +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 +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.selection,name:base_tier_validation.selection__account_move__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__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 +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 +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Validation reviewer field should be of the appropriate type" +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__account_move__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__waiting +#: 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,help:base_tier_validation.field_tier_definition__exclude_requester +msgid "" +"When set, the user who requested the validation is removed from this tier's " +"reviewer pool. Anyone else in the configured group can validate -- except " +"the requester themselves. Without this flag, a requester who happens to be " +"in the same group as the configured reviewers can auto-validate their own " +"request. Only meaningful for review_type='group'; the form hides this field " +"for the other review types." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__account_move__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__no +#: 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 +msgid "" +"You are not allowed to write those fields after validation.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields_str)s" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"You are not allowed to write those fields under validation.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields_str)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 "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "the assigned reviewer" +msgstr "" + +#~ msgid "" +#~ "\n" +#~ " This Record needs to be\n" +#~ " validated." +#~ msgstr "" +#~ "\n" +#~ " Bản ghi này cần được\n" +#~ " xác thực." diff --git a/base_tier_validation/i18n/zh_CN.po b/base_tier_validation/i18n/zh_CN.po new file mode 100644 index 000000000..eb9bb7fe8 --- /dev/null +++ b/base_tier_validation/i18n/zh_CN.po @@ -0,0 +1,999 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_tier_validation +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 13.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2020-09-24 18:00+0000\n" +"Last-Translator: Dong \n" +"Language-Team: none\n" +"Language: zh_CN\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 3.10\n" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "%(icon)s Pending validation by %(todo_by)s" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "%(icon)s This %(model_name)s needs to be 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 +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_review.py:0 +msgid "A review has been requested %s days ago." +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +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 +msgid "A review was accepted" +msgstr "审批已通过" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "A review was accepted. (%s)" +msgstr "审批已通过。 ( %s )" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +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 +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 +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 +#: 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,field_description:base_tier_validation.field_tier_definition__allow_write_for_reviewer +msgid "Allow Write For Reviewers" +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__comment_approve_default +msgid "Approve Comment" +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 +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:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__cancel +#: 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 +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_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,help:base_tier_validation.field_tier_definition__comment_approve_default +msgid "Default comment prefilled when approval comments are enabled." +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 +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_res_users__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__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 +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 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__exclude_requester +msgid "Four-eyes Principle" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Group %s" +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_res_users__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__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_tier_review__last_reminder_date +msgid "Last Reminder Date" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid +#: 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_review__name +#: 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 +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 +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 +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:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "" +"Number of days after which a message must be posted to remind about pending " +"validation (0 = no reminder)" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.actions.act_window,help:base_tier_validation.tier_validation_exception_action +msgid "" +"Once created, you can decide which fields you want to be editable when the " +"record:" +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__account_move__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__pending +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__pending +#: 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 +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.selection,name:base_tier_validation.selection__account_move__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__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 +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 +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__review_ids +msgid "Review" +msgstr "审批" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "Review pending for %(assignees)s, requested by %(requester)s." +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 +#. odoo-python +#: code:addons/base_tier_validation/models/tier_definition.py:0 +msgid "Reviewer may lack access" +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 +msgid "Reviews" +msgstr "审批" + +#. module: base_tier_validation +#: model:ir.actions.server,name:base_tier_validation.ir_cron_auto_tier_validation_ir_actions_server +msgid "Send Tier Review Reminder" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_reminder_delay +msgid "Send reminder message on pending reviews" +msgstr "" + +#. module: base_tier_validation +#. odoo-javascript +#: code:addons/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__sequence +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 +msgid "Status" +msgstr "状态" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_definition.py:0 +msgid "" +"The following reviewer(s) may not be able to read '%(model)s' records and so " +"cannot act on the reviews this tier will create: %(reviewers)s.\n" +"\n" +"This is a best-effort check against model-level access rights only -- record " +"rules may still grant or revoke access at runtime. Make sure these users " +"belong to a group with read access on the target model, or pick different " +"reviewers." +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "The review has been reset by %s." +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"This action needs to be validated for at least one record. Reviews pending:\n" +" - %s \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,name:base_tier_validation.model_tier_review +msgid "Tier Review" +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.activity.type,name:base_tier_validation.mail_act_tier_validation_reminder +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_reminder +msgid "Tier Validation Reminder" +msgstr "" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested +msgid "Tier Validation Requested" +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 +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.selection,name:base_tier_validation.selection__account_move__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__validated +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__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 +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 +#. odoo-python +#: code:addons/base_tier_validation/models/tier_review.py:0 +msgid "Validation reviewer field should be of the appropriate type" +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__account_move__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__waiting +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__waiting +#: 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,help:base_tier_validation.field_tier_definition__exclude_requester +msgid "" +"When set, the user who requested the validation is removed from this tier's " +"reviewer pool. Anyone else in the configured group can validate -- except " +"the requester themselves. Without this flag, a requester who happens to be " +"in the same group as the configured reviewers can auto-validate their own " +"request. Only meaningful for review_type='group'; the form hides this field " +"for the other review types." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__account_move__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__hr_expense__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_order__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__purchase_request__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__sale_order__validation_status__no +#: model:ir.model.fields.selection,name:base_tier_validation.selection__stock_picking__validation_status__no +#: 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 +msgid "" +"You are not allowed to write those fields after validation.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields_str)s" +msgstr "" + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "" +"You are not allowed to write those fields under validation.\n" +"- %(not_allowed_fields_str)s\n" +"\n" +"Only those fields can be modified:\n" +"- %(allowed_fields_str)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 "例如:审批层级用于..." + +#. module: base_tier_validation +#. odoo-python +#: code:addons/base_tier_validation/models/tier_validation.py:0 +msgid "the assigned reviewer" +msgstr "" + +#~ msgid "Group By" +#~ msgstr "分组" + +#, python-format +#~ msgid "" +#~ "This action needs to be validated for at least one record. \n" +#~ "Please request a validation." +#~ msgstr "" +#~ "此操作需要至少对一条记录进行审批。\n" +#~ "请发起审批申请。" + +#, 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/migrations/20.0.1.0.0/post-migration.py b/base_tier_validation/migrations/20.0.1.0.0/post-migration.py new file mode 100644 index 000000000..c270a3466 --- /dev/null +++ b/base_tier_validation/migrations/20.0.1.0.0/post-migration.py @@ -0,0 +1,17 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + + +def migrate(cr, version): + # 20.0 renders activity icons with Material Symbols; the record is noupdate. + cr.execute( + """ + UPDATE mail_activity_type mat + SET icon = 'notifications' + FROM ir_model_data imd + WHERE imd.module = 'base_tier_validation' + AND imd.name = 'mail_act_tier_validation_reminder' + AND imd.model = 'mail.activity.type' + AND imd.res_id = mat.id + AND mat.icon = 'fa-bell' + """ + ) diff --git a/base_tier_validation/models/__init__.py b/base_tier_validation/models/__init__.py new file mode 100644 index 000000000..e9dcfb086 --- /dev/null +++ b/base_tier_validation/models/__init__.py @@ -0,0 +1,7 @@ +# 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 diff --git a/base_tier_validation/models/res_users.py b/base_tier_validation/models/res_users.py new file mode 100644 index 000000000..755093e7c --- /dev/null +++ b/base_tier_validation/models/res_users.py @@ -0,0 +1,78 @@ +# Copyright 2019 ForgeFlow S.L. (https://www.forgeflow.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +import logging + +from odoo import api, fields, models, modules +from odoo.exceptions import AccessError +from odoo.fields import Domain + +_logger = logging.getLogger(__name__) + + +class Users(models.Model): + _inherit = "res.users" + + review_ids = fields.Many2many( + string="Reviews", comodel_name="tier.review", copy=False + ) + + @api.model + def review_user_count(self): + user_reviews = {} + user = self.env.user + user.review_ids._update_review_status() + domain = ( + Domain("status", "=", "pending") + & Domain("can_review", "=", True) + & Domain("id", "in", user.review_ids.ids) + ) + review_groups = self.env["tier.review"]._read_group( + domain=domain, + groupby=["model"], + aggregates=["id:recordset"], + ) + for model, tier_review in review_groups: + Model = self.env[model] + # Skip Models not having Tier Validation enabled (example: was unistalled) + if tier_review and hasattr(Model, "can_review"): + records_domain = ( + Domain("id", "in", tier_review.mapped("res_id")) + & Domain("validation_status", "!=", "rejected") + & Domain("can_review", "=", True) + ) + try: + records = ( + Model.with_user(user) + .with_context(active_test=False) + .search(records_domain) + ) + except AccessError: + # The user is a reviewer on records of a model whose + # ir.access does not grant them read access (e.g. + # a tier definition pointing at account.move while the + # reviewer has no accounting group). Skip silently so + # the systray keeps working; the reviewer cannot act on + # these reviews anyway without read access. + _logger.debug( + "User %s has no read access to %s; skipping in systray.", + user.login, + model, + ) + continue + # Excludes any cancelled records depending on the structure of the model + if Model._state_field in Model._fields: + records = records.filtered( + lambda x: x[x._state_field] != x._cancel_state + ) + if records: + user_reviews[model] = { + "id": records[0].id, + "name": Model._description, + "model": model, + "active_field": "active" in Model._fields, + "icon": modules.module.get_module_icon(Model._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 000000000..f7e2dfb4b --- /dev/null +++ b/base_tier_validation/models/tier_definition.py @@ -0,0 +1,251 @@ +# 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 +from odoo.exceptions import AccessError +from odoo.fields import Domain + + +class TierDefinition(models.Model): + _name = "tier.definition" + _description = "Tier Definition" + + @api.model + def _get_default_name(self): + return self.env._("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"), + ], + ) + allow_write_for_reviewer = fields.Boolean( + string="Allow Write For Reviewers", + default=False, + ) + reviewer_id = fields.Many2one(comodel_name="res.users") + 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", + 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) + comment_approve_default = fields.Char( + string="Approve Comment", + help="Default comment prefilled when approval comments are enabled.", + ) + notify_reminder_delay = fields.Integer( + string="Send reminder message on pending reviews", + help="Number of days after which a message must be posted to remind about " + "pending validation (0 = no reminder)", + ) + approve_sequence = fields.Boolean( + string="Approve by sequence", + default=False, + 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", + ) + exclude_requester = fields.Boolean( + string="Four-eyes Principle", + default=False, + help="When set, the user who requested the validation is removed " + "from this tier's reviewer pool. Anyone else in the configured " + "group can validate -- except the requester themselves. Without " + "this flag, a requester who happens to be in the same group as " + "the configured reviewers can auto-validate their own request. " + "Only meaningful for review_type='group'; the form hides this " + "field for the other review types.", + ) + + @api.onchange("review_type") + def onchange_review_type(self): + self.reviewer_id = None + self.reviewer_group_id = None + + def _reviewers_without_model_access(self, model_name, users): + """Return the subset of ``users`` that cannot read ``model_name``. + + The check is model-level only (``ir.access`` permissions). It does + not evaluate per-record ``ir.access`` domains, so callers should + treat a non-empty result as "*probably* no access" rather than a + guarantee -- access domains can grant or revoke access dynamically + at runtime. + """ + Model = self.env.get(model_name) + if Model is None: + return self.env["res.users"] + no_access = self.env["res.users"] + for user in users: + try: + Model.with_user(user).check_access("read") + except AccessError: + no_access |= user + return no_access + + def _reviewers_to_check_for_access(self): + """Return the user recordset whose model access we can check ahead + of time for this definition. Skip review types where the reviewer + only resolves at validation time (``field`` reads off the record).""" + self.ensure_one() + if self.review_type == "individual": + return self.reviewer_id + if self.review_type == "group": + return self.reviewer_group_id.user_ids + return self.env["res.users"] + + @api.onchange("review_type", "reviewer_id", "reviewer_group_id", "model_id") + def _onchange_warn_reviewer_access(self): + """Advisory warning when an assigned reviewer cannot read the model. + + Non-blocking: legitimate workflows (admin is about to grant the + group, access domains expose specific records, ...) still save. The + warning just makes it impossible to misconfigure this silently. + """ + # Read the model name off the m2o directly rather than via the + # stored related ``self.model`` -- on ``.new()`` records the + # related can still be empty depending on cache state. + model_name = self.model_id.model + if not (model_name and self.review_type): + return + users = self._reviewers_to_check_for_access() + if not users: + return + no_access = self._reviewers_without_model_access(model_name, users) + if not no_access: + return + return { + "warning": { + "title": self.env._("Reviewer may lack access"), + "message": self.env._( + "The following reviewer(s) may not be able to read " + "'%(model)s' records and so cannot act on the reviews " + "this tier will create: %(reviewers)s.\n\n" + "This is a best-effort check against model-level access " + "rights only -- record rules may still grant or revoke " + "access at runtime. Make sure these users belong to a " + "group with read access on the target model, or pick " + "different reviewers.", + model=self.model_id.name or model_name, + reviewers=", ".join(no_access.mapped("display_name")), + ), + } + } + + @api.depends("review_type", "model_id") + def _compute_domain_reviewer_field(self): + models = self.mapped("model") + IrModelFields = self.env["ir.model.fields"].sudo() + valid_reviewer_fields = dict( + IrModelFields._read_group( + domain=Domain("model", "in", models) + & ( + Domain("relation", "=", "res.users") + | Domain("relation", "=", "res.groups") + ), + groupby=["model"], + aggregates=["id:array_agg"], + ) + ) + for rec in self: + rec.valid_reviewer_field_ids = valid_reviewer_fields.get( + rec.model, IrModelFields + ) + + def _get_review_needing_reminder(self): + """Return all the reviews that have the reminder setup.""" + self.ensure_one() + if not self.notify_reminder_delay: + return self.env["tier.review"] + review_date = fields.Datetime.subtract( + fields.Datetime.now(), days=self.notify_reminder_delay + ) + domain = ( + Domain("definition_id", "=", self.id) + & Domain("status", "in", ["waiting", "pending"]) + & ( + Domain("create_date", "<", review_date) + & Domain("last_reminder_date", "=", False) + | Domain("last_reminder_date", "<", review_date) + ) + ) + return self.env["tier.review"].search( + domain, + limit=1, + ) + + def _cron_send_review_reminder(self): + definition_with_reminder = self.env["tier.definition"].search( + Domain("notify_reminder_delay", ">", 0) + ) + for record in definition_with_reminder: + review_to_remind = record._get_review_needing_reminder() + if review_to_remind: + review_to_remind._send_review_reminder() diff --git a/base_tier_validation/models/tier_review.py b/base_tier_validation/models/tier_review.py new file mode 100644 index 000000000..2b4cd2ffd --- /dev/null +++ b/base_tier_validation/models/tier_review.py @@ -0,0 +1,243 @@ +# Copyright 2017-19 ForgeFlow S.L. (https://www.forgeflow.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +import logging + +from odoo import api, fields, models +from odoo.exceptions import ValidationError + +_logger = logging.getLogger(__name__) + + +class TierReview(models.Model): + _name = "tier.review" + _description = "Tier Review" + _order = "sequence, id" + + name = fields.Char(related="definition_id.name") + status = fields.Selection( + [ + ("waiting", "Waiting"), + ("pending", "Pending"), + ("rejected", "Rejected"), + ("approved", "Approved"), + ("cancel", "Cancel"), + ], + default="waiting", + ) + model = fields.Char(string="Related Document Model", index=True) + res_id = fields.Many2oneReference( + string="Related Document ID", + index=True, + model_field="model", + ) + definition_id = fields.Many2one(comodel_name="tier.definition") + company_id = fields.Many2one( + related="definition_id.company_id", + store=True, + ) + review_type = fields.Selection(related="definition_id.review_type") + reviewer_id = fields.Many2one(related="definition_id.reviewer_id") + reviewer_group_id = fields.Many2one(related="definition_id.reviewer_group_id") + reviewer_field_id = fields.Many2one(related="definition_id.reviewer_field_id") + 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") + 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") + approve_sequence_bypass = fields.Boolean( + related="definition_id.approve_sequence_bypass" + ) + last_reminder_date = fields.Datetime(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): + for review in self: + if not review.reviewed_date: + review.reviewed_formated_date = False + continue + reviewed_date_tz = fields.Datetime.context_timestamp( + self, review.reviewed_date + ) + review.reviewed_formated_date = reviewed_date_tz.replace(tzinfo=None) + + @api.depends("status", "approve_sequence", "sequence", "model", "res_id") + def _compute_can_review(self): + for record in self: + record.can_review = record._can_review_value() + + def _update_review_status(self): + """Promote reviews that are currently available to pending.""" + # To defer recompute, use context key + # `tier_validation_defer_compute_can_review`. + # Be sure to explicitely call the method afterwards. + if self.env.context.get("tier_validation_defer_compute_can_review"): + return + reviews = self.filtered(lambda rev: rev.status in ["waiting", "pending"]) + if not reviews: + return + # Lowest still-open sequence *per record*, computed over the whole + # record's reviews -- NOT just this recordset. Computing it over + # ``self`` promotes a later tier prematurely whenever the method runs on + # a subset that excludes the lower-sequence predecessors, e.g. + # ``review_user_count`` calling ``user.review_ids._update_review_status()`` + # for a second-tier reviewer (their own review is then the only -- and + # thus "minimum" -- sequence in the set, so it wrongly goes ``pending``). + min_seq_by_record = {} + for model, res_id in {(rev.model, rev.res_id) for rev in reviews}: + open_reviews = ( + self.env[model] + .browse(res_id) + .review_ids.filtered(lambda r: r.status in ("waiting", "pending")) + ) + min_seq_by_record[(model, res_id)] = min(open_reviews.mapped("sequence")) + for record in reviews: + if record.status != "waiting": + continue + if ( + record.approve_sequence + and record.sequence != min_seq_by_record[(record.model, record.res_id)] + ): + continue + record.status = "pending" + if record.definition_id.notify_on_pending: + record._notify_pending_status(record) + reviews.flush_recordset(["status", "can_review"]) + + 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.user_ids", + "definition_id.exclude_requester", + "requested_by", + ] + + @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 = self.env._("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): + reviewers = self.env["res.users"] + if self.reviewer_id or self.reviewer_group_id.user_ids: + reviewers = self.reviewer_id + self.reviewer_group_id.user_ids + elif self.reviewer_field_id: + resource = self.env[self.model].browse(self.res_id) + reviewer_field = getattr(resource, self.reviewer_field_id.name, False) + if reviewer_field: + if reviewer_field._name == "res.groups": + reviewers = reviewer_field.user_ids + elif reviewer_field._name == "res.users": + reviewers = reviewer_field + else: + raise ValidationError( + self.env._( + "Validation reviewer field " + "should be of the appropriate type" + ) + ) + # Four-eyes: drop the requester from the reviewer pool if the + # definition opted in. Done as a post-filter so it applies + # uniformly across individual / group / field review types. + if self.definition_id.exclude_requester and self.requested_by: + reviewers -= self.requested_by + return reviewers + + 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) + + def _get_reminder_notification_subtype(self): + return "base_tier_validation.mt_tier_validation_reminder" + + def _get_reminder_activity_type(self): + return "base_tier_validation.mail_act_tier_validation_reminder" + + def _notify_review_reminder_body(self): + delay = (fields.Datetime.now() - self.create_date).days + return self.env._("A review has been requested %s days ago.", delay) + + def _send_review_reminder(self): + record = self.env[self.model].browse(self.res_id) + # Only schedule activity if reviewer is a single user and model has activities + if len(self.reviewer_ids) == 1 and hasattr(record, "activity_ids"): + self._schedule_review_reminder_activity(record) + elif hasattr(record, "message_post"): + self._notify_review_reminder(record) + else: + msg = f"Could not send reminder for record {record}" + _logger.exception(msg) + self.last_reminder_date = fields.Datetime.now() + + def _notify_review_reminder(self, record): + record.message_post( + subtype_xmlid=self._get_reminder_notification_subtype(), + body=self._notify_review_reminder_body(), + ) + + def _schedule_review_reminder_activity(self, record): + record.activity_schedule( + act_type_xmlid=self._get_reminder_activity_type(), + note=self._notify_review_reminder_body(), + user_id=self.reviewer_ids.id, + ) diff --git a/base_tier_validation/models/tier_validation.py b/base_tier_validation/models/tier_validation.py new file mode 100644 index 000000000..18cd98173 --- /dev/null +++ b/base_tier_validation/models/tier_validation.py @@ -0,0 +1,1053 @@ +# 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.api import NewId +from odoo.exceptions import ValidationError +from odoo.fields import Domain +from odoo.tools import SQL +from odoo.tools.misc import frozendict + +BASE_EXCEPTION_FIELDS = [ + "message_follower_ids", + "access_token", + "message_main_attachment_id", +] + + +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 + _tier_validation_company_field = "company_id" + + _state_field = "state" + _state_from = ["draft"] # noqa: RUF012 + _state_to = ["confirmed"] # noqa: RUF012 + _cancel_state = "cancel" + + review_ids = fields.One2many( + comodel_name="tier.review", + inverse_name="res_id", + string="Validations", + domain=lambda self: [("model", "=", self._name)], + bypass_search_access=True, + ) + to_validate_message = fields.Html(compute="_compute_to_validate_message") + validated_message = fields.Html(compute="_compute_validated_message") + need_validation = fields.Boolean(compute="_compute_need_validation") + rejected_message = fields.Html(compute="_compute_rejected_message") + validation_status = fields.Selection( + selection=[ + ("no", "Without validation"), + ("waiting", "Waiting"), + ("pending", "Pending"), + ("rejected", "Rejected"), + ("validated", "Validated"), + ], + default="no", + compute="_compute_validation_status", + store=True, + ) + 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") + + @api.depends_context("uid") + @api.depends( + "review_ids.has_comment", "review_ids.reviewer_ids", "review_ids.status" + ) + 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 + + @api.depends_context("uid") + @api.depends( + "review_ids.approve_sequence", + "review_ids.reviewer_ids", + "review_ids.sequence", + "review_ids.status", + ) + 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 = Domain( + "review_ids", + "any", + [ + ("reviewer_ids", "=", self.env.user.id), + ("status", "in", ["pending", "waiting"]), + ("can_review", "=", True), + ], + ) & Domain("validation_status", "!=", "rejected") + res_ids = ( + self.with_context(active_test=False) + .search(domain) + .filtered("can_review") + .ids + ) + return Domain("id", "in", res_ids) + + @api.depends("review_ids", "review_ids.reviewer_ids", "review_ids.status") + 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_reviewer_ids(self, operator, value): + model_operator = "in" + # For `reviewer_ids = False`, this search method must return records + # that have not started a validation process. We do that by searching + # for existing reviews and then returning records whose ids are not in + # those review `res_id`s. In Odoo 19, the ORM normalizes this domain + # before it reaches the custom search method as `reviewer_ids in [False]`. + search_without_validation = operator == "=" and value in ("[]", False) + if operator == "in": + try: + values = list(value) + except TypeError: + values = [] + search_without_validation = values == [False] + if search_without_validation: + # Search for records that have not yet been through a validation + # process. + operator, value = "!=", False + model_operator = "not in" + reviews_query = self.env["tier.review"]._search( + Domain("model", "=", self._name) + & Domain("reviewer_ids", operator, value) + & Domain("can_review", "=", True) + ) + return Domain( + "id", model_operator, reviews_query.subselect(SQL("DISTINCT res_id")) + ) + + def _get_to_validate_message_name(self): + return self._description + + def _get_to_validate_message(self): + """Build the contextual "needs to be validated" banner body. + + When at least one review has reached ``pending`` and carries a + ``todo_by`` label (i.e. the assignee is known -- a user, a group + or a field-based reviewer), surface it inline so the reader can + see at a glance *who* is expected to act next, not just *that* + action is needed. + + Falls back to the model-name phrasing -- "This Sale Order needs + to be validated" -- when no pending review is available yet + (defensive: e.g. the ``waiting`` edge state, or downstream code + that calls this on a fresh record). + """ + icon = '' + pending = self.review_ids.filtered(lambda r: r.status == "pending")[:1] + if pending and pending.todo_by: + return self.env._( + "%(icon)s Pending validation by %(todo_by)s", + icon=icon, + todo_by=pending.todo_by, + ) + return self.env._( + "%(icon)s This %(model_name)s needs to be validated", + icon=icon, + model_name=self._get_to_validate_message_name(), + ) + + def _get_validated_message(self): + msg = f""" { + self.env._("Operation has been validated!") + }""" + return self.validation_status == "validated" and msg or "" + + def _get_rejected_message(self): + msg = f""" { + self.env._("Operation has been rejected.") + }""" + return self.validation_status == "rejected" and msg or "" + + @api.depends("validation_status", "review_ids.status", "review_ids.todo_by") + def _compute_to_validate_message(self): + for rec in self: + rec.to_validate_message = rec._get_to_validate_message() + + def _validated_states(self): + """Override for different validation policy.""" + return ["approved"] + + @api.depends("validation_status") + def _compute_validated_message(self): + for rec in self: + rec.validated_message = rec._get_validated_message() + + def _rejected_states(self): + """Override for different rejected policy.""" + return ["rejected"] + + @api.depends("validation_status") + def _compute_rejected_message(self): + for rec in self: + rec.rejected_message = rec._get_rejected_message() + + @api.depends("review_ids", "review_ids.status") + def _compute_validation_status(self): + validated_states = self._validated_states() + rejected_states = self._rejected_states() + for item in self: + reviews = item.review_ids + any_rejected = any(reviews.filtered(lambda x: x.status in rejected_states)) + any_pending = any(reviews.filtered(lambda x: x.status == "pending")) + any_waiting = any(item.review_ids.filtered(lambda x: x.status == "waiting")) + if reviews and all(x.status in validated_states for x in reviews): + item.validation_status = "validated" + elif any_rejected: + item.validation_status = "rejected" + elif any_pending: + item.validation_status = "pending" + elif any_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 = self.env._("Next: %s", review.name) if review else False + + def _compute_hide_reviews(self): + for rec in self: + rec.hide_reviews = rec[self._state_field] not in self._state_from + + def _compute_need_validation(self): + for rec in self: + if isinstance(rec.id, NewId): + rec.need_validation = False + continue + tiers = ( + self.env["tier.definition"] + .with_context(active_test=True) + .search( + Domain("model", "=", self._name) + & Domain("company_id", "in", [False] + rec._get_company().ids) + ) + ) + valid_tiers = any(rec.evaluate_tier(tier) for tier in tiers) + rec.need_validation = ( + not rec.review_ids and valid_tiers and rec._check_state_from_condition() + ) + + def evaluate_tier(self, tier): + if tier.definition_domain: + domain = literal_eval(tier.definition_domain) + return self.filtered_domain(domain) + else: + return self + + def _get_exception_fields(self, extra_domain=None): + """Return Tier Validation Exception field names that matchs custom domain.""" + domain = ( + Domain("model_name", "=", self._name) + & Domain("company_id", "in", [False] + self._get_company().ids) + & ( + Domain("group_ids.all_user_ids", "in", self.env.user.ids) + | Domain("group_ids", "=", False) + ) + ) + if extra_domain: + domain &= Domain(extra_domain) + return ( + self.env["tier.validation.exception"] + .sudo() + .search(domain) + .mapped("field_ids.name") + ) + + @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._get_exception_fields(extra_domain=extra_domain) + 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=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=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 + or for reviewers for all fields, even when the record is under + validation.""" + if ( + all(self.review_ids.mapped("definition_id.allow_write_for_reviewer")) + and self.env.user in self.reviewer_ids + ): + return True + 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) + + 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 _check_tier_state_transition(self, vals): + """ + Check we are in origin state and not destination state + """ + self.ensure_one() + return getattr(self, self._state_field) in self._state_from and vals.get( + self._state_field + ) not in (self._state_to + [self._cancel_state]) + + 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_multi(self, vals_list): + for rec, vals in zip(self, vals_list, strict=False): + if rec._tier_validation_state_field_is_computed: + rec._tier_validation_check_state_on_write(vals) + rec._tier_validation_check_write_remove_reviews(vals) + return super()._write_multi(vals_list) + + 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( + SQL( + "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 rec.validation_status != "validated": + pending_reviews = reviews.filtered( + lambda r: r.status == "pending" + ).mapped("name") + raise ValidationError( + self.env._( + "This action needs to be validated for at least " + "one record. Reviews pending:\n - %s " + "\nPlease request a validation.", + "\n - ".join(pending_reviews), + ) + ) + if rec.review_ids and rec.validation_status != "validated": + raise ValidationError( + self.env._( + "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 rec._check_tier_state_transition(vals) + and not rec._check_allow_write_under_validation(vals) + and not rec.env.context.get("skip_validation_check") + ): + ( + allowed_fields, + not_allowed_fields, + ) = rec._get_fields_to_write_validation( + vals, rec._get_under_validation_exceptions + ) + not_allowed_fields_str = "\n- ".join(not_allowed_fields) + allowed_fields_str = "\n- ".join(allowed_fields) + raise ValidationError( + self.env._( + "You are not allowed to write those fields under validation.\n" + "- %(not_allowed_fields_str)s\n\n" + "Only those fields can be modified:\n- %(allowed_fields_str)s", + not_allowed_fields_str=not_allowed_fields_str, + allowed_fields_str=allowed_fields_str, + ) + ) + + # 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.env.context.get("skip_validation_check") + ): + ( + allowed_fields, + not_allowed_fields, + ) = rec._get_fields_to_write_validation( + vals, rec._get_after_validation_exceptions + ) + not_allowed_fields_str = "\n- ".join(not_allowed_fields) + allowed_fields_str = "\n- ".join(allowed_fields) + raise ValidationError( + self.env._( + "You are not allowed to write those fields after validation.\n" + "- %(not_allowed_fields_str)s\n\n" + "Only those fields can be modified:\n- %(allowed_fields_str)s", + not_allowed_fields_str=not_allowed_fields_str, + allowed_fields_str=allowed_fields_str, + ) + ) + + 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 + return state_to in self._state_from and state_from not in self._state_from + + 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", + } + ) + + # Only approve consecutive pending reviews (by sequence) for the + # current user. Stop at the first review not assigned to the user, + # so intermediate reviewers are not skipped. + sorted_pending = tier_reviews.filtered(lambda r: r.status == "pending").sorted( + "sequence" + ) + user_reviews = self.env["tier.review"] + for review in sorted_pending: + if self.env.user in review.reviewer_ids: + user_reviews |= review + else: + break + + 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 + ) + # We need to notify all pending users if there is approve sequence + if tier_reviews and any(review.approve_sequence for review in tier_reviews): + reviews_to_notify = self.review_ids.filtered( + lambda r: ( + r.status in ("waiting", "pending") + and r.definition_id.notify_on_accepted + ) + ) + # If there are approve sequence, only the following should be + # considered to notify + if reviews_to_notify and any( + review.approve_sequence for review in reviews_to_notify + ): + reviews_to_notify = reviews_to_notify.filtered( + lambda x: x.approve_sequence + )[0] + if reviews_to_notify: + subscribe = "message_subscribe" + if hasattr(self, subscribe): + getattr(self, subscribe)( + partner_ids=reviews_to_notify.mapped("reviewer_ids") + .mapped("partner_id") + .ids, + subtype_ids=self.env.ref( + self._get_accepted_notification_subtype() + ).ids, + ) + for review in reviews_to_notify: + rec = self.env[review.model].browse(review.res_id) + 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 self.env._("A review was accepted. (%s)", comment) + return self.env._("A review was accepted") + + def _add_comment(self, validate_reject, reviews): + wizard = self.env.ref("base_tier_validation.view_comment_wizard") + return { + "name": self.env._("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) + ) + action = self._add_comment("validate", user_reviews) + action["context"]["default_comment"] = ( + user_reviews[:1].definition_id.comment_approve_default or "" + ) + return action + 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 self.env._( + "A review was rejected by %(user)s. (%(comment)s)", + user=self.env.user.name, + comment=comment, + ) + return self.env._("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 + ) + # We need to notify all pending users if there is approve sequence + if tier_reviews and any(review.approve_sequence for review in tier_reviews): + # If there are waiting reviews that should be approved sequentially, + # they must be marked as canceled + waiting_reviews = self.review_ids.filtered( + lambda r: r.status == "waiting" and r.approve_sequence + ) + if waiting_reviews: + waiting_reviews.write({"status": "cancel"}) + reviews_to_notify = self.review_ids.filtered( + lambda r: r.status == "pending" and r.definition_id.notify_on_rejected + ) + # If there are approve sequence, only the following should be + # considered to notify + if reviews_to_notify and any( + review.approve_sequence for review in reviews_to_notify + ): + reviews_to_notify = reviews_to_notify.filtered( + lambda x: x.approve_sequence + )[0] + if reviews_to_notify: + subscribe = "message_subscribe" + if hasattr(self, subscribe): + getattr(self, subscribe)( + partner_ids=reviews_to_notify.mapped("reviewer_ids") + .mapped("partner_id") + .ids, + subtype_ids=self.env.ref( + self._get_rejected_notification_subtype() + ).ids, + ) + for review in reviews_to_notify: + rec = self.env[review.model].browse(review.res_id) + rec._notify_rejected_review() + + def _notify_created_review_body(self): + return self.env._( + "A record to be reviewed has been created by %s.", + self.env.user.name, + ) + + def _notify_requested_review_body(self, tier_reviews=None): + """Chatter body for a tier reaching ``pending``. + + Sources the requester from the review's ``requested_by`` rather + than ``env.user`` -- on second-and-later tier promotions + ``env.user`` is the previous-tier *approver*, which is the wrong + person to attribute the request to. + + Names the assignee(s) in the body so the recipient sees at a + glance that the message is meant for them (chatter notifications + do not render the "Notified to" pill, so the body has to carry + that information itself). Reuses ``tier.review.todo_by`` so the + wording is consistent with the Reviews table and handles every + review type out of the box -- individual user, group, or field. + """ + if tier_reviews: + requester = tier_reviews[:1].requested_by or self.env.user + assignees = ", ".join( + filter(None, tier_reviews.mapped("todo_by")) + ) or self.env._("the assigned reviewer") + return self.env._( + "Review pending for %(assignees)s, requested by %(requester)s.", + assignees=assignees, + requester=requester.display_name, + ) + return self.env._( + "A review has been requested by %s.", self.env.user.display_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, + subtype_ids=self.env.ref( + self._get_requested_notification_subtype() + ).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, + } + + @api.model + def _get_company(self): + company_id = self.env.company + if ( + self + and self._tier_validation_company_field in self.env[self._name] + and self[self._tier_validation_company_field] + ): + company_id = self[self._tier_validation_company_field] + return company_id + + def request_validation(self): + td_obj = self.env["tier.definition"] + tr_obj = self.env["tier.review"] + vals_list = [] + for rec in self: + if rec._check_state_from_condition() and rec.need_validation: + tier_definitions = td_obj.search( + Domain("model", "=", self._name) + & Domain("company_id", "in", [False] + rec._get_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)) + created_trs = tr_obj.create(vals_list) + # ``request_validation`` creates all reviews as ``waiting``. Promote the + # available one(s) to ``pending`` immediately so the workflow can move + # forward without an external trigger. Without this, when the user + # asking for validation is not themself the first reviewer (and no + # ``notify_on_create`` definition is present), reviews would stay in + # ``waiting`` indefinitely and no reviewer would be notified. + created_trs._update_review_status() + if any(self.mapped("can_review")): + self._update_counter({"review_created": True}) + self._notify_review_requested(created_trs) + return created_trs + + def _notify_restarted_review_body(self): + return self.env._("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 + ) + can_review = rec.can_review + rec.mapped("review_ids").unlink() + if to_update_counter and can_review: + 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, + subtype_ids=self.env.ref( + self._get_restarted_notification_subtype() + ).ids, + ) + rec._notify_restarted_review() + + @api.model + def _update_counter(self, review_counter): + self.review_ids._update_review_status() + channel = "base.tier.validation/updated" + # Notify the reviewers whose pending count actually changes, not the + # acting user. Sending the delta to ``self.env.user`` made unrelated + # users' systray counters drift (even negative) whenever someone acted + # on a tier-validated record without being one of its reviewers. When + # the reviews are already gone (deletions), fall back to the acting + # user. The client recomputes the absolute count on receipt, so the + # exact audience only affects how promptly a reviewer sees the update. + partners = self.review_ids.mapped("reviewer_ids.partner_id") + if not partners: + partners = self.env.user.partner_id + for partner in partners: + partner._bus_send(channel, 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 "validation_status not in ('no', False)" + + @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() + all_fields = self.fields_get(attributes=("readonly",)) + for node in doc.xpath("//field[@name][not(ancestor::field)]"): + field_name = node.attrib.get("name") + if field_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})" + elif all_fields.get(field_name, {}).get("readonly"): + # don't set dynamic readonly attribute for fields + # marked readonly in the ORM (ie computed fields) + # if the view doesn't set one + continue + 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 to the tier-validation-requested + # subtype explicitly, otherwise ``message_post`` below would + # route to no one (the subtype is ``default=False``). Only + # post the message when at least one reviewer wants to be + # notified -- mirroring ``_notify_review_requested``. + if not users_to_notify: + continue + rec.message_subscribe( + partner_ids=users_to_notify.mapped("partner_id").ids, + subtype_ids=self.env.ref( + self._get_requested_notification_subtype() + ).ids, + ) + rec.message_post( + subtype_xmlid=self._get_requested_notification_subtype(), + body=rec._notify_requested_review_body(tier_reviews), + ) + + +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 000000000..c160dfb40 --- /dev/null +++ b/base_tier_validation/models/tier_validation_exception.py @@ -0,0 +1,91 @@ +# 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 odoo.fields import Domain + +from .tier_validation import BASE_EXCEPTION_FIELDS + + +class TierValidationException(models.Model): + _name = "tier.validation.exception" + _description = "Tier Validation Exceptions" + + @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", + 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, + 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", + 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): + model_names = self.mapped("model_name") + valid_model_fields = dict( + self.env["ir.model.fields"] + .sudo() + ._read_group( + domain=Domain("model", "in", model_names) + & Domain("name", "not in", BASE_EXCEPTION_FIELDS), + groupby=["model"], + aggregates=["id:array_agg"], + ) + ) + for record in self: + record.valid_model_field_ids = valid_model_fields.get(record.model_name, []) + + @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( + self.env._( + "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 000000000..4231d0ccc --- /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 000000000..4bd817e66 --- /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 000000000..cc3d88a10 --- /dev/null +++ b/base_tier_validation/readme/CONTRIBUTORS.md @@ -0,0 +1,19 @@ +- 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 \<\> +- Kevin Khao \<\> +- Do Anh Duy \<\> +- Panithan k. \<\> \ No newline at end of file diff --git a/base_tier_validation/readme/CREDITS.md b/base_tier_validation/readme/CREDITS.md new file mode 100644 index 000000000..e69de29bb diff --git a/base_tier_validation/readme/DESCRIPTION.md b/base_tier_validation/readme/DESCRIPTION.md new file mode 100644 index 000000000..6f5bd9450 --- /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 000000000..a186210ee --- /dev/null +++ b/base_tier_validation/readme/HISTORY.md @@ -0,0 +1,138 @@ +## 19.0.1.0.4 (2026-05-13) + +UI improvement: + +- The "needs to be validated" banner shown above tier-validated + documents now surfaces *who* is expected to act, when known. + Reads "Pending validation by John" or "Pending validation by + Group Accountants" instead of the generic + "This Record needs to be validated", with a fallback to the + model-name phrasing for the defensive edge case where no review + has reached ``pending`` yet. Reuses ``tier.review.todo_by`` so + every review type (individual user, group, ``res.users`` / + ``res.groups`` field) is handled uniformly. The banner template + now reads from the long-standing ``to_validate_message`` Html + field, which was previously defined on the model but never + rendered. + +## 19.0.1.0.3 (2026-05-13) + +Improvements: + +- ``notify_on_pending`` chatter body now names the assignee(s) so the + recipient can tell at a glance that the message is for them. Reuses + ``tier.review.todo_by`` so every review type (individual user, + group, ``res.users`` / ``res.groups`` field) is handled uniformly. +- ``notify_on_pending`` chatter body now attributes the request to + ``review.requested_by`` (the user who actually pressed *Request + Validation*) instead of ``env.user``. On second-and-later tier + promotions ``env.user`` is the previous-tier approver, which was the + wrong person to credit. + +## 19.0.1.0.1 (2026-05-12) + +Fixes: + +- Restore auto-promotion of the lowest-sequence review to ``pending`` + immediately after ``request_validation`` so the workflow can move + forward without an external trigger. The 19.0 migration had moved + this side-effect out of ``_compute_can_review`` into a separate + ``_update_review_status`` that was only invoked when the requester + was themself the first reviewer or when ``notify_on_create`` was + set, leaving reviews stuck in ``waiting`` in every other case. +- Coerce ``next_review`` to ``False`` when no review is pending, so + the "needs to be validated" banner no longer leaks the empty + ``tier.review()`` recordset repr into its ``Char`` field. +- Fix ``_notify_review_available`` so the reviewer reached by + ``notify_on_pending`` is actually delivered the message. The + tier-validation subtypes have ``default=False`` so a plain + ``message_subscribe(partner_ids=...)`` left the reviewer subscribed + only to default subtypes; ``message_post`` with the + ``mt_tier_validation_requested`` subtype then routed to nobody. Pass + ``subtype_ids`` explicitly (mirroring ``_notify_review_requested``). + +## 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 000000000..bfce5c85b --- /dev/null +++ b/base_tier_validation/readme/ROADMAP.md @@ -0,0 +1,15 @@ +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. diff --git a/base_tier_validation/security/ir.access.csv b/base_tier_validation/security/ir.access.csv new file mode 100644 index 000000000..005217ac6 --- /dev/null +++ b/base_tier_validation/security/ir.access.csv @@ -0,0 +1,13 @@ +id,name,model_id,group_id/id,operation,domain +access_tier_review_group_public,access_tier_review_group_public,tier.review,base.group_public,r, +access_tier_definition_group_public,access_tier_definition_group_public,tier.definition,base.group_public,r, +access_tier_review_group_portal,access_tier_review_group_portal,tier.review,base.group_portal,r, +access_tier_definition_group_portal,access_tier_definition_group_portal,tier.definition,base.group_portal,r, +access_tier_review,access.tier.review,tier.review,base.group_user,crud, +access_tier_definition_all,tier.definition.all,tier.definition,base.group_user,r, +access_tier_definition_settings,tier.definition.settings,tier.definition,base.group_erp_manager,crud, +access_comment_wizard,access.comment.wizard,comment.wizard,base.group_user,crud, +access_tier_validation_exceptions_all,tier.validation.exceptions,tier.validation.exception,base.group_user,r, +access_tier_validation_exceptions_settings,tier.validation.exceptions,tier.validation.exception,base.group_system,crud, +tier_definition_comp_rule,Tier Definition multi-company,tier.definition,,crud,"[('company_id', 'in', company_ids + [False])]" +tier_review_comp_rule,Tier Review multi-company,tier.review,,crud,"[('company_id', 'in', company_ids + [False])]" diff --git a/base_tier_validation/static/description/icon.png b/base_tier_validation/static/description/icon.png new file mode 100644 index 000000000..e47811260 Binary files /dev/null and b/base_tier_validation/static/description/icon.png differ diff --git a/base_tier_validation/static/description/icon.svg b/base_tier_validation/static/description/icon.svg new file mode 100644 index 000000000..a04a24bdb --- /dev/null +++ b/base_tier_validation/static/description/icon.svg @@ -0,0 +1,70 @@ + + + + diff --git a/base_tier_validation/static/description/index.html b/base_tier_validation/static/description/index.html new file mode 100644 index 000000000..ed3162962 --- /dev/null +++ b/base_tier_validation/static/description/index.html @@ -0,0 +1,708 @@ + + + + + +Base Tier Validation + + + +
+ + + +Odoo Community Association + +
+

Base Tier Validation

+ +

Mature License: AGPL-3 OCA/tier-validation 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.

    +
  • +
+
+
+

Changelog

+
+

19.0.1.0.4 (2026-05-13)

+

UI improvement:

+
    +
  • The “needs to be validated” banner shown above tier-validated +documents now surfaces who is expected to act, when known. Reads +“Pending validation by John” or “Pending validation by Group +Accountants” instead of the generic “This Record needs to be +validated”, with a fallback to the model-name phrasing for the +defensive edge case where no review has reached pending yet. +Reuses tier.review.todo_by so every review type (individual user, +group, res.users / res.groups field) is handled uniformly. The +banner template now reads from the long-standing +to_validate_message Html field, which was previously defined on +the model but never rendered.
  • +
+
+
+

19.0.1.0.3 (2026-05-13)

+

Improvements:

+
    +
  • notify_on_pending chatter body now names the assignee(s) so the +recipient can tell at a glance that the message is for them. Reuses +tier.review.todo_by so every review type (individual user, group, +res.users / res.groups field) is handled uniformly.
  • +
  • notify_on_pending chatter body now attributes the request to +review.requested_by (the user who actually pressed Request +Validation) instead of env.user. On second-and-later tier +promotions env.user is the previous-tier approver, which was the +wrong person to credit.
  • +
+
+
+

19.0.1.0.1 (2026-05-12)

+

Fixes:

+
    +
  • Restore auto-promotion of the lowest-sequence review to pending +immediately after request_validation so the workflow can move +forward without an external trigger. The 19.0 migration had moved this +side-effect out of _compute_can_review into a separate +_update_review_status that was only invoked when the requester was +themself the first reviewer or when notify_on_create was set, +leaving reviews stuck in waiting in every other case.
  • +
  • Coerce next_review to False when no review is pending, so the +“needs to be validated” banner no longer leaks the empty +tier.review() recordset repr into its Char field.
  • +
  • Fix _notify_review_available so the reviewer reached by +notify_on_pending is actually delivered the message. The +tier-validation subtypes have default=False so a plain +message_subscribe(partner_ids=...) left the reviewer subscribed +only to default subtypes; message_post with the +mt_tier_validation_requested subtype then routed to nobody. Pass +subtype_ids explicitly (mirroring _notify_review_requested).
  • +
+
+
+

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/tier-validation 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/store_service_patch.esm.js b/base_tier_validation/static/src/components/tier_review_menu/store_service_patch.esm.js new file mode 100644 index 000000000..f9302e57b --- /dev/null +++ b/base_tier_validation/static/src/components/tier_review_menu/store_service_patch.esm.js @@ -0,0 +1,11 @@ +import {Store} from "@mail/core/common/store_service"; +import {patch} from "@web/core/utils/patch"; + +patch(Store.prototype, { + setup() { + super.setup(...arguments); + // Declared here so they become reactive store fields. + this.tierReviewCounter = 0; + this.tierReviewGroups = []; + }, +}); 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 000000000..24c7964d9 --- /dev/null +++ b/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.esm.js @@ -0,0 +1,113 @@ +import {Component} from "@odoo/owl"; +import {Dropdown} from "@web/core/dropdown/dropdown"; +import {registry} from "@web/core/registry"; +import {useDebounced} from "@web/core/utils/timing"; +import {useDiscussSystray} from "@mail/utils/common/hooks"; +import {useDropdownState} from "@web/core/dropdown/dropdown_hooks"; +import {useService} from "@web/core/utils/hooks"; + +export class TierReviewMenu extends Component { + static components = {Dropdown}; + static template = "base_tier_validation.TierReviewMenu"; + + setup() { + super.setup(); + this.orm = useService("orm"); + this.store = useService("mail.store"); + this.action = useService("action"); + this.busService = useService("bus_service"); + this.dropdown = useDropdownState(); + this.discussSystray = useDiscussSystray(this.dropdown); + this.fetchPending = false; + this.fetchRunning = false; + // Keep the badge live and correct: re-fetch the authoritative count + // whenever a tier review changes server-side, instead of nudging a + // running +/- delta. The absolute value is a len() and so can never go + // negative, which a delta could when an update reaches a user for whom + // the review was never part of their pending count. + // + // That re-fetch is not free: ``review_user_count`` costs a handful of + // queries per pending review, and the notification is broadcast to + // every reviewer. Approving a batch of documents therefore fans out to + // (reviewers x open tabs x documents) recounts, which is enough to + // occupy every HTTP worker. Coalesce the bursts: the leading edge keeps + // an isolated change instant, the trailing edge settles the final value. + this.debouncedFetch = useDebounced(() => this.fetchSystrayReviewer(), 15000, { + immediate: true, + trailing: true, + }); + this.fetchSystrayReviewer(); + this.busService.subscribe("base.tier.validation/updated", () => + this.debouncedFetch() + ); + this.busService.start(); + } + + async fetchSystrayReviewer() { + // A recount can outlast the debounce window on a busy database. Never + // let them overlap: remember that something changed and re-run once, + // instead of stacking concurrent calls on top of a slow one. + if (this.fetchRunning) { + this.fetchPending = true; + return; + } + this.fetchRunning = true; + try { + 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; + } finally { + this.fetchRunning = false; + } + if (this.fetchPending) { + this.fetchPending = false; + await this.fetchSystrayReviewer(); + } + } + + availableViews() { + return [ + [false, "kanban"], + [false, "list"], + [false, "form"], + [false, "activity"], + ]; + } + + openReviewGroup(group) { + this.dropdown.close(); + const context = {}; + const 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, + } + ); + } +} + +export const systrayItem = { + Component: TierReviewMenu, +}; + +registry + .category("systray") + .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 000000000..6eec839dc --- /dev/null +++ b/base_tier_validation/static/src/components/tier_review_menu/tier_review_menu.xml @@ -0,0 +1,69 @@ + + + + + + + +
+
+ No reviews to do. +
+
+ +
+ Review +
+
+
+ + 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 000000000..5475d1b25 --- /dev/null +++ b/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.esm.js @@ -0,0 +1,56 @@ +import {Component, proxy, useProps} from "@odoo/owl"; +import {registry} from "@web/core/registry"; +import {standardFieldProps} from "@web/views/fields/standard_field_props"; +import {useService} from "@web/core/utils/hooks"; + +export class ReviewsTable extends Component { + props = useProps(standardFieldProps); + + setup() { + super.setup(); + this.orm = useService("orm"); + this.state = proxy({ + collapse: false, + }); + } + + _getReviewData() { + const records = this.props.record.data.review_ids.records; + return records.map((record) => record.data); + } + + onToggleCollapse(ev) { + const panelHeading = ev.currentTarget.closest(".panel-heading"); + const collapseDiv = panelHeading.nextElementSibling.matches("div#collapse1") + ? panelHeading.nextElementSibling + : null; + if (!collapseDiv) return; + if (this.state.collapse) { + collapseDiv.style.display = "none"; + } else { + collapseDiv.style.display = "block"; + } + this.state.collapse = !this.state.collapse; + } +} + +ReviewsTable.template = "base_tier_validation.Collapse"; + +export const reviewsTableComponent = { + component: ReviewsTable, + supportedTypes: ["one2many"], + relatedFields: [ + {name: "id", type: "integer"}, + {name: "sequence", type: "integer"}, + {name: "name", type: "char"}, + {name: "display_status", type: "char"}, + {name: "todo_by", type: "char"}, + {name: "status", type: "char"}, + {name: "reviewed_formated_date", type: "char"}, + {name: "comment", type: "char"}, + {name: "requested_by", type: "many2one", relation: "partner"}, + {name: "done_by", type: "many2one", relation: "partner"}, + ], +}; + +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 000000000..cb86e6ca7 --- /dev/null +++ b/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.scss @@ -0,0 +1,28 @@ +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: 0 !important; +} + +.panel-body { + overflow-y: hidden; + overflow-x: auto; +} + +.panel-title > a, +.panel-title > a:active { + display: block; +} 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 000000000..677f5c348 --- /dev/null +++ b/base_tier_validation/static/src/components/tier_review_widget/tier_review_widget.xml @@ -0,0 +1,115 @@ + + + +
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SequenceRequested byDescriptionStatusTodo byDone byValidation DateComment
+ + + + + + + + + + + + + + + + + + + +
+
+
+
+
+
+
diff --git a/base_tier_validation/templates/tier_validation_templates.xml b/base_tier_validation/templates/tier_validation_templates.xml new file mode 100644 index 000000000..973723bbd --- /dev/null +++ b/base_tier_validation/templates/tier_validation_templates.xml @@ -0,0 +1,104 @@ + + + + + + diff --git a/base_tier_validation/tests/__init__.py b/base_tier_validation/tests/__init__.py new file mode 100644 index 000000000..9859e84ca --- /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 test_tier_validation +from . import test_tier_validation_reminder diff --git a/base_tier_validation/tests/common.py b/base_tier_validation/tests/common.py new file mode 100644 index 000000000..f86475ff6 --- /dev/null +++ b/base_tier_validation/tests/common.py @@ -0,0 +1,217 @@ +# 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 import Command +from odoo.fields import Domain +from odoo.orm.model_classes import add_to_registry +from odoo.tests import new_test_user + +from odoo.addons.base.tests.common import BaseCommon + + +class CommonTierValidation(BaseCommon): + _test_user_groups = None # FIXME list needed groups + + @classmethod + def setUpClass(cls): + super().setUpClass() + from .tier_validation_tester import ( + TierDefinition, + TierValidationTester, + TierValidationTester2, + TierValidationTesterComputed, + ) + + cls.TierValidationTester = TierValidationTester + cls.TierValidationTester2 = TierValidationTester2 + cls.TierValidationTesterComputed = TierValidationTesterComputed + model_defs = ( + TierValidationTester, + TierValidationTester2, + TierValidationTesterComputed, + TierDefinition, + ) + for model_def in model_defs: + add_to_registry(cls.registry, model_def) + + model_names = [ + "tier.validation.tester", + "tier.validation.tester2", + "tier.validation.tester.computed", + "tier.definition", + ] + cls.registry._setup_models__(cls.env.cr, model_names) + cls.registry.init_models( + cls.env.cr, + model_names[:-1], + {"models_to_check": True}, + ) + for model_name in model_names[:-1]: + cls.addClassCleanup(cls.registry.__delitem__, model_name) + + def _create_tier_definition(self, **values): + return self.tier_def_obj.create(values) + + def _setup_tier_definitions(self): + self.definition_1 = self.tier_definition = self._create_tier_definition( + model_id=self.tester_model.id, + review_type="individual", + reviewer_id=self.test_user_1.id, + definition_domain="[('test_field', '=', 1.0)]", + sequence=30, + ) + self.definition_2 = self._create_tier_definition( + model_id=self.tester_model.id, + review_type="individual", + reviewer_id=self.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", + ) + self.definition_3 = self._create_tier_definition( + model_id=self.tester_model.id, + review_type="individual", + reviewer_id=self.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", + ) + self.definition_4 = self._create_tier_definition( + model_id=self.tester_model.id, + review_type="individual", + reviewer_id=self.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", + ) + self.definition_5 = self._create_tier_definition( + model_id=self.tester_model_computed.id, + review_type="individual", + reviewer_id=self.test_user_1.id, + definition_domain="[]", + approve_sequence=True, + notify_on_pending=False, + sequence=20, + name="Definition for computed model", + ) + self.definition_6 = self._create_tier_definition( + model_id=self.tester_model_2.id, + review_type="individual", + reviewer_id=self.test_user_1.id, + definition_domain="[('test_field', '>=', 1.0)]", + approve_sequence=True, + notify_on_pending=False, + sequence=30, + name="Definition for test 30 - sequence - user 1 - main company", + company_id=self.main_company.id, + ) + self.definition_7 = self._create_tier_definition( + model_id=self.tester_model_2.id, + review_type="individual", + reviewer_id=self.test_user_3_multi_company.id, + definition_domain="[('test_field', '>=', 1.0)]", + approve_sequence=True, + notify_on_pending=False, + sequence=20, + name="Definition for test 30 - sequence - user 3 - main company", + company_id=self.main_company.id, + ) + self.definition_8 = self._create_tier_definition( + model_id=self.tester_model_2.id, + review_type="individual", + reviewer_id=self.test_user_3_multi_company.id, + definition_domain="[('test_field', '>=', 1.0)]", + approve_sequence=True, + notify_on_pending=False, + sequence=30, + name="Definition for test 30 - sequence - user 3 - other company", + company_id=self.other_company.id, + ) + + def setUp(self): + super().setUp() + self.test_model = self.env[self.TierValidationTester._name] + self.test_model_2 = self.env[self.TierValidationTester2._name] + self.test_model_computed = self.env[self.TierValidationTesterComputed._name] + + self.tester_model = self.env["ir.model"].search( + Domain("model", "=", "tier.validation.tester") + ) + self.tester_model_2 = self.env["ir.model"].search( + Domain("model", "=", "tier.validation.tester2") + ) + self.tester_model_computed = self.env["ir.model"].search( + Domain("model", "=", "tier.validation.tester.computed") + ) + # Create a multi-company + self.main_company = self.env.ref("base.main_company") + self.other_company = self.env["res.company"].create( + {"name": f"My Company {self._testMethodName}"} + ) + + models = ( + self.tester_model, + self.tester_model_2, + self.tester_model_computed, + ) + for model in models: + # Access record: + self.env["ir.access"].create( + { + "name": f"access {model.name}", + "model_id": model.id, + "group_id": self.env.ref("base.group_user").id, + "operation": "crud", + } + ) + + # Define views to avoid automatic views with all fields. + self.env["ir.ui.view"].create( + { + "model": model.model, + "name": f"Demo view for {model}", + "arch": """
+
+
+ + + +
""", + } + ) + + # Create users: + self.test_user_1 = new_test_user( + self.env, name="John", login="test1", groups="base.group_system" + ) + self.test_user_2 = new_test_user(self.env, name="Mike", login="test2") + self.test_user_3_multi_company = new_test_user( + self.env, + name="Jane", + login="test3", + company_ids=[Command.set([self.main_company.id, self.other_company.id])], + ) + # Create groups + self.test_group = self.env["res.groups"].create( + { + "name": "TestGroup", + "user_ids": [ + Command.link(self.test_user_1.id), + Command.link(self.test_user_2.id), + ], + } + ) + # Create tier definitions: + self.tier_def_obj = self.env["tier.definition"] + self._setup_tier_definitions() + + self.test_record = self.test_model.create({"test_field": 1.0}) + self.test_record_2 = self.test_model_2.create({"test_field": 1.0}) + self.test_record_computed = self.test_model_computed.create({"test_field": 1.0}) 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 000000000..19196b4f3 --- /dev/null +++ b/base_tier_validation/tests/test_tier_validation.py @@ -0,0 +1,1888 @@ +# 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 import Command +from odoo.exceptions import AccessError, ValidationError +from odoo.fields import Domain +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.validate_tier() + self.assertEqual(record.validation_status, "validated") + + def test_exclude_requester_drops_requester_from_group(self): + """With ``exclude_requester=True`` on a group review type, the + requester is removed from the tier's reviewer pool so they + cannot auto-validate their own request -- enforcing a + four-eyes principle without custom Python.""" + # Build a group containing both users and a tier definition + # that points at it. test_user_1 will be the requester; the + # group also includes test_user_1, so without the four-eyes + # flag they'd be in their own review's reviewer_ids. + group = self.env["res.groups"].create( + { + "name": "Four-eyes Reviewers", + "user_ids": [ + Command.link(self.test_user_1.id), + Command.link(self.test_user_2.id), + ], + } + ) + # Use the existing definition so we don't get extra reviews on + # tier_definition_1's individual reviewer. + self.tier_definition.write( + { + "review_type": "group", + "reviewer_id": False, + "reviewer_group_id": group.id, + "exclude_requester": True, + } + ) + record = self.test_model.create({"test_field": 1.0}) + record.with_user(self.test_user_1).request_validation() + review = record.review_ids.filtered( + lambda r: r.definition_id == self.tier_definition + ) + # The requester (test_user_1) is excluded; only test_user_2 + # remains as a valid reviewer. + self.assertIn(self.test_user_2, review.reviewer_ids) + self.assertNotIn(self.test_user_1, review.reviewer_ids) + # The requester therefore cannot self-validate. + self.assertFalse(record.with_user(self.test_user_1).can_review) + self.assertTrue(record.with_user(self.test_user_2).can_review) + + def test_exclude_requester_off_keeps_legacy_behavior(self): + """Without the flag, a requester who happens to be a member of + the configured reviewer group is included in reviewer_ids and + can auto-validate -- which is the legacy behaviour and must + keep working for backwards compatibility.""" + group = self.env["res.groups"].create( + { + "name": "Open Reviewers", + "user_ids": [Command.link(self.test_user_1.id)], + } + ) + self.tier_definition.write( + { + "review_type": "group", + "reviewer_id": False, + "reviewer_group_id": group.id, + # exclude_requester left at its default of False + } + ) + record = self.test_model.create({"test_field": 1.0}) + record.with_user(self.test_user_1).request_validation() + review = record.review_ids.filtered( + lambda r: r.definition_id == self.tier_definition + ) + self.assertIn(self.test_user_1, review.reviewer_ids) + self.assertTrue(record.with_user(self.test_user_1).can_review) + + 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.reject_tier() + self.assertTrue(record.review_ids) + self.assertEqual(record.validation_status, "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) + 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) + 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) + self.assertIn(self.test_user_1, record.reviewer_ids) + res = self.test_model.search(Domain("reviewer_ids", "in", self.test_user_1.id)) + 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() + test_record.with_user(self.test_user_2.id).request_validation() + self.test_record_2.with_user(self.test_user_2.id).request_validation() + # 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() + self.assertEqual( + next(filter(lambda doc: doc["model"] == "tier.validation.tester", docs))[ + "pending_count" + ], + 2, + ) + self.assertEqual( + next(filter(lambda doc: doc["model"] == "tier.validation.tester2", docs))[ + "pending_count" + ], + 1, + ) + + def test_11_add_comment(self): + # Create new test record + test_record = self.test_model.create({"test_field": 2.5}) + # Create tier definitions + tier_def = 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, + "comment_approve_default": "Approved", + } + ) + # Request validation -- auto-promotes the single review to pending. + 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) + res = record.validate_tier() + ctx = res.get("context") + # Default comment pre-filled from tier definition + self.assertEqual(ctx.get("default_comment"), "Approved") + wizard = Form(self.env["comment.wizard"].with_context(**ctx)) + self.assertEqual(wizard.comment, "Approved") + + # Clear default approve comment + tier_def.write({"comment_approve_default": False}) + + res = record.validate_tier() + ctx = res.get("context") + self.assertEqual(ctx.get("default_comment"), "") + wizard = Form(self.env["comment.wizard"].with_context(**ctx)) + self.assertEqual(wizard.comment, "") + 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) + 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_validate(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) + self.assertTrue(record1.can_review) + record2 = test_record.with_user(self.test_user_2.id) + 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_reject(self): + # Create new test record + test_record = self.test_model.create({"test_field": 2.5}) + # Create tier definitions + tier_def_1 = 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, + } + ) + tier_def_2 = 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": 20, + } + ) + tier_def_3 = self.tier_def_obj.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_3_multi_company.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) + record = test_record.with_user(self.test_user_1.id) + self.assertTrue(record.can_review) + # User 1 validates the record, extra reviews should be cancel. + self.assertFalse(any(r.status == "approved" for r in record.review_ids)) + record.reject_tier() + self.assertTrue(any(r.status == "rejected" for r in record.review_ids)) + self.assertTrue(any(r.status == "cancel" for r in record.review_ids)) + review_1 = record.review_ids.filtered(lambda x: x.definition_id == tier_def_1) + self.assertEqual(review_1.status, "rejected") + review_2 = record.review_ids.filtered(lambda x: x.definition_id == tier_def_2) + self.assertEqual(review_2.status, "cancel") + review_3 = record.review_ids.filtered(lambda x: x.definition_id == tier_def_3) + self.assertEqual(review_3.status, "cancel") + + 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) + self.assertTrue(record1.can_review) + # Validation will be all by sequence + self.assertEqual(len(record1.review_ids), 2) + self.assertEqual( + 1, 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")) + ) + self.assertEqual( + 1, len(record1.review_ids.filtered(lambda x: x.status == "pending")) + ) + self.assertEqual( + 1, len(record1.review_ids.filtered(lambda x: x.status == "approved")) + ) + record1.validate_tier() + self.assertEqual( + 0, len(record1.review_ids.filtered(lambda x: x.status == "waiting")) + ) + self.assertEqual( + 0, len(record1.review_ids.filtered(lambda x: x.status == "pending")) + ) + self.assertEqual( + 2, len(record1.review_ids.filtered(lambda x: x.status == "approved")) + ) + record1.validate_tier() + self.assertEqual( + 0, len(record1.review_ids.filtered(lambda x: x.status == "waiting")) + ) + self.assertEqual( + 0, len(record1.review_ids.filtered(lambda x: x.status == "pending")) + ) + self.assertEqual( + 2, len(record1.review_ids.filtered(lambda x: x.status == "approved")) + ) + + 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 + Sequence of reviewers: A, A, B, A. + When A validates, it should only validate the first two (A, A) and stop at B. + """ + # Create new test record + test_record = self.test_model.create({"test_field": 2.5}) + # Create tier definitions + # sequence 40 (User 1) + 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": 40, + } + ) + # sequence 30 (User 1) + 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": 30, + } + ) + # sequence 20 (User 2) + 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, + "approve_sequence_bypass": True, + "sequence": 20, + } + ) + # sequence 10 (User 1) + 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) + self.assertTrue(record1.can_review) + # When the first tier is validated, all the rest will be approved. + self.assertEqual(len(record1.review_ids), 4) + self.assertEqual( + 3, 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() + # After user 1 validates, they should have approved exactly 2 tiers: 40 and 30 + # 20 and 10 should be pending. + self.assertEqual( + 2, len(record1.review_ids.filtered(lambda x: x.status == "pending")) + ) + self.assertEqual( + 0, len(record1.review_ids.filtered(lambda x: x.status == "waiting")) + ) + self.assertEqual( + 2, len(record1.review_ids.filtered(lambda x: x.status == "approved")) + ) + self.assertFalse(record1.can_review) + # User 2 validates. + record2 = test_record.with_user(self.test_user_2.id) + self.assertTrue(record2.can_review) + record2.validate_tier() + self.assertEqual( + 1, len(record1.review_ids.filtered(lambda x: x.status == "pending")) + ) + self.assertEqual( + 0, len(record1.review_ids.filtered(lambda x: x.status == "waiting")) + ) + self.assertEqual( + 3, len(record1.review_ids.filtered(lambda x: x.status == "approved")) + ) + # User 1 validates the final tier. + self.assertTrue(record1.can_review) + 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")) + ) + self.assertEqual( + 4, len(record1.review_ids.filtered(lambda x: x.status == "approved")) + ) + self.assertEqual(record1.validation_status, "validated") + + def test_13_onchange_review_type(self): + tier_def_id = self.tier_def_obj.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_1.id, + "definition_domain": "[('test_field', '>', 1.0)]", + "approve_sequence": True, + } + ) + self.assertTrue(tier_def_id.reviewer_id) + tier_def_id.review_type = "group" + tier_def_id.onchange_review_type() + self.assertFalse(tier_def_id.reviewer_id) + + def test_14_onchange_review_type(self): + tier_def_id = self.tier_def_obj.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_1.id, + "definition_domain": "[('test_field', '>', 1.0)]", + "approve_sequence": True, + } + ) + self.assertTrue(tier_def_id.reviewer_id) + tier_def_id.review_type = "group" + tier_def_id.onchange_review_type() + self.assertFalse(tier_def_id.reviewer_id) + + def test_15_review_user_count(self): + # Create new test record + test_record = self.test_model.create({"test_field": 2.5}) + # Create tier definitions + self.tier_def_obj.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_1.id, + "definition_domain": "[('test_field', '>', 1.0)]", + "has_comment": True, + } + ) + # Request validation + review = test_record.with_user(self.test_user_2).request_validation() + self.assertTrue(review) + self.assertTrue(self.test_user_1.review_ids) + 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 - test notification message bodies + self.assertIn("created", self.test_record._notify_created_review_body()) + self.assertNotEqual(self.test_record.validation_status, "validated") + 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) + 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() + 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_16b_review_user_count_no_model_access(self): + """Reviewer without ir.access read on the validated model must + not crash the systray endpoint. Regression: the systray called + Model.with_user(user).search(...) which raises AccessError when the + user has no read access (e.g. tier definition on account.move for a + non-accounting user).""" + test_record = self.test_model.create({"test_field": 2.5}) + self.tier_def_obj.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_2.id, + "definition_domain": "[('test_field', '>', 1.0)]", + } + ) + test_record.with_user(self.test_user_1).request_validation() + self.assertTrue(self.test_user_2.review_ids) + # Revoke read access on the validated model for non-superadmin users. + self.env["ir.access"].search( + Domain("model_id", "=", self.tester_model.id) + ).unlink() + # Sanity check: a direct search now raises AccessError. + with self.assertRaises(AccessError): + self.test_model.with_user(self.test_user_2).search([]) + # The systray endpoint must swallow that error and return []. + result = self.test_user_2.with_user(self.test_user_2).review_user_count() + self.assertEqual(result, []) + + def _revoke_tester_model_access(self): + """Make the tester model unreadable for non-admin users by + unlinking its ir.access permission (unlink clears the access cache).""" + self.env["ir.access"].search( + Domain("model_id", "=", self.tester_model.id) + ).unlink() + + def test_definition_onchange_warns_when_reviewer_lacks_access(self): + """Setting an individual reviewer with no read access on the target + model returns a non-blocking onchange warning.""" + # Revoke first so the per-record check_access cache for test_user_2 + # never gets populated with a stale "allowed" result. + self._revoke_tester_model_access() + definition = self.tier_def_obj.new( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_2.id, + } + ) + warning = definition._onchange_warn_reviewer_access() + self.assertIsNotNone(warning) + self.assertIn(self.test_user_2.display_name, warning["warning"]["message"]) + + def test_definition_onchange_warns_when_group_member_lacks_access(self): + """Group reviewer: if any member of the assigned group lacks read + access on the target model, the onchange warns and names them.""" + # Put test_user_2 in a fresh group; revoke the public ACL. + group = self.env["res.groups"].create( + {"name": "Tier Reviewers", "user_ids": [Command.link(self.test_user_2.id)]} + ) + self._revoke_tester_model_access() + definition = self.tier_def_obj.new( + { + "model_id": self.tester_model.id, + "review_type": "group", + "reviewer_group_id": group.id, + } + ) + warning = definition._onchange_warn_reviewer_access() + self.assertIsNotNone(warning) + self.assertIn(self.test_user_2.display_name, warning["warning"]["message"]) + + def test_definition_onchange_skips_field_review_type(self): + """The 'field' review type cannot be checked ahead of time -- the + reviewer only resolves at validation time -- so the onchange + returns no warning even if the ACL would block.""" + self._revoke_tester_model_access() + definition = self.tier_def_obj.new( + { + "model_id": self.tester_model.id, + "review_type": "field", + } + ) + self.assertIsNone(definition._onchange_warn_reviewer_access()) + + def test_definition_onchange_returns_nothing_when_no_problem(self): + """The onchange must stay silent when there's nothing to warn + about. Covers the three early-return branches: + + - no model selected yet (``model_id`` empty); + - no reviewer set yet on a model that has one; + - reviewer has model access (default ACL in place). + """ + # No model -> early return on `if not (model_name and ...):`. + definition = self.tier_def_obj.new({"review_type": "individual"}) + self.assertIsNone(definition._onchange_warn_reviewer_access()) + # No reviewer -> early return on `if not users:`. + definition = self.tier_def_obj.new( + { + "model_id": self.tester_model.id, + "review_type": "individual", + } + ) + self.assertIsNone(definition._onchange_warn_reviewer_access()) + # Reviewer with access (default public ACL is in place) -> the + # access check finds nothing to flag and the onchange returns + # None at the `if not no_access:` exit. + definition = self.tier_def_obj.new( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_2.id, + } + ) + self.assertIsNone(definition._onchange_warn_reviewer_access()) + + def test_reviewers_without_model_access_unknown_model(self): + """When the target model name doesn't resolve (e.g. a stale + reference after an uninstall), the helper returns an empty + res.users recordset without raising.""" + result = self.tier_def_obj._reviewers_without_model_access( + "this.model.does.not.exist", self.test_user_2 + ) + self.assertFalse(result) + self.assertEqual(result._name, "res.users") + + def test_17_search_records_no_validation(self): + """Search for records that have no validation process started""" + records = self.env["tier.validation.tester"].search( + Domain("reviewer_ids", "=", False) + ) + self.assertEqual(len(records), 1) + self.test_record.with_user(self.test_user_2.id).request_validation() + self.test_record.with_user(self.test_user_1.id) + records = self.env["tier.validation.tester"].search( + Domain("reviewer_ids", "=", False) + ) + self.assertEqual(len(records), 0) + + def test_18_test_review_by_res_users_field(self): + selected_field = self.env["ir.model.fields"].search( + Domain("model", "=", self.test_model._name) & Domain("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 -- the first review must be promoted to ``pending`` + # automatically; the second one stays ``waiting`` until its turn. + review = test_record.request_validation() + + self.assertTrue(review) + review_1 = tier_review_obj.browse(review.ids[0]) + review_2 = tier_review_obj.browse(review.ids[1]) + review_1.invalidate_model() + self.assertTrue(review_1.status == "pending") + # ``next_review`` must contain the pending review's definition name, + # not the str-representation of an empty recordset (e.g. ``tier.review()``). + test_record.invalidate_recordset(["next_review"]) + self.assertEqual(test_record.next_review, f"Next: {review_1.name}") + # 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_19a_notify_on_pending_sequence_negative(self): + """When ``approve_sequence`` is used, only the first reviewer in the + chain must receive a ``notify_on_pending`` notification. The next + reviewer must NOT be subscribed and must NOT receive a message until + their predecessor has approved. + """ + # Fresh definitions so the test is self-contained: both have + # ``notify_on_pending=True`` so the difference between sequence + # positions is what is being asserted. Use a ``test_field`` value + # that does NOT match any definition created by ``common.py`` so + # only these two definitions apply. + TierDefinition = self.env["tier.definition"] + test_record = self.test_model.create({"test_field": 2.5}) + def_first = TierDefinition.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_1.id, + "definition_domain": "[('test_field', '=', 2.5)]", + "approve_sequence": True, + "notify_on_pending": True, + "sequence": 20, + "name": "First in sequence -- user 1", + } + ) + def_second = TierDefinition.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_2.id, + "definition_domain": "[('test_field', '=', 2.5)]", + "approve_sequence": True, + "notify_on_pending": True, + "sequence": 10, + "name": "Second in sequence -- user 2", + } + ) + + reviews = test_record.request_validation() + # ``request_validation`` iterates definitions in ``sequence desc``, so + # def_first (sequence=20) becomes tier.review.sequence=1 and def_second + # (sequence=10) becomes tier.review.sequence=2. + review_first = reviews.filtered(lambda r: r.definition_id == def_first) + review_second = reviews.filtered(lambda r: r.definition_id == def_second) + self.assertEqual(review_first.status, "pending") + self.assertEqual(review_second.status, "waiting") + + # Exactly one chatter message must have been posted -- for the first + # reviewer reaching ``pending``. The second reviewer must not have been + # subscribed yet and must not have been notified. + self.assertEqual(len(test_record.message_ids), 1) + first_message = test_record.message_ids + # The body must name the assignee (so the recipient sees at a glance + # that the message is for them, since chatter does not render the + # "Notified to" pill for system notifications) and attribute the + # request to the original requester. + self.assertIn(review_first.todo_by, first_message.body) + self.assertIn(self.env.user.display_name, first_message.body) + followers = test_record.message_follower_ids + self.assertIn(self.test_user_1.partner_id, followers.mapped("partner_id")) + self.assertNotIn( + self.test_user_2.partner_id, + followers.mapped("partner_id"), + "Second-tier reviewer must not be subscribed to the record before " + "their turn.", + ) + self.assertNotIn( + self.test_user_2.partner_id, + first_message.notified_partner_ids, + "Second-tier reviewer must not be notified before their " + "predecessor has approved.", + ) + + # Once the first reviewer approves, the second review must reach + # ``pending`` AND its reviewer must receive their own notification. + test_record.with_user(self.test_user_1).validate_tier() + self.assertEqual(review_first.status, "approved") + self.assertEqual(review_second.status, "pending") + followers = test_record.message_follower_ids + self.assertIn(self.test_user_2.partner_id, followers.mapped("partner_id")) + new_messages = test_record.message_ids - first_message + self.assertTrue(new_messages) + self.assertIn( + self.test_user_2.partner_id, + new_messages.mapped("notified_partner_ids"), + "Second-tier reviewer must be notified once promoted to pending.", + ) + # Regression guard for the attribution bug: ``env.user`` at second- + # tier promotion time is the tier-1 approver (``test_user_1``), but + # the body must attribute the request to the original requester + # (the env user when ``request_validation`` was called). The body + # must also name the second-tier assignee. + second_body = new_messages[0].body + self.assertIn(review_second.todo_by, second_body) + self.assertIn(self.env.user.display_name, second_body) + self.assertNotIn( + self.test_user_1.display_name, + second_body, + "Second-tier message must not attribute the request to the " + "tier-1 approver -- that's the wrong person.", + ) + + def test_19c_no_premature_promotion_on_subset(self): + """Regression: ``_update_review_status`` run on a *subset* of a record's + reviews -- as ``review_user_count`` does per user, via + ``user.review_ids._update_review_status()`` -- must gate the sequence + over the *whole* record, not the subset. Otherwise a later-tier review + is promoted to ``pending`` before its predecessor is approved, which + both hides it from the reviewer's systray (``can_review`` is False while + the lower tier is still pending) and fires a ``notify_on_pending`` + message authored by -- and so never delivered to -- that reviewer. + """ + TierDefinition = self.env["tier.definition"] + test_record = self.test_model.create({"test_field": 2.5}) + TierDefinition.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_1.id, + "definition_domain": "[('test_field', '=', 2.5)]", + "approve_sequence": True, + "notify_on_pending": True, + "sequence": 20, + "name": "First in sequence -- user 1", + } + ) + TierDefinition.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_2.id, + "definition_domain": "[('test_field', '=', 2.5)]", + "approve_sequence": True, + "notify_on_pending": True, + "sequence": 10, + "name": "Second in sequence -- user 2", + } + ) + reviews = test_record.request_validation() + review_second = reviews.filtered(lambda r: self.test_user_2 in r.reviewer_ids) + self.assertEqual(review_second.status, "waiting") + messages_before = test_record.message_ids + + # Simulate the second-tier reviewer opening their systray: the promotion + # runs on *only* their own review -- the subset that excludes the + # first-tier predecessor. + review_second._update_review_status() + review_second.invalidate_recordset() + + self.assertEqual( + review_second.status, + "waiting", + "A later-tier review must stay 'waiting' until its predecessor is " + "approved, even when _update_review_status runs on a subset that " + "excludes the predecessor.", + ) + self.assertEqual( + test_record.message_ids, + messages_before, + "No notify_on_pending message must be posted from promoting a later " + "tier out of order.", + ) + + def test_19b_notify_review_available_no_op_when_no_users(self): + """``_notify_review_available`` must short-circuit (no follower + added, no chatter message posted) when none of the passed reviews + actually wants ``notify_on_pending``. This is the defensive contract + that prevents stray subtype messages routed to nobody. + """ + TierDefinition = self.env["tier.definition"] + test_record = self.test_model.create({"test_field": 2.5}) + silent_def = TierDefinition.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_1.id, + "definition_domain": "[('test_field', '=', 2.5)]", + "notify_on_pending": False, + "sequence": 10, + "name": "Silent definition -- no notify_on_pending", + } + ) + reviews = test_record.request_validation() + silent_review = reviews.filtered(lambda r: r.definition_id == silent_def) + self.assertTrue(silent_review) + + followers_before = test_record.message_follower_ids + messages_before = test_record.message_ids + test_record._notify_review_available(silent_review) + self.assertEqual(test_record.message_follower_ids, followers_before) + self.assertEqual(test_record.message_ids, messages_before) + + def test_19c_to_validate_message_names_assignee(self): + """The ``to_validate_message`` Html field -- which the banner + template renders above the document -- must surface *who* the + record is pending on (using ``tier.review.todo_by``) rather + than the generic "This Record needs to be validated". + """ + # Use a value that matches only the common.py definition_3 (sequence + # 10, reviewer test_user_2) -- and definition_2 (sequence 20, + # reviewer test_user_1). After ``_update_review_status`` only the + # lowest-sequence review is promoted to ``pending``. + test_record = self.test_model.create({"test_field": 3.5}) + reviews = test_record.request_validation() + self.assertTrue(reviews) + # Manually promote (since common.py's test_user_1 is not the + # requester, request_validation in 19.0 leaves the reviews in + # ``waiting`` unless ``notify_on_create`` triggers it). + reviews._update_review_status() + pending = reviews.filtered(lambda r: r.status == "pending") + self.assertEqual(len(pending), 1) + test_record.invalidate_recordset(["to_validate_message"]) + msg = test_record.to_validate_message or "" + # The banner must name the pending assignee... + self.assertIn(pending.todo_by, msg) + # ...and must not fall back to the generic record-name phrasing. + self.assertNotIn("needs to be validated", msg) + + def test_19d_to_validate_message_falls_back_when_no_pending(self): + """When no review has reached ``pending`` (e.g. the defensive + ``waiting`` edge case), the banner must fall back to the + model-name phrasing so the document still has something useful. + """ + # Force-create a review row directly and leave it ``waiting`` so + # the pending filter is empty. (``request_validation`` would + # auto-promote one in normal flow.) + test_record = self.test_model.create({"test_field": 3.5}) + self.env["tier.review"].create( + { + "model": self.test_model._name, + "res_id": test_record.id, + "definition_id": self.definition_2.id, + "sequence": 1, + "status": "waiting", + } + ) + test_record.invalidate_recordset(["to_validate_message"]) + msg = test_record.to_validate_message or "" + self.assertIn("needs to be validated", msg) + self.assertIn(self.test_model._description, msg) + + 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 -- with no approve_sequence the single review must + # be promoted to ``pending`` automatically and ``notify_on_pending`` + # must trigger a chatter message. + review = test_record2.request_validation() + self.assertTrue(review) + review_1 = tier_review_obj.browse(review.ids[0]) + review_1.invalidate_model() + self.assertTrue(review_1.status == "pending") + msg2 = test_record2.message_ids[0].body + # The promotion body now carries the assignee + the original + # requester (sourced from ``review.requested_by``, not env.user). + request = test_record2._notify_requested_review_body(review_1) + self.assertIn(request, msg2) + self.assertIn(review_1.todo_by, msg2) + self.assertIn(review_1.requested_by.display_name, msg2) + + def test_21_notify_on_create(self): + # notify on create + tier_definition = self.env["tier.definition"].search(Domain.TRUE) + 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( + Domain("res_partner_id", "=", self.test_user_1.partner_id.id) + ) + ) + test_record_1.request_validation() + notifications_no_2 = len( + self.env["mail.notification"].search( + Domain("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( + Domain("res_partner_id", "=", self.test_user_1.partner_id.id) + ) + ) + test_record_2.request_validation() + notifications_no_2 = len( + self.env["mail.notification"].search( + Domain("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( + { + "group_ids": [Command.set(self.env.ref("base.group_system").ids)], + } + ) + + # notify on accepted + tier_definition = self.env["tier.definition"].search(Domain.TRUE) + 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() + record = test_record_1.with_user(self.test_user_2.id) + notifications_no_1 = len( + self.env["mail.notification"].search( + Domain("res_partner_id", "=", self.test_user_1.partner_id.id) + ) + ) + record.validate_tier() + notifications_no_2 = len( + self.env["mail.notification"].search( + Domain("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.with_user(self.test_user_2.id) + notifications_no_1 = len( + self.env["mail.notification"].search( + Domain("res_partner_id", "=", self.test_user_1.partner_id.id) + ) + ) + test_record_2.validate_tier() + notifications_no_2 = len( + self.env["mail.notification"].search( + Domain("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( + { + "group_ids": [Command.set(self.env.ref("base.group_system").ids)], + } + ) + + # notify on rejected + tier_definition = self.env["tier.definition"].search(Domain.TRUE) + 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() + record = test_record_1.with_user(self.test_user_2.id) + notifications_no_1 = len( + self.env["mail.notification"].search( + Domain("res_partner_id", "=", self.test_user_1.partner_id.id) + ) + ) + record.reject_tier() + notifications_no_2 = len( + self.env["mail.notification"].search( + Domain("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.with_user(self.test_user_2.id) + + notifications_no_1 = len( + self.env["mail.notification"].search( + Domain("res_partner_id", "=", self.test_user_1.partner_id.id) + ) + ) + test_record_2.reject_tier() + notifications_no_2 = len( + self.env["mail.notification"].search( + Domain("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( + { + "group_ids": [Command.set(self.env.ref("base.group_system").ids)], + } + ) + + # notify on restarted + tier_definition = self.env["tier.definition"].search(Domain.TRUE) + 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() + record = test_record_1.with_user(self.test_user_2.id) + notifications_no_1 = len( + self.env["mail.notification"].search( + Domain("res_partner_id", "=", self.test_user_1.partner_id.id) + ) + ) + record.restart_validation() + notifications_no_2 = len( + self.env["mail.notification"].search( + Domain("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( + Domain("res_partner_id", "=", self.test_user_1.partner_id.id) + ) + ) + test_record_2.restart_validation() + notifications_no_2 = len( + self.env["mail.notification"].search( + Domain("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( + { + "group_ids": [Command.set(self.env.ref("base.group_system").ids)], + } + ) + + # notify on restarted + tier_definition = self.env["tier.definition"].search(Domain.TRUE) + 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( + Domain("res_partner_id", "=", self.test_user_1.partner_id.id) + ) + ) + test_record.request_validation() + notifications_no_2 = len( + self.env["mail.notification"].search( + Domain("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( + Domain("res_partner_id", "=", self.test_user_1.partner_id.id) + ) + ) + record.validate_tier() + notifications_no_2 = len( + self.env["mail.notification"].search( + Domain("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( + Domain("res_partner_id", "=", self.test_user_1.partner_id.id) + ) + ) + record.restart_validation() + notifications_no_2 = len( + self.env["mail.notification"].search( + Domain("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( + Domain("res_partner_id", "=", self.test_user_1.partner_id.id) + ) + ) + record.reject_tier() + notifications_no_2 = len( + self.env["mail.notification"].search( + Domain("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( + { + "group_ids": [Command.set(self.env.ref("base.group_system").ids)], + } + ) + + # notify on restarted + tier_definition = self.env["tier.definition"].search(Domain.TRUE) + 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( + Domain("res_partner_id", "=", self.test_user_1.partner_id.id) + ) + ) + test_record.request_validation() + notifications_no_2 = len( + self.env["mail.notification"].search( + Domain("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( + Domain("res_partner_id", "=", self.test_user_1.partner_id.id) + ) + ) + record.validate_tier() + notifications_no_2 = len( + self.env["mail.notification"].search( + Domain("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( + Domain("res_partner_id", "=", self.test_user_1.partner_id.id) + ) + ) + record.restart_validation() + notifications_no_2 = len( + self.env["mail.notification"].search( + Domain("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( + Domain("res_partner_id", "=", self.test_user_1.partner_id.id) + ) + ) + record.reject_tier() + notifications_no_2 = len( + self.env["mail.notification"].search( + Domain("res_partner_id", "=", self.test_user_1.partner_id.id) + ) + ) + self.assertEqual(notifications_no_2, notifications_no_1) + + def test_27_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.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.validate_tier() + record.action_confirm() + self.assertEqual(record.validation_status, "validated") + # Unable to write test_validation_field after validation + # Simulate there are fields, but not test_validation_field + with ( + self.assertRaises(ValidationError), + 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_exception_fields=mock.MagicMock(return_value=_tvf), + _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_28_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.assertRaisesRegex( + ValidationError, + "This action needs to be validated", + ), + self.env.cr.savepoint(), + ): + self.test_record_computed.action_confirm() + # Flush manually to trigger the _write + self.test_record_computed.flush_recordset() + self.assertEqual(self.test_record_computed.state, "draft") + # The validation is performed -- the single review is auto-promoted + # to ``pending`` so the reviewer can act on it. + self.test_record_computed.request_validation() + self.test_record_computed.invalidate_recordset() + self.assertEqual(self.test_record_computed.review_ids.status, "pending") + 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.test_record_computed.flush_recordset() + self.assertFalse(self.test_record_computed.review_ids) + self.test_record_computed.invalidate_recordset() + + def test_29_allow_write_for_reviewers(self): + reviews = self.test_record.with_user(self.test_user_2.id).request_validation() + record = self.test_record.with_user(self.test_user_1.id) + record.invalidate_recordset() + with self.assertRaises(ValidationError): + record.with_user(self.test_user_1.id).write({"test_field": 0.3}) + reviews.definition_id.with_user(self.test_user_1.id).write( + {"allow_write_for_reviewer": True} + ) + record.with_user(self.test_user_1.id).write({"test_field": 0.3}) + + def test_30_request_validation_diff_company(self): + """ + Test validation request behavior with multi-company setup. + + Setup: + - Main company has 2 tier definitions: + - One for User1 (sequence 30) + - One for User3 (sequence 20) + - Other company has 1 tier definition: + - One for User3 (sequence 30) + + When record's company is set to 'other company': + - Only User3's tier definition from other company should be applied + - Should create only 1 review + """ + self.assertFalse(self.test_record_2.review_ids) + self.assertFalse(self.test_record_2.company_id) + self.assertEqual(self.test_user_3_multi_company.env.company, self.main_company) + + self.test_record_2.company_id = self.other_company + + reviews = self.test_record_2.with_user( + self.test_user_3_multi_company.id + ).request_validation() + + self.assertEqual(len(reviews), 1) + + def test_31_request_validation_same_company(self): + """ + Test validation request behavior with multi-company setup. + + Setup: + - Main company has 2 tier definitions: + - One for User1 (sequence 30) + - One for User3 (sequence 20) + - Other company has 1 tier definition: + - One for User3 (sequence 30) + + When record's company is set to 'main company': + - Both User1 and User3's tier definitions from main company should be applied + - Should create 2 reviews + """ + self.assertFalse(self.test_record_2.review_ids) + self.assertFalse(self.test_record_2.company_id) + self.assertEqual(self.test_user_3_multi_company.env.company, self.main_company) + + self.test_record_2.company_id = self.main_company + + reviews = self.test_record_2.with_user( + self.test_user_3_multi_company.id + ).request_validation() + + self.assertEqual(len(reviews), 2) + + def test_30_request_validation(self): + # Create new test record + test_record = self.test_model.create({"test_field": 1.0}) + # Create tier definitions for both tester models + self.tier_definition.write( + { + "approve_sequence": True, + "notify_on_create": True, + } + ) + def_2 = self.tier_def_obj.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_2.id, + "sequence": 20, + "approve_sequence": True, + "notify_on_create": False, + "notify_on_accepted": True, + } + ) + def_3 = self.tier_def_obj.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_3_multi_company.id, + "sequence": 10, + "approve_sequence": True, + "notify_on_create": False, + "notify_on_accepted": True, + } + ) + mt_tier_validation_requested = self.env.ref( + "base_tier_validation.mt_tier_validation_requested" + ) + mt_tier_validation_accepted = self.env.ref( + "base_tier_validation.mt_tier_validation_accepted" + ) + test_record.request_validation() + review_1 = test_record.review_ids.filtered( + lambda x: x.definition_id == self.tier_definition + ) + self.assertEqual(review_1.status, "pending") + review_2 = test_record.review_ids.filtered(lambda x: x.definition_id == def_2) + self.assertEqual(review_2.status, "waiting") + review_3 = test_record.review_ids.filtered(lambda x: x.definition_id == def_3) + self.assertEqual(review_3.status, "waiting") + followers = test_record.message_follower_ids + self.assertIn(self.test_user_1.partner_id, followers.mapped("partner_id")) + follower_1 = followers.filtered( + lambda x: x.partner_id == self.test_user_1.partner_id + ) + self.assertIn(mt_tier_validation_requested, follower_1.subtype_ids) + self.assertNotIn(mt_tier_validation_accepted, follower_1.subtype_ids) + self.assertNotIn(self.test_user_2.partner_id, followers.mapped("partner_id")) + self.assertNotIn( + self.test_user_3_multi_company.partner_id, followers.mapped("partner_id") + ) + old_messages = test_record.message_ids + test_record.with_user(self.test_user_1).validate_tier() + new_messages = test_record.message_ids - old_messages + self.assertEqual(len(new_messages), 1) + self.assertEqual(new_messages.subtype_id, mt_tier_validation_accepted) + self.assertEqual(self.test_user_2.partner_id, new_messages.notified_partner_ids) + self.assertEqual(review_1.status, "approved") + self.assertEqual(review_2.status, "pending") + self.assertEqual(review_3.status, "waiting") + followers = test_record.message_follower_ids + self.assertIn(self.test_user_1.partner_id, followers.mapped("partner_id")) + self.assertIn(self.test_user_2.partner_id, followers.mapped("partner_id")) + follower_2 = followers.filtered( + lambda x: x.partner_id == self.test_user_2.partner_id + ) + self.assertNotIn(mt_tier_validation_requested, follower_2.subtype_ids) + self.assertIn(mt_tier_validation_accepted, follower_2.subtype_ids) + self.assertNotIn( + self.test_user_3_multi_company.partner_id, followers.mapped("partner_id") + ) + old_messages = test_record.message_ids + test_record.with_user(self.test_user_2).validate_tier() + new_messages = test_record.message_ids - old_messages + self.assertEqual(len(new_messages), 1) + self.assertEqual(new_messages.subtype_id, mt_tier_validation_accepted) + self.assertEqual( + self.test_user_3_multi_company.partner_id, new_messages.notified_partner_ids + ) + self.assertEqual(review_1.status, "approved") + self.assertEqual(review_2.status, "approved") + self.assertEqual(review_3.status, "pending") + followers = test_record.message_follower_ids + self.assertIn(self.test_user_1.partner_id, followers.mapped("partner_id")) + self.assertIn(self.test_user_2.partner_id, followers.mapped("partner_id")) + self.assertIn( + self.test_user_3_multi_company.partner_id, followers.mapped("partner_id") + ) + follower_3 = followers.filtered( + lambda x: x.partner_id == self.test_user_3_multi_company.partner_id + ) + self.assertNotIn(mt_tier_validation_requested, follower_3.subtype_ids) + self.assertIn(mt_tier_validation_accepted, follower_3.subtype_ids) + old_messages = test_record.message_ids + test_record.with_user(self.test_user_3_multi_company).validate_tier() + new_messages = test_record.message_ids - old_messages + self.assertEqual(len(new_messages), 0) + + def test_31_request_validation(self): + # Create new test record + test_record = self.test_model.create({"test_field": 1.0}) + # Create tier definitions for both tester models + self.tier_definition.write( + { + "approve_sequence": True, + "notify_on_create": True, + } + ) + def_2 = self.tier_def_obj.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_2.id, + "sequence": 20, + "approve_sequence": True, + "notify_on_create": True, + "notify_on_accepted": True, + } + ) + def_3 = self.tier_def_obj.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_3_multi_company.id, + "sequence": 10, + "approve_sequence": True, + "notify_on_create": True, + "notify_on_accepted": True, + } + ) + test_record.request_validation() + review_1 = test_record.review_ids.filtered( + lambda x: x.definition_id == self.tier_definition + ) + self.assertEqual(review_1.status, "pending") + review_2 = test_record.review_ids.filtered(lambda x: x.definition_id == def_2) + self.assertEqual(review_2.status, "waiting") + review_3 = test_record.review_ids.filtered(lambda x: x.definition_id == def_3) + self.assertEqual(review_3.status, "waiting") + followers = test_record.message_follower_ids + self.assertIn(self.test_user_1.partner_id, followers.mapped("partner_id")) + self.assertIn(self.test_user_2.partner_id, followers.mapped("partner_id")) + self.assertIn( + self.test_user_3_multi_company.partner_id, followers.mapped("partner_id") + ) + + def test_32_test_review_by_res_groups_field(self): + """Test using field-based validation with groups""" + selected_field = self.env["ir.model.fields"].search( + Domain("model", "=", self.test_model._name) + & Domain("name", "=", "group_id") + ) + test_record = self.test_model.create( + {"test_field": 2.5, "group_id": self.test_group.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 | self.test_user_1) + + def test_33_test_review_by_wrong_field_type(self): + """Test using field-based validation with groups""" + selected_field = self.env["ir.model.fields"].search( + Domain("model", "=", self.test_model._name) & Domain("name", "=", "menu_id") + ) + test_record = self.test_model.create( + { + "test_field": 2.5, + "menu_id": self.env["ir.ui.menu"].search(Domain.TRUE, limit=1).id, + } + ) + self.assertTrue(test_record.menu_id) + 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, + } + ) + with self.assertRaisesRegex( + ValidationError, + "Validation reviewer field should be of the appropriate type", + ): + test_record.request_validation() + + def test_34_test_duplicate_new_user_should_not_have_review_ids(self): + """ + This test ensures that when a user with review_ids is duplicated and + the new user does not get the same review_ids. + """ + # Create new test record + test_record = self.test_model.create({"test_field": 2.5}) + # Create tier definitions + self.tier_def_obj.create( + { + "model_id": self.tester_model.id, + "review_type": "individual", + "reviewer_id": self.test_user_2.id, + "definition_domain": "[('test_field', '>', 1.0)]", + "has_comment": True, + } + ) + + # Request validation + review = test_record.request_validation() + self.assertTrue(review) + + # User Should have review_ids + self.assertTrue(self.test_user_2.review_ids.ids) + self.assertEqual( + self.test_user_2.review_ids.mapped("res_id"), + [test_record.id], + ) + + # Duplicate user + new_user = self.test_user_2.copy() + + # Review_ids should not be copied when duplicating a user + self.assertFalse(new_user.review_ids.ids) + + +@tagged("at_install", "-post_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/test_tier_validation_reminder.py b/base_tier_validation/tests/test_tier_validation_reminder.py new file mode 100644 index 000000000..08979a58d --- /dev/null +++ b/base_tier_validation/tests/test_tier_validation_reminder.py @@ -0,0 +1,46 @@ +# Copyright 2018-19 ForgeFlow S.L. (https://www.forgeflow.com) +# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html). + +from freezegun import freeze_time + +from odoo import fields +from odoo.tests.common import tagged + +from .common import CommonTierValidation + + +@tagged("post_install", "-at_install") +class TierTierValidation(CommonTierValidation): + def test_validation_reminder(self): + """Check the posting of reminder to reviews.""" + tier_definition = self.tier_definition + tier_definition.notify_reminder_delay = 3 + + # Request a review today + self.test_record.with_user(self.test_user_2.id).request_validation() + review = self.env["tier.review"].search( + [("definition_id", "=", tier_definition.id)] + ) + self.assertTrue(review) + self.assertEqual(review.last_reminder_date, False) + + # 2 days later no reminder should be posted + in_2_days = fields.Datetime.add(fields.Datetime.now(), days=2) + with freeze_time(in_2_days): + tier_definition._cron_send_review_reminder() + self.assertEqual(review.last_reminder_date, False) + # 4 days later first reminder + in_4_days = fields.Datetime.add(fields.Datetime.now(), days=4) + with freeze_time(in_4_days): + self.tier_definition._cron_send_review_reminder() + self.assertEqual(review.last_reminder_date, in_4_days) + # 5 days later no new reminder + in_6_days = fields.Datetime.add(fields.Datetime.now(), days=6) + with freeze_time(in_6_days): + self.tier_definition._cron_send_review_reminder() + self.assertEqual(review.last_reminder_date, in_4_days) + # 9 days later second reminder + in_9_days = fields.Datetime.add(fields.Datetime.now(), days=9) + with freeze_time(in_9_days): + self.tier_definition._cron_send_review_reminder() + self.assertEqual(review.last_reminder_date, in_9_days) 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 000000000..dd2400fa9 --- /dev/null +++ b/base_tier_validation/tests/tier_validation_tester.py @@ -0,0 +1,118 @@ +# Copyright 2018-19 ForgeFlow S.L. (https://www.forgeflow.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class TierValidationTester(models.Model): + _name = "tier.validation.tester" + _description = "Tier Validation Tester" + _inherit = ["tier.validation", "mail.thread"] # noqa: RUF012 + _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") + group_id = fields.Many2one("res.groups", string="Assigned to (group)") + menu_id = fields.Many2one( + "ir.ui.menu", help="For testing choosing a wrong field type" + ) + + def action_confirm(self): + self.write({"state": "confirmed"}) + + +class TierValidationTester2(models.Model): + _name = "tier.validation.tester2" + _description = "Tier Validation Tester 2" + _inherit = ["tier.validation"] # noqa: RUF012 + _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") + company_id = fields.Many2one(comodel_name="res.company") + + 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"] # noqa: RUF012 + _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): + self.write({"confirmed": True}) + + def action_cancel(self): + 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/tier_definition_view.xml b/base_tier_validation/views/tier_definition_view.xml new file mode 100644 index 000000000..761f07676 --- /dev/null +++ b/base_tier_validation/views/tier_definition_view.xml @@ -0,0 +1,179 @@ + + + + + tier.definition.list + 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 000000000..d5a2a17b4 --- /dev/null +++ b/base_tier_validation/views/tier_review_view.xml @@ -0,0 +1,25 @@ + + + + + tier.review.list + 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 000000000..d7845c898 --- /dev/null +++ b/base_tier_validation/views/tier_validation_exception_view.xml @@ -0,0 +1,123 @@ + + + + + tier.validation.exception.list + 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 000000000..92bd0df50 --- /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 000000000..5c5a6c933 --- /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 000000000..aec3efe9b --- /dev/null +++ b/base_tier_validation/wizard/comment_wizard_view.xml @@ -0,0 +1,26 @@ + + + + + Comment Wizard + comment.wizard + form + +
+ + + + +
+
+
+