diff --git a/base_tier_validation/README.rst b/base_tier_validation/README.rst new file mode 100644 index 0000000000..bd605776f1 --- /dev/null +++ b/base_tier_validation/README.rst @@ -0,0 +1,233 @@ +==================== +Base Tier Validation +==================== + +.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Mature-brightgreen.png + :target: https://odoo-community.org/page/development-status + :alt: Mature +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fserver--ux-lightgray.png?logo=github + :target: https://github.com/OCA/server-ux/tree/15.0/base_tier_validation + :alt: OCA/server-ux +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/server-ux-15-0/server-ux-15-0-base_tier_validation + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png + :target: https://runbot.odoo-community.org/runbot/250/15.0 + :alt: Try me on Runbot + +|badge1| |badge2| |badge3| |badge4| |badge5| + +Validating some operations is a common need across different areas in a company +and sometimes it also involves several people and stages in the process. With +this module you will be able to define your custom validation workflows for +any Odoo document. + +This module does not provide a functionality by itself but an abstract model +to implement a validation process based on tiers on other models (e.g. +purchase orders, sales orders, budgets, expenses...). + +**Note:** To be able to use this module in a new model you will need some +development. + +See `purchase_tier_validation `_ as an example of implementation. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +To configure this module, you need to: + +#. Go to *Settings > Technical > Tier Validations > Tier Definition*. +#. Create as many tiers as you want for any model having tier validation + functionality. + +**Note:** + +* If check *Notify Reviewers on Creation*, all possible reviewers will be notified by email when this definition is triggered. +* If check *Comment*, reviewers can comment after click Validate or Reject. +* If check *Approve by sequence*, reviewers is forced to review by specified sequence. + +Known issues / Roadmap +====================== + +This is the list of known issues for this module. Any proposal for improvement will +be very valuable. + +* **Issue:** + + When using `approve_sequence` option in any tier.definition there can be inconsistencies + in the systray notifications. + + **Description:** + + Field `can_review` in tier.review is used to filter out, in the systray notifications, + the reviews a user can approve. This `can_review` field is updated **in the database** + in method `review_user_count`, this can make it very inconsistent for databases + with a lot of users and recurring updates that can change the expected behavior. + +* **Migration to 15.0:** + + The parameter _tier_validation_manual_config will become False, on 14.0, the default + value is True, as the change is applied after the migration. In order to use the new + behavior we need to modify the value on our expected model. + +Changelog +========= + +14.0.1.0.0 (2020-11-19) +~~~~~~~~~~~~~~~~~~~~~~~ + +Migrated to Odoo 14. + +13.0.1.2.2 (2020-08-30) +~~~~~~~~~~~~~~~~~~~~~~~ + +Fixes: + +- When using approve_sequence option in any tier.definition there can be inconsistencies in the systray notifications +- When using approve_sequence, still not approve only the needed sequence, but also other sequence for the same approver + +12.0.3.3.1 (2019-12-02) +~~~~~~~~~~~~~~~~~~~~~~~ + +Fixes: + +- Show comment on Reviews Table. +- Edit notification with approve_sequence. + +12.0.3.3.0 (2019-11-27) +~~~~~~~~~~~~~~~~~~~~~~~ + +New features: + +- Add comment on Reviews Table. +- Approve by sequence. + +12.0.3.2.1 (2019-11-26) +~~~~~~~~~~~~~~~~~~~~~~~ + +Fixes: + +- Remove message_subscribe_users + +12.0.3.2.0 (2019-11-25) +~~~~~~~~~~~~~~~~~~~~~~~ + +New features: + +- Notify reviewers + +12.0.3.1.0 (2019-07-08) +~~~~~~~~~~~~~~~~~~~~~~~ + +Fixes: + +- Singleton error + +12.0.3.0.0 (2019-12-02) +~~~~~~~~~~~~~~~~~~~~~~~ + +Fixes: + +- Edit Reviews Table + +12.0.2.1.0 (2019-05-29) +~~~~~~~~~~~~~~~~~~~~~~~ + +Fixes: + +- Edit drop-down style width and position + +12.0.2.0.0 (2019-05-28) +~~~~~~~~~~~~~~~~~~~~~~~ + +New features: + +- Pass parameters as functions. +- Add Systray. + +12.0.1.0.0 (2019-02-18) +~~~~~~~~~~~~~~~~~~~~~~~ + +Migrated to Odoo 12. + +11.0.1.0.0 (2018-05-09) +~~~~~~~~~~~~~~~~~~~~~~~ + +Migrated to Odoo 11. + +10.0.1.0.0 (2018-03-26) +~~~~~~~~~~~~~~~~~~~~~~~ + +Migrated to Odoo 10. + +9.0.1.0.0 (2017-12-02) +~~~~~~~~~~~~~~~~~~~~~~~ + +First version. + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing 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. + +Maintainers +~~~~~~~~~~~ + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +.. |maintainer-LoisRForgeFlow| image:: https://github.com/LoisRForgeFlow.png?size=40px + :target: https://github.com/LoisRForgeFlow + :alt: LoisRForgeFlow + +Current `maintainer `__: + +|maintainer-LoisRForgeFlow| + +This module is part of the `OCA/server-ux `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/base_tier_validation/__init__.py b/base_tier_validation/__init__.py new file mode 100644 index 0000000000..93aa2c1f84 --- /dev/null +++ b/base_tier_validation/__init__.py @@ -0,0 +1,4 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import models +from . import wizard diff --git a/base_tier_validation/__manifest__.py b/base_tier_validation/__manifest__.py new file mode 100644 index 0000000000..8057facf88 --- /dev/null +++ b/base_tier_validation/__manifest__.py @@ -0,0 +1,43 @@ +# Copyright 2017-19 ForgeFlow S.L. (https://www.forgeflow.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). +{ + "name": "Base Tier Validation", + "summary": "Implement a validation process based on tiers.", + "version": "16.0.1.0.0", + "development_status": "Mature", + "maintainers": ["LoisRForgeFlow"], + "category": "Tools", + "website": "https://github.com/OCA/server-ux", + "author": "ForgeFlow, Odoo Community Association (OCA)", + "license": "AGPL-3", + "application": False, + "installable": True, + "depends": ["mail"], + "data": [ + "data/mail_data.xml", + "security/ir.model.access.csv", + "security/tier_validation_security.xml", + "views/res_config_settings_views.xml", + "views/tier_definition_view.xml", + "views/tier_review_view.xml", + "wizard/comment_wizard_view.xml", + "templates/tier_validation_templates.xml", + ], + "assets": { + "web.assets_backend": [ + "/base_tier_validation/static/src/scss/systray.scss", + "/base_tier_validation/static/src/scss/review.scss", + "/base_tier_validation/static/src/js/main.esm.js", + "/base_tier_validation/static/src/js/ir_model.esm.js", + "/base_tier_validation/static/src/js/systray_service.esm.js", + "/base_tier_validation/static/src/js/systray.esm.js", + "/base_tier_validation/static/src/js/review_groups.esm.js", + "/base_tier_validation/static/src/js/reviewer_menu_view.esm.js", + "/base_tier_validation/static/src/js/tier_review_widget.esm.js", + "/base_tier_validation/static/src/js/review_group_view.esm.js", + "/base_tier_validation/static/src/js/reviewer_menu_container.esm.js", + "/base_tier_validation/static/src/js/review_notification_handler.esm.js", + "/base_tier_validation/static/src/xml/**/*", + ], + }, +} diff --git a/base_tier_validation/data/mail_data.xml b/base_tier_validation/data/mail_data.xml new file mode 100644 index 0000000000..8207bc4c77 --- /dev/null +++ b/base_tier_validation/data/mail_data.xml @@ -0,0 +1,43 @@ + + + + Tier Validation Requested + + + + + + Tier Validation Accepted Notification + + + + + + Tier Validation Rejected Notification + + + + + + Tier Validation Restarted + + + + + diff --git a/base_tier_validation/i18n/base_tier_validation.pot b/base_tier_validation/i18n/base_tier_validation.pot new file mode 100644 index 0000000000..e5893feedc --- /dev/null +++ b/base_tier_validation/i18n/base_tier_validation.pot @@ -0,0 +1,679 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * base_tier_validation +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 15.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 +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#, python-format +msgid "0 Pending" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" This Record needs to be\n" +" validated." +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" Operation has been\n" +" rejected\n" +" ." +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" Operation has been\n" +" validated\n" +" !" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Name" +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review has been requested by %s." +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was accepted" +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was accepted. (%s)" +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was rejected by %(user)s. (%(comment)s)" +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was rejected by %s." +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A validation process is still open for at least one record." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__active +msgid "Active" +msgstr "" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#, python-format +msgid "Activities" +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.selection,name:base_tier_validation.selection__tier_definition__review_type__group +msgid "Any user in a specific group" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Apply On" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__approve_sequence +msgid "Approval order by the specified sequence number" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__approve_sequence +#: 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:ir.model.fields,field_description:base_tier_validation.field_tier_review__can_review +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__can_review +msgid "Can Review" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__can_review +msgid "" +"Can review will be marked if the review is pending and the\n" +" approve sequence has been achieved" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +msgid "Cancel" +msgstr "" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__has_comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__has_comment +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +#, python-format +msgid "Comment" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_comment_wizard +msgid "Comment Wizard" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__comment +msgid "Comments" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__company_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__company_id +msgid "Company" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: base_tier_validation +#: model: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 +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 +msgid "Created on" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_type +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__definition_id +msgid "Definition" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_domain +msgid "Definition Domain" +msgstr "" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__name +#, python-format +msgid "Description" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_name +msgid "Display Name" +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 +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#, python-format +msgid "Done by" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__field +msgid "Field in related record" +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_review.py:0 +#, python-format +msgid "Group %s" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "Group By" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__has_comment +msgid "Has Comment" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__id +msgid "ID" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_create +msgid "" +"If set, all possible reviewers will be notified by email when this " +"definition is triggered." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard____last_update +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition____last_update +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review____last_update +msgid "Last Modified on" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__write_uid +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 +msgid "Last Updated on" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "Model" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "More Options" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "More reports about tier validations, i.e., summary of all my reviews" +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 +#: code:addons/base_tier_validation/models/tier_definition.py:0 +#, python-format +msgid "New Tier Validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__next_review +msgid "Next Review" +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "Next: %s" +msgstr "" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#, python-format +msgid "No reviews to do." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_create +msgid "Notify Reviewers on Creation" +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "Operation has been rejected." +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "Operation has been validated!" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Option to forward a tier validation to other reviewer, and backward" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Option to trigger server actions on completion of tier reviews" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Option to use python formula to get reviewers and find documents" +msgstr "" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__pending +#, python-format +msgid "Pending" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model_id +msgid "Referenced Model" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Reject" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__rejected +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 +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#, python-format +msgid "Requested by" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_id +msgid "Res" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_model +msgid "Res Model" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Restart Validation" +msgstr "" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__review_ids +#, python-format +msgid "Review" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_id +msgid "Reviewer" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_field_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_field_id +msgid "Reviewer field" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_group_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_group_id +msgid "Reviewer group" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_ids +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__reviewer_ids +msgid "Reviewers" +msgstr "" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_res_users__review_ids +#, python-format +msgid "Reviews" +msgstr "" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__sequence +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence +#, python-format +msgid "Sequence" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__individual +msgid "Specific user" +msgstr "" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__status +#, python-format +msgid "Status" +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "The operation is under validation." +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "The review has been reset by %s." +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_review.py:0 +#, python-format +msgid "There are no res.users in the selected field" +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "This %s needs to be validated" +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "" +"This action needs to be validated for at least one record. \n" +"Please request a validation." +msgstr "" + +#. module: base_tier_validation +#: model:ir.actions.act_window,name:base_tier_validation.tier_definition_action +#: model:ir.model,name:base_tier_validation.model_tier_definition +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_definition +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Tier Definition" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_formula +msgid "Tier Formula" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_forward +msgid "Tier Forward & Backward" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_report +msgid "Tier Reports" +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.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_server_action +msgid "Tier Server Action" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Tier Validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation +msgid "Tier Validation (abstract)" +msgstr "" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_accepted +msgid "Tier Validation Accepted Notification" +msgstr "" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_rejected +msgid "Tier Validation Rejected Notification" +msgstr "" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested +msgid "Tier Validation Requested" +msgstr "" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_restarted +msgid "Tier Validation Restarted" +msgstr "" + +#. module: base_tier_validation +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_confirmation +msgid "Tier Validations" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__to_validate_message +msgid "To Validate Message" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__todo_by +msgid "Todo By" +msgstr "" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#, python-format +msgid "Todo by" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_users +msgid "Users" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__valid_reviewer_field_ids +msgid "Valid Reviewer Field" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Validate" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__validate_reject +msgid "Validate Reject" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validated +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 +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewed_date +#, python-format +msgid "Validation Date" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__review_ids +msgid "Validations" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "e.g. Tier Validation for..." +msgstr "" diff --git a/base_tier_validation/i18n/es.po b/base_tier_validation/i18n/es.po new file mode 100644 index 0000000000..ed1dbac1cc --- /dev/null +++ b/base_tier_validation/i18n/es.po @@ -0,0 +1,727 @@ +# 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: 2021-03-16 11:46+0000\n" +"Last-Translator: Ana Suárez \n" +"Language-Team: none\n" +"Language: es\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 +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#, python-format +msgid "0 Pending" +msgstr "0 Pendientes" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" This Record needs to be\n" +" validated." +msgstr "" +"\n" +" Este registro debe ser\n" +" validado." + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" Operation has been\n" +" rejected\n" +" ." +msgstr "" +"\n" +" La operación ha sido\n" +" rechazada\n" +" ." + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" Operation has been\n" +" validated\n" +" !" +msgstr "" +"\n" +" La operación ha sido\n" +" validada\n" +" !" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Name" +msgstr "Nombre" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review has been requested by %s." +msgstr "Una revisión fue solicitada por %s." + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was accepted" +msgstr "Una revisión fue aceptada" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was accepted. (%s)" +msgstr "Una revisión fue aceptada. (%s)" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was rejected by %(user)s. (%(comment)s)" +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was rejected by %s." +msgstr "Una revisión fue rechaza por %s." + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A validation process is still open for at least one record." +msgstr "Un proceso de validación está aún abierto para al menos un registro." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__active +msgid "Active" +msgstr "Activo" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#, python-format +msgid "Activities" +msgstr "Actividades" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "All" +msgstr "Todos" + +#. module: base_tier_validation +#: model:ir.model.fields.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 "Aplicar en" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__approve_sequence +msgid "Approval order by the specified sequence number" +msgstr "Orden de aprobación por el número de secuencia especificado" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__approve_sequence +#: 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:ir.model.fields,field_description:base_tier_validation.field_tier_review__can_review +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__can_review +msgid "Can Review" +msgstr "Puede revisar" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__can_review +msgid "" +"Can review will be marked if the review is pending and the\n" +" approve sequence has been achieved" +msgstr "" +"Puede revisar será establecido si la revisión está pendiente y la\n" +" secuencia de aprobación se ha alcanzado" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +msgid "Cancel" +msgstr "Cancelar" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__has_comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__has_comment +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +#, python-format +msgid "Comment" +msgstr "Comentar" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_comment_wizard +msgid "Comment Wizard" +msgstr "Wizard Comentario" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__comment +msgid "Comments" +msgstr "Comentarios" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__company_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__company_id +msgid "Company" +msgstr "Compañía" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_config_settings +msgid "Config Settings" +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 +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 +msgid "Created on" +msgstr "Creado en" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_type +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__definition_id +msgid "Definition" +msgstr "Definición" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_domain +msgid "Definition Domain" +msgstr "Dominio de definición" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__name +#, python-format +msgid "Description" +msgstr "Descripción" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_name +msgid "Display Name" +msgstr "Nombre mostrado" + +#. 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 +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#, python-format +msgid "Done by" +msgstr "Hecho Por" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__field +msgid "Field in related record" +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_review.py:0 +#, python-format +msgid "Group %s" +msgstr "Grupo %s" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "Group By" +msgstr "Agrupar por" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__has_comment +msgid "Has Comment" +msgstr "Ha comentado" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__id +msgid "ID" +msgstr "ID" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_create +#, fuzzy +msgid "" +"If set, all possible reviewers will be notified by email when this " +"definition is triggered." +msgstr "" +"Si está establecido, todos los posibles validadores serán notificados por " +"email cuando esta definición se ejecute." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard____last_update +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition____last_update +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review____last_update +msgid "Last Modified on" +msgstr "Última modificación en" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__write_uid +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 +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_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "Model" +msgstr "Modelo" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "More Options" +msgstr "Más opciones" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "More reports about tier validations, i.e., summary of all my reviews" +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 +#: code:addons/base_tier_validation/models/tier_definition.py:0 +#, python-format +msgid "New Tier Validation" +msgstr "Nueva Validación de Nivel" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__next_review +msgid "Next Review" +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "Next: %s" +msgstr "" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#, python-format +msgid "No reviews to do." +msgstr "No hay revisiones a realizar." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_create +#, fuzzy +msgid "Notify Reviewers on Creation" +msgstr "Notificar validadores en la creación" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "Operation has been rejected." +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "Operation has been validated!" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Option to forward a tier validation to other reviewer, and backward" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Option to trigger server actions on completion of tier reviews" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Option to use python formula to get reviewers and find documents" +msgstr "" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__pending +#, python-format +msgid "Pending" +msgstr "Pendiente" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model_id +msgid "Referenced Model" +msgstr "Modelo referenciado" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Reject" +msgstr "Rechazar" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__rejected +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 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 +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#, python-format +msgid "Requested by" +msgstr "Solicitado Por" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_id +#, fuzzy +msgid "Res" +msgstr "Revisiones" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_model +#, fuzzy +msgid "Res Model" +msgstr "Modelo" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +#, fuzzy +msgid "Restart Validation" +msgstr "Volver a empezar validación" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__review_ids +#, python-format +msgid "Review" +msgstr "Revisor" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_id +msgid "Reviewer" +msgstr "Revisor" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_field_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_field_id +msgid "Reviewer field" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_group_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_group_id +msgid "Reviewer group" +msgstr "Grupo revisor" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_ids +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__reviewer_ids +msgid "Reviewers" +msgstr "Revisores" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_res_users__review_ids +#, python-format +msgid "Reviews" +msgstr "Revisiones" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__sequence +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence +#, python-format +msgid "Sequence" +msgstr "Secuencia" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__individual +msgid "Specific user" +msgstr "Usuario específico" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__status +#, python-format +msgid "Status" +msgstr "Estado" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "The operation is under validation." +msgstr "Esta operación está en proceso de validación." + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "The review has been reset by %s." +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_review.py:0 +#, python-format +msgid "There are no res.users in the selected field" +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "This %s needs to be validated" +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "" +"This action needs to be validated for at least one record. \n" +"Please request a validation." +msgstr "" +"Esta acción necesita ser validada para algún registro.\n" +"Por favor, solicita una validación." + +#. module: base_tier_validation +#: model:ir.actions.act_window,name:base_tier_validation.tier_definition_action +#: model:ir.model,name:base_tier_validation.model_tier_definition +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_definition +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Tier Definition" +msgstr "Definición de Nivel" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_formula +msgid "Tier Formula" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_forward +msgid "Tier Forward & Backward" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_report +msgid "Tier Reports" +msgstr "" + +#. 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.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_server_action +msgid "Tier Server Action" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Tier Validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation +msgid "Tier Validation (abstract)" +msgstr "Validaciones de Nivel (abstracto)" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_accepted +#, fuzzy +msgid "Tier Validation Accepted Notification" +msgstr "Validaciones de Nivel (abstracto)" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_rejected +#, fuzzy +msgid "Tier Validation Rejected Notification" +msgstr "Validaciones de Nivel (abstracto)" + +#. 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 "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 "" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#, python-format +msgid "Todo by" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_users +msgid "Users" +msgstr "Usuarios" + +#. 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 +#, fuzzy +msgid "Validate Reject" +msgstr "Validado" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__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 +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewed_date +#, python-format +msgid "Validation Date" +msgstr "Fecha de Validación" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__review_ids +msgid "Validations" +msgstr "Validaciones" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "e.g. Tier Validation for..." +msgstr "ej. Validación de Nivel por..." + +#~ msgid "Tier" +#~ msgstr "Nivel" + +#~ msgid "A review was rejected by {}. ({})" +#~ msgstr "Una revisión fue rechaza por {}. ({})" + +#~ msgid "Any user in a specific group." +#~ msgstr "Cualquier usuario en el grupo especificado." + +#, fuzzy +#~| msgid "Sequence" +#~ msgid "Approve Sequence" +#~ msgstr "Secuencia" + +#~ msgid "Formula" +#~ msgstr "Fórmula" + +#~ msgid "Python Expression" +#~ msgstr "Expresión Python" diff --git a/base_tier_validation/i18n/es_MX.po b/base_tier_validation/i18n/es_MX.po new file mode 100644 index 0000000000..e11a65522a --- /dev/null +++ b/base_tier_validation/i18n/es_MX.po @@ -0,0 +1,703 @@ +# 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 +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#, python-format +msgid "0 Pending" +msgstr "0 Pendientes" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" This Record needs to be\n" +" validated." +msgstr "" +"\n" +" Este registro necesita ser\n" +" validado." + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" Operation has been\n" +" rejected\n" +" ." +msgstr "" +"\n" +" La operación ha sido\n" +" rechazada\n" +" ." + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" Operation has been\n" +" validated\n" +" !" +msgstr "" +"\n" +" ¡La operación ha sido\n" +" validada\n" +" !" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Name" +msgstr "Nombre" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review has been requested by %s." +msgstr "%s ha solicitado una revisión." + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was accepted" +msgstr "Se aceptó una revisión" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was accepted. (%s)" +msgstr "Se aceptó una revisión. (%s)" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was rejected by %(user)s. (%(comment)s)" +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was rejected by %s." +msgstr "%s rechazó una revisión." + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A validation process is still open for at least one record." +msgstr "" +"Todavía hay un proceso de validación abierto para al menos un registro." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__active +msgid "Active" +msgstr "Activo" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#, python-format +msgid "Activities" +msgstr "Actividades" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "All" +msgstr "Todos" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__group +msgid "Any user in a specific group" +msgstr "Cualquier usuario de un grupo específico" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Apply On" +msgstr "Aplicar en" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__approve_sequence +msgid "Approval order by the specified sequence number" +msgstr "Orden de aprobación por el número de secuencia especificado" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__approve_sequence +#: 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:ir.model.fields,field_description:base_tier_validation.field_tier_review__can_review +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__can_review +msgid "Can Review" +msgstr "Puede revisar" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__can_review +msgid "" +"Can review will be marked if the review is pending and the\n" +" approve sequence has been achieved" +msgstr "" +"Puede revisar se marcará si la revisión está pendiente y\n" +" se ha logrado aprobar la secuencia" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +msgid "Cancel" +msgstr "Cancelado" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__has_comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__has_comment +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +#, python-format +msgid "Comment" +msgstr "Comentario" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_comment_wizard +msgid "Comment Wizard" +msgstr "Asistente de comentarios" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__comment +msgid "Comments" +msgstr "Comentarios" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__company_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__company_id +msgid "Company" +msgstr "Empresa" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: base_tier_validation +#: model: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 +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 +msgid "Created on" +msgstr "Creado en" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_type +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__definition_id +msgid "Definition" +msgstr "Definición de Nivel" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_domain +msgid "Definition Domain" +msgstr "Dominio de definición" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__name +#, python-format +msgid "Description" +msgstr "Descripción" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_name +msgid "Display Name" +msgstr "Nombre mostrado" + +#. 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 +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#, python-format +msgid "Done by" +msgstr "Realizado por" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__field +msgid "Field in related record" +msgstr "Campo en registro relacionado" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_review.py:0 +#, python-format +msgid "Group %s" +msgstr "Grupo %s" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "Group By" +msgstr "Agrupar por" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__has_comment +msgid "Has Comment" +msgstr "Tiene comentario" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__id +msgid "ID" +msgstr "Identificación" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_create +msgid "" +"If set, all possible reviewers will be notified by email when this " +"definition is triggered." +msgstr "" +"Si se establece, todos los posibles revisores serán notificados por correo " +"electrónico cuando se active esta definición." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard____last_update +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition____last_update +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review____last_update +msgid "Last Modified on" +msgstr "Última modificación el" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__write_uid +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 +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_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "Model" +msgstr "Modelo" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "More Options" +msgstr "Más opciones" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "More reports about tier validations, i.e., summary of all my reviews" +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 +#: code:addons/base_tier_validation/models/tier_definition.py:0 +#, python-format +msgid "New Tier Validation" +msgstr "Nueva Definición de Nivel" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__next_review +msgid "Next Review" +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "Next: %s" +msgstr "" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#, python-format +msgid "No reviews to do." +msgstr "No hay revisiones que hacer." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_create +msgid "Notify Reviewers on Creation" +msgstr "Notificar a los revisores sobre la creación" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "Operation has been rejected." +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "Operation has been validated!" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Option to forward a tier validation to other reviewer, and backward" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Option to trigger server actions on completion of tier reviews" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Option to use python formula to get reviewers and find documents" +msgstr "" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__pending +#, python-format +msgid "Pending" +msgstr "Pendiente" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model_id +msgid "Referenced Model" +msgstr "Modelo referenciado" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Reject" +msgstr "Rechazar" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__rejected +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 +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#, python-format +msgid "Requested by" +msgstr "Solicitado por" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_id +msgid "Res" +msgstr "Res" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_model +msgid "Res Model" +msgstr "Modelo Res" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Restart Validation" +msgstr "Reiniciar la validación" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__review_ids +#, python-format +msgid "Review" +msgstr "Revisión" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_id +msgid "Reviewer" +msgstr "Evaluador" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_field_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_field_id +msgid "Reviewer field" +msgstr "Campo de revisor" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_group_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_group_id +msgid "Reviewer group" +msgstr "Grupo de revisores" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_ids +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__reviewer_ids +msgid "Reviewers" +msgstr "Revisores" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_res_users__review_ids +#, python-format +msgid "Reviews" +msgstr "Comentarios" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__sequence +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence +#, python-format +msgid "Sequence" +msgstr "Secuencia" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__individual +msgid "Specific user" +msgstr "Usuario específico" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__status +#, python-format +msgid "Status" +msgstr "Estatus" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "The operation is under validation." +msgstr "La operación está en proceso de validación." + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "The review has been reset by %s." +msgstr "%s ha restablecido la revisión." + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_review.py:0 +#, python-format +msgid "There are no res.users in the selected field" +msgstr "No hay res.users en el campo seleccionado" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "This %s needs to be validated" +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "" +"This action needs to be validated for at least one record. \n" +"Please request a validation." +msgstr "" +"Esta acción debe validarse para al menos un registro.\n" +"Solicite una validación." + +#. module: base_tier_validation +#: model:ir.actions.act_window,name:base_tier_validation.tier_definition_action +#: model:ir.model,name:base_tier_validation.model_tier_definition +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_definition +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Tier Definition" +msgstr "Definición de Nivel" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_formula +msgid "Tier Formula" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_forward +msgid "Tier Forward & Backward" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_report +msgid "Tier Reports" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_review +msgid "Tier Review" +msgstr "Revisión de niveles" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_server_action +msgid "Tier Server Action" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Tier Validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation +msgid "Tier Validation (abstract)" +msgstr "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:mail.message.subtype,name:base_tier_validation.mt_tier_validation_rejected +msgid "Tier Validation Rejected Notification" +msgstr "Notificación de rechazo de validación de nivel" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested +msgid "Tier Validation Requested" +msgstr "Validación de nivel solicitada" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_restarted +msgid "Tier Validation Restarted" +msgstr "Se reinició la validación de nivel" + +#. module: base_tier_validation +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_confirmation +msgid "Tier Validations" +msgstr "Validaciones de nivel" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__to_validate_message +msgid "To Validate Message" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__todo_by +msgid "Todo By" +msgstr "Por Hacer por" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#, python-format +msgid "Todo by" +msgstr "Por Hacer por" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_users +msgid "Users" +msgstr "Usuarios" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__valid_reviewer_field_ids +msgid "Valid Reviewer Field" +msgstr "Campo de revisor válido" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Validate" +msgstr "Validar" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__validate_reject +msgid "Validate Reject" +msgstr "Validar Rechazar" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validated +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 +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewed_date +#, python-format +msgid "Validation Date" +msgstr "Fecha de validación" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__review_ids +msgid "Validations" +msgstr "Validaciones" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "e.g. Tier Validation for..." +msgstr "p.ej. Validación de nivel para ..." + +#~ msgid "A review was rejected by {}. ({})" +#~ msgstr "{} rechazó una revisión. ({})" diff --git a/base_tier_validation/i18n/fr.po b/base_tier_validation/i18n/fr.po new file mode 100644 index 0000000000..f072793a81 --- /dev/null +++ b/base_tier_validation/i18n/fr.po @@ -0,0 +1,701 @@ +# 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-05-14 19:47+0000\n" +"Last-Translator: Yves Le Doeuff \n" +"Language-Team: none\n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=n > 1;\n" +"X-Generator: Weblate 4.3.2\n" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#, python-format +msgid "0 Pending" +msgstr "0 en attente" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" This Record needs to be\n" +" validated." +msgstr "" +"\n" +" Cet enregistrement doit \n" +" être validé." + +#. 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 +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review has been requested by %s." +msgstr "Une vérification a été demandée par %s." + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was accepted" +msgstr "Une vérification a été acceptée" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was accepted. (%s)" +msgstr "Une vérification a été acceptée. (%s)" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was rejected by %(user)s. (%(comment)s)" +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was rejected by %s." +msgstr "Une vérification a été refusée par %s." + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A validation process is still open for at least one record." +msgstr "" +"Un processus de validation est toujours en cours pour au moins un " +"enregistrement." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__active +msgid "Active" +msgstr "Actif" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#, python-format +msgid "Activities" +msgstr "Activités" + +#. 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.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 "Appliquer sur" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__approve_sequence +msgid "Approval order by the specified sequence number" +msgstr "Ordre d'approbation suivant le numéro de séquence spécifié" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__approve_sequence +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__approve_sequence +msgid "Approve by sequence" +msgstr "Approuver par 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: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 "Peut vérifier" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__can_review +msgid "" +"Can review will be marked if the review is pending and the\n" +" approve sequence has been achieved" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +msgid "Cancel" +msgstr "Annuler" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__has_comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__has_comment +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +#, python-format +msgid "Comment" +msgstr "Commentaire" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_comment_wizard +msgid "Comment Wizard" +msgstr "" + +#. 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 +msgid "Company" +msgstr "Société" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_config_settings +msgid "Config Settings" +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 +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 +msgid "Created on" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_type +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__definition_id +msgid "Definition" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_domain +msgid "Definition Domain" +msgstr "" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__name +#, python-format +msgid "Description" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_name +msgid "Display Name" +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 "Fait par" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#, python-format +msgid "Done by" +msgstr "Fait par" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__field +msgid "Field in related record" +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_review.py:0 +#, python-format +msgid "Group %s" +msgstr "Groupe %s" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "Group By" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__has_comment +msgid "Has Comment" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__id +msgid "ID" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_create +msgid "" +"If set, all possible reviewers will be notified by email when this " +"definition is triggered." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard____last_update +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition____last_update +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review____last_update +msgid "Last Modified on" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__write_uid +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 +msgid "Last Updated on" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "Model" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "More Options" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "More reports about tier validations, i.e., summary of all my reviews" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__need_validation +msgid "Need Validation" +msgstr "Doit être validé" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_definition.py:0 +#, python-format +msgid "New Tier Validation" +msgstr "Nouvelle validation par un tiers" + +#. 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 +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "Next: %s" +msgstr "" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#, python-format +msgid "No reviews to do." +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_create +msgid "Notify Reviewers on Creation" +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "Operation has been rejected." +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "Operation has been validated!" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Option to forward a tier validation to other reviewer, and backward" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Option to trigger server actions on completion of tier reviews" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Option to use python formula to get reviewers and find documents" +msgstr "" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__pending +#, python-format +msgid "Pending" +msgstr "En attente" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model_id +msgid "Referenced Model" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Reject" +msgstr "Rejet" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__rejected +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 "" + +#. 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 "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 +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#, python-format +msgid "Requested by" +msgstr "Demandé par" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_id +msgid "Res" +msgstr "" + +#. 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 "Recommencer la validation" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__review_ids +#, python-format +msgid "Review" +msgstr "Vérification" + +#. 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 "Vérificateur" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_field_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_field_id +msgid "Reviewer field" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_group_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_group_id +msgid "Reviewer group" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_ids +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__reviewer_ids +msgid "Reviewers" +msgstr "Vérificateurs" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_res_users__review_ids +#, python-format +msgid "Reviews" +msgstr "Vérifications" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__sequence +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence +#, python-format +msgid "Sequence" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__individual +msgid "Specific user" +msgstr "" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__status +#, python-format +msgid "Status" +msgstr "Statut" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "The operation is under validation." +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "The review has been reset by %s." +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_review.py:0 +#, python-format +msgid "There are no res.users in the selected field" +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "This %s needs to be validated" +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "" +"This action needs to be validated for at least one record. \n" +"Please request a validation." +msgstr "" + +#. module: base_tier_validation +#: model:ir.actions.act_window,name:base_tier_validation.tier_definition_action +#: model:ir.model,name:base_tier_validation.model_tier_definition +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_definition +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Tier Definition" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_formula +msgid "Tier Formula" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_forward +msgid "Tier Forward & Backward" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_report +msgid "Tier Reports" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_review +msgid "Tier Review" +msgstr "Vérification par un tiers" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_server_action +msgid "Tier Server Action" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Tier Validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation +msgid "Tier Validation (abstract)" +msgstr "" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_accepted +msgid "Tier Validation Accepted Notification" +msgstr "" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_rejected +msgid "Tier Validation Rejected Notification" +msgstr "" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested +msgid "Tier Validation Requested" +msgstr "Validation par un tiers demandée" + +#. 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 "Validation par un tiers" + +#. 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 "A faire par" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#, python-format +msgid "Todo by" +msgstr "A faire par" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_users +msgid "Users" +msgstr "Utilisateurs" + +#. 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 "Valider" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__validate_reject +msgid "Validate Reject" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validated +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 "" + +#. 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 +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewed_date +#, python-format +msgid "Validation Date" +msgstr "Date de validation" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__review_ids +msgid "Validations" +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 "ie Validation par un tiers pour..." + +#~ msgid "A review was rejected by {}. ({})" +#~ msgstr "Une vérification a été refusée par {}. ({})" + +#~ msgid "Any user in a specific group." +#~ msgstr "Tout utilisateur d'un groupe spécifique." diff --git a/base_tier_validation/i18n/it.po b/base_tier_validation/i18n/it.po new file mode 100644 index 0000000000..8b4cd684eb --- /dev/null +++ b/base_tier_validation/i18n/it.po @@ -0,0 +1,702 @@ +# 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-11 22:50+0000\n" +"Last-Translator: Alessandro Fiorino \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 4.3.2\n" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#, python-format +msgid "0 Pending" +msgstr "0 In attesa" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" This Record needs to be\n" +" validated." +msgstr "" +"\n" +" Questo Record necessita di\n" +" approvazione." + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" Operation has been\n" +" rejected\n" +" ." +msgstr "" +"\n" +" L'operazione è stata\n" +" rifiutata\n" +" ." + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" Operation has been\n" +" validated\n" +" !" +msgstr "" +"\n" +" L'operazione è stata\n" +" approvata\n" +" !" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Name" +msgstr "Nome" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review has been requested by %s." +msgstr "Un'approvazione è stata richiesta da %s." + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was accepted" +msgstr "Un'approvazione è stata accettata" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was accepted. (%s)" +msgstr "Un'approvazione è stata accettata. (%s)" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was rejected by %(user)s. (%(comment)s)" +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was rejected by %s." +msgstr "Un'approvazione è stata rifiutata da %s." + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A validation process is still open for at least one record." +msgstr "Un processo di approvazione è ancora aperto per almeno un record." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__active +msgid "Active" +msgstr "Attivo" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#, python-format +msgid "Activities" +msgstr "Attività" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "All" +msgstr "Tutto" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__group +msgid "Any user in a specific group" +msgstr "Qualunque utente in un gruppo specifico" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Apply On" +msgstr "Applica A" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__approve_sequence +msgid "Approval order by the specified sequence number" +msgstr "Ordine di approvazione specificato da numero sequenza" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__approve_sequence +#: 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: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ò approvare" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__can_review +msgid "" +"Can review will be marked if the review is pending and the\n" +" approve sequence has been achieved" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +msgid "Cancel" +msgstr "Annulla" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__has_comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__has_comment +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +#, python-format +msgid "Comment" +msgstr "Commento" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_comment_wizard +msgid "Comment Wizard" +msgstr "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 +msgid "Company" +msgstr "Azienda" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_config_settings +msgid "Config Settings" +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 +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 +msgid "Created on" +msgstr "Creato il" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_type +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__definition_id +msgid "Definition" +msgstr "Definizione" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_domain +msgid "Definition Domain" +msgstr "Dominio Definizione" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__name +#, python-format +msgid "Description" +msgstr "Descrizione" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_name +msgid "Display Name" +msgstr "Nome Visualizzato" + +#. 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 +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#, python-format +msgid "Done by" +msgstr "Eseguito da" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__field +msgid "Field in related record" +msgstr "Campo in record collegato" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_review.py:0 +#, python-format +msgid "Group %s" +msgstr "Gruppo %s" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "Group By" +msgstr "Raggruppa Per" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__has_comment +msgid "Has Comment" +msgstr "Ha commenti" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__id +msgid "ID" +msgstr "ID" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_create +msgid "" +"If set, all possible reviewers will be notified by email when this " +"definition is triggered." +msgstr "" +"Se impostato, tutti i possibili approvatori saranno notificati via email " +"quando la definizione è attivata." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard____last_update +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition____last_update +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review____last_update +msgid "Last Modified on" +msgstr "Ultima Modifica il" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__write_uid +msgid "Last Updated by" +msgstr "Ultimo Aggiornamento il" + +#. 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 +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_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "Model" +msgstr "Modello" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "More Options" +msgstr "Più Opzioni" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "More reports about tier validations, i.e., summary of all my reviews" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__need_validation +msgid "Need Validation" +msgstr "Richiede Approvazione" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_definition.py:0 +#, python-format +msgid "New Tier Validation" +msgstr "Nuovo Livello Approvazione" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__next_review +msgid "Next Review" +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "Next: %s" +msgstr "" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#, python-format +msgid "No reviews to do." +msgstr "Nessuna approvazione da fare." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_create +msgid "Notify Reviewers on Creation" +msgstr "Notifica Approvatori su Creazione" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "Operation has been rejected." +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "Operation has been validated!" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Option to forward a tier validation to other reviewer, and backward" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Option to trigger server actions on completion of tier reviews" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Option to use python formula to get reviewers and find documents" +msgstr "" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__pending +#, python-format +msgid "Pending" +msgstr "In sospeso" + +#. 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 "Rifiuta" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__rejected +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 "" + +#. 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 "Richiedi Approvazione" + +#. 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 +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#, python-format +msgid "Requested by" +msgstr "Richiesta da" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_id +#, fuzzy +msgid "Res" +msgstr "Res" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_model +#, fuzzy +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 "Riavvia Approvazione" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__review_ids +#, python-format +msgid "Review" +msgstr "Approvazione" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_id +msgid "Reviewer" +msgstr "Approvatore" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_field_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_field_id +msgid "Reviewer field" +msgstr "Campo approvatore" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_group_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_group_id +msgid "Reviewer group" +msgstr "Gruppo approvatore" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_ids +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__reviewer_ids +msgid "Reviewers" +msgstr "Approvatori" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_res_users__review_ids +#, python-format +msgid "Reviews" +msgstr "Approvazioni" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__sequence +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence +#, python-format +msgid "Sequence" +msgstr "Sequenza" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__individual +msgid "Specific user" +msgstr "Utente specifico" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__status +#, python-format +msgid "Status" +msgstr "Stato" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "The operation is under validation." +msgstr "L'operazione è sotto approvazione." + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "The review has been reset by %s." +msgstr "L'approvazione è stata riavviata da %s." + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_review.py:0 +#, python-format +msgid "There are no res.users in the selected field" +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "This %s needs to be validated" +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "" +"This action needs to be validated for at least one record. \n" +"Please request a validation." +msgstr "" +"Questa azione richiede di essere approvata per almeno un record.\n" +"Prego richiedere un'approvazione." + +#. module: base_tier_validation +#: model:ir.actions.act_window,name:base_tier_validation.tier_definition_action +#: model:ir.model,name:base_tier_validation.model_tier_definition +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_definition +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Tier Definition" +msgstr "Definizione Livello" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_formula +msgid "Tier Formula" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_forward +msgid "Tier Forward & Backward" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_report +msgid "Tier Reports" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_review +msgid "Tier Review" +msgstr "Livello Approvazione" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_server_action +msgid "Tier Server Action" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Tier Validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation +msgid "Tier Validation (abstract)" +msgstr "" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_accepted +msgid "Tier Validation Accepted Notification" +msgstr "Notifica Accettazione Livello Approvazione" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_rejected +msgid "Tier Validation Rejected Notification" +msgstr "Notifica Rifiuto Livello Approvazione" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested +msgid "Tier Validation Requested" +msgstr "Approvazione Richiesta" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_restarted +msgid "Tier Validation Restarted" +msgstr "Approvazione Riavviata" + +#. module: base_tier_validation +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_confirmation +msgid "Tier Validations" +msgstr "Livelli di Approvazione" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__to_validate_message +msgid "To Validate Message" +msgstr "" + +#. 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 +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#, python-format +msgid "Todo by" +msgstr "Incaricati" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_users +msgid "Users" +msgstr "Utenti" + +#. 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 "Approva" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__validate_reject +msgid "Validate Reject" +msgstr "Rifiuta Approvazione" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validated +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 "" + +#. 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 +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewed_date +#, python-format +msgid "Validation Date" +msgstr "Data Approvazione" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__review_ids +msgid "Validations" +msgstr "Approvazioni" + +#. 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 "" + +#~ msgid "A review was rejected by {}. ({})" +#~ msgstr "Un'approvazione è stata rifiutata da {}. ({})" diff --git a/base_tier_validation/i18n/nl_NL.po b/base_tier_validation/i18n/nl_NL.po new file mode 100644 index 0000000000..b0c7b93736 --- /dev/null +++ b/base_tier_validation/i18n/nl_NL.po @@ -0,0 +1,703 @@ +# 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-01-15 11:13+0000\n" +"Last-Translator: Cas Vissers \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 3.10\n" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#, python-format +msgid "0 Pending" +msgstr "0 In afwachting" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" This Record needs to be\n" +" validated." +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" Operation has been\n" +" rejected\n" +" ." +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" Operation has been\n" +" validated\n" +" !" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Name" +msgstr "Naam" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review has been requested by %s." +msgstr "Een beoordeling is aangevraagd door %s." + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was accepted" +msgstr "Een beoordeling is geaccepteerd" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was accepted. (%s)" +msgstr "Een beoordeling is geaccepteerd. (%s)" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was rejected by %(user)s. (%(comment)s)" +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was rejected by %s." +msgstr "Een beoordeling is afgewezen door %s." + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A validation process is still open for at least one record." +msgstr "Er is nog steeds een validatieproces open voor ten minste één record." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__active +msgid "Active" +msgstr "Actief" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#, fuzzy, python-format +msgid "Activities" +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.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 "Goedkeuringsvolgorde op basis van het opgegeven volgnummer" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__approve_sequence +#: 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: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 "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +msgid "Cancel" +msgstr "Annuleer" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__has_comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__has_comment +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +#, python-format +msgid "Comment" +msgstr "Opmerking" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_comment_wizard +msgid "Comment Wizard" +msgstr "Opmerking Wizard" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__comment +msgid "Comments" +msgstr "Opmerkingen" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__company_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__company_id +msgid "Company" +msgstr "Bedrijf" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_config_settings +msgid "Config Settings" +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 +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 +msgid "Created on" +msgstr "Aangemaakt door" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_type +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__definition_id +msgid "Definition" +msgstr "Definitie" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_domain +msgid "Definition Domain" +msgstr "Definitiedomein" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__name +#, python-format +msgid "Description" +msgstr "Omschrijving" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_name +msgid "Display Name" +msgstr "Weergavenaam" + +#. 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 +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#, python-format +msgid "Done by" +msgstr "Gedaan door" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__field +msgid "Field in related record" +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_review.py:0 +#, python-format +msgid "Group %s" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "Group By" +msgstr "Groeperen op" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__has_comment +msgid "Has Comment" +msgstr "Heeft commentaar" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__id +msgid "ID" +msgstr "ID" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_create +msgid "" +"If set, all possible reviewers will be notified by email when this " +"definition is triggered." +msgstr "" +"Indien ingesteld, worden alle mogelijke reviewers per e-mail op de hoogte " +"gebracht wanneer deze definitie wordt geactiveerd." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard____last_update +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition____last_update +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review____last_update +msgid "Last Modified on" +msgstr "Laatst gewijzigd op" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__write_uid +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 +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_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "Model" +msgstr "Model" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "More Options" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "More reports about tier validations, i.e., summary of all my reviews" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__need_validation +msgid "Need Validation" +msgstr "Validatie nodig" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_definition.py:0 +#, python-format +msgid "New Tier Validation" +msgstr "Nieuwe Tier-validatie" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__next_review +msgid "Next Review" +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "Next: %s" +msgstr "" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#, python-format +msgid "No reviews to do." +msgstr "Geen beoordelingen te doen." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_create +msgid "Notify Reviewers on Creation" +msgstr "Informeer beoordelaar bij het maken" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "Operation has been rejected." +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "Operation has been validated!" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Option to forward a tier validation to other reviewer, and backward" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Option to trigger server actions on completion of tier reviews" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Option to use python formula to get reviewers and find documents" +msgstr "" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__pending +#, python-format +msgid "Pending" +msgstr "In afwachting" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model_id +msgid "Referenced Model" +msgstr "Referentiemodel" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Reject" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__rejected +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 "" + +#. 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 "" + +#. 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 +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#, python-format +msgid "Requested by" +msgstr "Aangevraagd door" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_id +msgid "Res" +msgstr "Res" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_model +msgid "Res Model" +msgstr "Res model" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Restart Validation" +msgstr "" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__review_ids +#, python-format +msgid "Review" +msgstr "Beoordeling" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_id +msgid "Reviewer" +msgstr "Beoordelaar" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_field_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_field_id +msgid "Reviewer field" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_group_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_group_id +msgid "Reviewer group" +msgstr "Beoordeel groep" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_ids +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__reviewer_ids +msgid "Reviewers" +msgstr "Beoordelaars" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_res_users__review_ids +#, python-format +msgid "Reviews" +msgstr "Beoordelingen" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__sequence +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence +#, python-format +msgid "Sequence" +msgstr "Volgorde" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__individual +msgid "Specific user" +msgstr "Specifieke gebruiker" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__status +#, python-format +msgid "Status" +msgstr "Status" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "The operation is under validation." +msgstr "De bewerking is onder validatie." + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "The review has been reset by %s." +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_review.py:0 +#, python-format +msgid "There are no res.users in the selected field" +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "This %s needs to be validated" +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "" +"This action needs to be validated for at least one record. \n" +"Please request a validation." +msgstr "" +"Deze actie moet voor ten minste één record gevalideerd worden.\n" +"Vraag een validatie aan." + +#. module: base_tier_validation +#: model:ir.actions.act_window,name:base_tier_validation.tier_definition_action +#: model:ir.model,name:base_tier_validation.model_tier_definition +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_definition +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Tier Definition" +msgstr "Tier definitie" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_formula +msgid "Tier Formula" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_forward +msgid "Tier Forward & Backward" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_report +msgid "Tier Reports" +msgstr "" + +#. 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.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_server_action +msgid "Tier Server Action" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Tier Validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation +msgid "Tier Validation (abstract)" +msgstr "Tier-validatie (abstract)" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_accepted +#, fuzzy +msgid "Tier Validation Accepted Notification" +msgstr "Tier-validatie (abstract)" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_rejected +#, fuzzy +msgid "Tier Validation Rejected Notification" +msgstr "Tier-validatie (abstract)" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested +msgid "Tier Validation Requested" +msgstr "" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_restarted +msgid "Tier Validation Restarted" +msgstr "" + +#. 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 "" + +#. 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 +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#, python-format +msgid "Todo by" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_users +msgid "Users" +msgstr "Gebruikers" + +#. 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 "Valideren weigeren" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__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 "" + +#. 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 +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewed_date +#, python-format +msgid "Validation Date" +msgstr "Validatie datum" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__review_ids +msgid "Validations" +msgstr "Validaties" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "e.g. Tier Validation for..." +msgstr "bijv. Tier validatie voor..." + +#~ msgid "Tier" +#~ msgstr "Tier" + +#~ msgid "A review was rejected by {}. ({})" +#~ msgstr "Een beoordeling is afgewezen door {}. ({})" + +#~ msgid "Any user in a specific group." +#~ msgstr "Elke gebruiker in een specifieke groep." + +#~ msgid "Object" +#~ msgstr "Object" + +#~ msgid "Approve Sequence" +#~ msgstr "Volgorde goedkeuren" diff --git a/base_tier_validation/i18n/sv.po b/base_tier_validation/i18n/sv.po new file mode 100644 index 0000000000..b3fc4aff57 --- /dev/null +++ b/base_tier_validation/i18n/sv.po @@ -0,0 +1,709 @@ +# 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-11-24 12:20+0000\n" +"Last-Translator: Simon S \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.3.2\n" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#, python-format +msgid "0 Pending" +msgstr "0 väntande" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" This Record needs to be\n" +" validated." +msgstr "" +"\n" +" Den här posten måste\n" +" valideras." + +#. 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" +" Åtgärden har\n" +" nekats\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" +" Åtgärden har\n" +" validerats\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 +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review has been requested by %s." +msgstr "En granskning har begärts av %s." + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was accepted" +msgstr "En granskning accepterades" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was accepted. (%s)" +msgstr "En granskning accepterades. (%s)" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was rejected by %(user)s. (%(comment)s)" +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was rejected by %s." +msgstr "En granskning nekades av %s." + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A validation process is still open for at least one record." +msgstr "En valideringsprocess är fortfarande öppen för minst en post." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__active +msgid "Active" +msgstr "Aktiv" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#, python-format +msgid "Activities" +msgstr "Aktiviteter" + +#. 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.selection,name:base_tier_validation.selection__tier_definition__review_type__group +msgid "Any user in a specific group" +msgstr "Alla användare i en specifik grupp" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Apply On" +msgstr "Applicera på" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__approve_sequence +msgid "Approval order by the specified sequence number" +msgstr "Godkännandeordning enligt angivet sekvensnummer" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__approve_sequence +#: 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:ir.model.fields,field_description:base_tier_validation.field_tier_review__can_review +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__can_review +msgid "Can Review" +msgstr "Kan granska" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__can_review +msgid "" +"Can review will be marked if the review is pending and the\n" +" approve sequence has been achieved" +msgstr "" +"Kan granska kommer att vara ikryssad om granskningen är väntande och\n" +" godkännandesekvensen har uppnåtts" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +msgid "Cancel" +msgstr "Avbryt" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__has_comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__has_comment +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +#, python-format +msgid "Comment" +msgstr "Kommentar" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_comment_wizard +msgid "Comment Wizard" +msgstr "Kommentarsguide" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__comment +msgid "Comments" +msgstr "Kommentarer" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__company_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__company_id +msgid "Company" +msgstr "Bolag" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_config_settings +msgid "Config Settings" +msgstr "Konfigurationsinställningar" + +#. module: base_tier_validation +#: model: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 +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 +msgid "Created on" +msgstr "Skapad den" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_type +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__definition_id +msgid "Definition" +msgstr "Definition" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_domain +msgid "Definition Domain" +msgstr "Definitionsdomän" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__name +#, python-format +msgid "Description" +msgstr "Beskrivning" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_name +msgid "Display Name" +msgstr "Visningsnamn" + +#. 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 +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#, python-format +msgid "Done by" +msgstr "Gjord av" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__field +msgid "Field in related record" +msgstr "Fält i relaterad post" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_review.py:0 +#, python-format +msgid "Group %s" +msgstr "Grupp %s" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "Group By" +msgstr "Gruppera efter" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__has_comment +msgid "Has Comment" +msgstr "Har kommentar" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__id +msgid "ID" +msgstr "ID" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_create +msgid "" +"If set, all possible reviewers will be notified by email when this " +"definition is triggered." +msgstr "" +"Om den är inställd kommer alla möjliga granskare att meddelas via e-post när " +"denna definition aktiveras." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard____last_update +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition____last_update +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review____last_update +msgid "Last Modified on" +msgstr "Senast ändrad den" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__write_uid +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 +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_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "Model" +msgstr "Modell" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "More Options" +msgstr "Fler alternativ" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +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" + +#. 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 +#: code:addons/base_tier_validation/models/tier_definition.py:0 +#, python-format +msgid "New Tier Validation" +msgstr "Ny attestering" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__next_review +msgid "Next Review" +msgstr "Nästa granskning" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "Next: %s" +msgstr "Nästa: %s" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#, python-format +msgid "No reviews to do." +msgstr "Inga granskningar att göra." + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_create +msgid "Notify Reviewers on Creation" +msgstr "Meddela granskare vid skapande" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "Operation has been rejected." +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "Operation has been validated!" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Option to forward a tier validation to other reviewer, and backward" +msgstr "" +"Alternativ för att vidarebefordra en attestering till en annan granskare och " +"bakåt" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Option to trigger server actions on completion of tier reviews" +msgstr "" +"Alternativ för att utlösa serveråtgärder när attesteringar har slutförts" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Option to use python formula to get reviewers and find documents" +msgstr "" +"Alternativ för att använda python-formel för att få fram granskare och hitta " +"dokument" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__pending +#, python-format +msgid "Pending" +msgstr "Väntande" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model_id +msgid "Referenced Model" +msgstr "Refererad modell" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Reject" +msgstr "Neka" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__rejected +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 "" + +#. 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 +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#, python-format +msgid "Requested by" +msgstr "Begärd av" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_id +msgid "Res" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_model +msgid "Res Model" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Restart Validation" +msgstr "Starta om validering" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__review_ids +#, python-format +msgid "Review" +msgstr "Granska" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_id +msgid "Reviewer" +msgstr "Granskare" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_field_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_field_id +msgid "Reviewer field" +msgstr "Granskarfält" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_group_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_group_id +msgid "Reviewer group" +msgstr "Granskargrupp" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_ids +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__reviewer_ids +msgid "Reviewers" +msgstr "Granskare" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_res_users__review_ids +#, python-format +msgid "Reviews" +msgstr "Granskningar" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__sequence +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence +#, python-format +msgid "Sequence" +msgstr "Sekvens" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__individual +msgid "Specific user" +msgstr "Specifik användare" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__status +#, python-format +msgid "Status" +msgstr "Status" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "The operation is under validation." +msgstr "Åtgärden håller på att valideras." + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "The review has been reset by %s." +msgstr "Granskningen har återställts av %s." + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_review.py:0 +#, python-format +msgid "There are no res.users in the selected field" +msgstr "Det finns inga res.users i det valda fältet" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "This %s needs to be validated" +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "" +"This action needs to be validated for at least one record. \n" +"Please request a validation." +msgstr "" +"Denna åtgärd måste valideras för minst en post.\n" +"Vänligen begär en validering." + +#. module: base_tier_validation +#: model:ir.actions.act_window,name:base_tier_validation.tier_definition_action +#: model:ir.model,name:base_tier_validation.model_tier_definition +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_definition +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Tier Definition" +msgstr "Attestdefinition" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_formula +msgid "Tier Formula" +msgstr "Attestformel" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_forward +msgid "Tier Forward & Backward" +msgstr "Attest framåt och bakåt" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_report +msgid "Tier Reports" +msgstr "Attestrapporter" + +#. 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.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_server_action +msgid "Tier Server Action" +msgstr "Attestserveråtgärd" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Tier Validation" +msgstr "Attestering" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation +msgid "Tier Validation (abstract)" +msgstr "Attestering (sammanfattning)" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_accepted +msgid "Tier Validation Accepted Notification" +msgstr "Meddelande vid accepterad attestering" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_rejected +msgid "Tier Validation Rejected Notification" +msgstr "Meddelande vid nekad attestering" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested +msgid "Tier Validation Requested" +msgstr "Attestering begärd" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_restarted +msgid "Tier Validation Restarted" +msgstr "Attestering omstartad" + +#. module: base_tier_validation +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_confirmation +msgid "Tier Validations" +msgstr "Attesteringar" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__to_validate_message +msgid "To Validate Message" +msgstr "" + +#. 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 +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#, python-format +msgid "Todo by" +msgstr "Att göra av" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_users +msgid "Users" +msgstr "Användare" + +#. 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 "Validera" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__validate_reject +msgid "Validate Reject" +msgstr "Validera Neka" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validated +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 "" + +#. 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 +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewed_date +#, python-format +msgid "Validation Date" +msgstr "Valideringsdatum" + +#. 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_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..." + +#~ msgid "A review was rejected by {}. ({})" +#~ msgstr "En granskning nekades av {}. ({})" diff --git a/base_tier_validation/i18n/zh_CN.po b/base_tier_validation/i18n/zh_CN.po new file mode 100644 index 0000000000..24e78dd6e9 --- /dev/null +++ b/base_tier_validation/i18n/zh_CN.po @@ -0,0 +1,707 @@ +# 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 +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#, python-format +msgid "0 Pending" +msgstr "0 待审批" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" This Record needs to be\n" +" validated." +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" Operation has been\n" +" rejected\n" +" ." +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "" +"\n" +" Operation has been\n" +" validated\n" +" !" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Name" +msgstr "名称" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review has been requested by %s." +msgstr "%s 发起审批请求。" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was accepted" +msgstr "审批已通过" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was accepted. (%s)" +msgstr "审批已通过。 ( %s )" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was rejected by %(user)s. (%(comment)s)" +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A review was rejected by %s." +msgstr "%s 驳回了审批。" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "A validation process is still open for at least one record." +msgstr "当前记录存在待批复的审批流程。" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__active +msgid "Active" +msgstr "有效" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#, python-format +msgid "Activities" +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.selection,name:base_tier_validation.selection__tier_definition__review_type__group +msgid "Any user in a specific group" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Apply On" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__approve_sequence +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__approve_sequence +msgid "Approval order by the specified sequence number" +msgstr "审批按指定序号排序" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__approve_sequence +#: 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:ir.model.fields,field_description:base_tier_validation.field_tier_review__can_review +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__can_review +msgid "Can Review" +msgstr "可审批" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_review__can_review +msgid "" +"Can review will be marked if the review is pending and the\n" +" approve sequence has been achieved" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +msgid "Cancel" +msgstr "取消" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__has_comment +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__has_comment +#: model_terms:ir.ui.view,arch_db:base_tier_validation.view_comment_wizard +#, python-format +msgid "Comment" +msgstr "审批意见" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_comment_wizard +msgid "Comment Wizard" +msgstr "审批意见向导" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__comment +msgid "Comments" +msgstr "审批意见" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__company_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__company_id +msgid "Company" +msgstr "公司" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: base_tier_validation +#: model: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 +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 +msgid "Created on" +msgstr "创建时间" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_type +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__definition_id +msgid "Definition" +msgstr "定义类型" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__definition_domain +msgid "Definition Domain" +msgstr "定义域" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__name +#, python-format +msgid "Description" +msgstr "说明" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__display_name +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__display_name +msgid "Display Name" +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 +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#, python-format +msgid "Done by" +msgstr "审批人" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__field +msgid "Field in related record" +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_review.py:0 +#, python-format +msgid "Group %s" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "Group By" +msgstr "分组" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__has_comment +msgid "Has Comment" +msgstr "含审批意见" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__id +msgid "ID" +msgstr "ID" + +#. module: base_tier_validation +#: model:ir.model.fields,help:base_tier_validation.field_tier_definition__notify_on_create +msgid "" +"If set, all possible reviewers will be notified by email when this " +"definition is triggered." +msgstr "如果设置,则触发此定义规则时将通过电子邮件通知所有的审批人。" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard____last_update +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition____last_update +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review____last_update +msgid "Last Modified on" +msgstr "最近修改时间" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__write_uid +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__write_uid +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 +msgid "Last Updated on" +msgstr "最近更新时间" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_search +msgid "Model" +msgstr "模型" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "More Options" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "More reports about tier validations, i.e., summary of all my reviews" +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 +#: code:addons/base_tier_validation/models/tier_definition.py:0 +#, python-format +msgid "New Tier Validation" +msgstr "新建多层级审批" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__next_review +msgid "Next Review" +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "Next: %s" +msgstr "" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#, python-format +msgid "No reviews to do." +msgstr "没有待审批的项目。" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__notify_on_create +msgid "Notify Reviewers on Creation" +msgstr "创建时通知审批人" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "Operation has been rejected." +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "Operation has been validated!" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Option to forward a tier validation to other reviewer, and backward" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Option to trigger server actions on completion of tier reviews" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Option to use python formula to get reviewers and find documents" +msgstr "" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__pending +#, python-format +msgid "Pending" +msgstr "待审批" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__model_id +msgid "Referenced Model" +msgstr "引用模型" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Reject" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__rejected +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_review__status__rejected +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 +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#, python-format +msgid "Requested by" +msgstr "发起人" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_id +msgid "Res" +msgstr "资源" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__res_model +msgid "Res Model" +msgstr "资源模型" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_buttons +msgid "Restart Validation" +msgstr "" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__review_ids +#, python-format +msgid "Review" +msgstr "审批" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_id +msgid "Reviewer" +msgstr "审批人" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_field_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_field_id +msgid "Reviewer field" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__reviewer_group_id +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_group_id +msgid "Reviewer group" +msgstr "审批组" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewer_ids +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__reviewer_ids +msgid "Reviewers" +msgstr "审批者" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/systray.xml:0 +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_res_users__review_ids +#, python-format +msgid "Reviews" +msgstr "审批" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__sequence +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__sequence +#, python-format +msgid "Sequence" +msgstr "序号" + +#. module: base_tier_validation +#: model:ir.model.fields.selection,name:base_tier_validation.selection__tier_definition__review_type__individual +msgid "Specific user" +msgstr "指定用户" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__status +#, python-format +msgid "Status" +msgstr "状态" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "The operation is under validation." +msgstr "该操作正在审批中。" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "The review has been reset by %s." +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_review.py:0 +#, python-format +msgid "There are no res.users in the selected field" +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "This %s needs to be validated" +msgstr "" + +#. module: base_tier_validation +#: code:addons/base_tier_validation/models/tier_validation.py:0 +#, python-format +msgid "" +"This action needs to be validated for at least one record. \n" +"Please request a validation." +msgstr "" +"此操作需要至少对一条记录进行审批。\n" +"请发起审批申请。" + +#. module: base_tier_validation +#: model:ir.actions.act_window,name:base_tier_validation.tier_definition_action +#: model:ir.model,name:base_tier_validation.model_tier_definition +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_definition +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_definition_view_form +msgid "Tier Definition" +msgstr "层级定义" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_formula +msgid "Tier Formula" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_forward +msgid "Tier Forward & Backward" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_report +msgid "Tier Reports" +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.fields,field_description:base_tier_validation.field_res_config_settings__module_base_tier_validation_server_action +msgid "Tier Server Action" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.res_config_settings_view_form_budget +msgid "Tier Validation" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_tier_validation +msgid "Tier Validation (abstract)" +msgstr "多层级审批(抽象)" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_accepted +#, fuzzy +msgid "Tier Validation Accepted Notification" +msgstr "多层级审批(抽象)" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_rejected +#, fuzzy +msgid "Tier Validation Rejected Notification" +msgstr "多层级审批(抽象)" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_requested +msgid "Tier Validation Requested" +msgstr "" + +#. module: base_tier_validation +#: model:mail.message.subtype,name:base_tier_validation.mt_tier_validation_restarted +msgid "Tier Validation Restarted" +msgstr "" + +#. module: base_tier_validation +#: model:ir.ui.menu,name:base_tier_validation.menu_tier_confirmation +msgid "Tier Validations" +msgstr "多层级审批" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__to_validate_message +msgid "To Validate Message" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__todo_by +msgid "Todo By" +msgstr "" + +#. module: base_tier_validation +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#, python-format +msgid "Todo by" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model,name:base_tier_validation.model_res_users +msgid "Users" +msgstr "用户" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_definition__valid_reviewer_field_ids +msgid "Valid Reviewer Field" +msgstr "" + +#. module: base_tier_validation +#: model_terms:ir.ui.view,arch_db:base_tier_validation.tier_validation_label +msgid "Validate" +msgstr "" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_comment_wizard__validate_reject +msgid "Validate Reject" +msgstr "驳回" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__validated +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 +#. openerp-web +#: code:addons/base_tier_validation/static/src/xml/tier_review_template.xml:0 +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_review__reviewed_date +#, python-format +msgid "Validation Date" +msgstr "审批日期" + +#. module: base_tier_validation +#: model:ir.model.fields,field_description:base_tier_validation.field_tier_validation__review_ids +msgid "Validations" +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 "例如:审批层级用于..." + +#~ msgid "Tier" +#~ msgstr "层级" + +#~ msgid "A review was rejected by {}. ({})" +#~ msgstr "{} 驳回了审批。 ( {} )" + +#~ msgid "Any user in a specific group." +#~ msgstr "指定权限组" + +#~ msgid "Object" +#~ msgstr "对象" + +#~ msgid "Approve Sequence" +#~ msgstr "批准顺序" + +#~ msgid "Formula" +#~ msgstr "公式" + +#~ msgid "Python Expression" +#~ msgstr "Python表达式" diff --git a/base_tier_validation/models/__init__.py b/base_tier_validation/models/__init__.py new file mode 100644 index 0000000000..45227c215a --- /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_review +from . import tier_validation +from . import res_users +from . import res_config_settings diff --git a/base_tier_validation/models/res_config_settings.py b/base_tier_validation/models/res_config_settings.py new file mode 100644 index 0000000000..c9fd1adbb4 --- /dev/null +++ b/base_tier_validation/models/res_config_settings.py @@ -0,0 +1,14 @@ +# Copyright 2021 Ecosoft Co., Ltd. (http://ecosoft.co.th) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from odoo import models + + +class ResConfigSettings(models.TransientModel): + _inherit = "res.config.settings" + + # Activate me back when modules are migrated + + # module_base_tier_validation_formula = fields.Boolean(string="Tier Formula") + # module_base_tier_validation_forward = fields.Boolean("Tier Forward & Backward") + # module_base_tier_validation_server_action = fields.Boolean("Tier Server Action") + # module_base_tier_validation_report = fields.Boolean("Tier Reports") diff --git a/base_tier_validation/models/res_users.py b/base_tier_validation/models/res_users.py new file mode 100644 index 0000000000..056aae4826 --- /dev/null +++ b/base_tier_validation/models/res_users.py @@ -0,0 +1,58 @@ +# Copyright 2019 ForgeFlow S.L. (https://www.forgeflow.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models, modules + + +class Users(models.Model): + _inherit = "res.users" + + review_ids = fields.Many2many(string="Reviews", comodel_name="tier.review") + + @api.model + def review_user_count(self): + user_reviews = {} + domain = [ + ("status", "=", "pending"), + ("can_review", "=", True), + ("id", "in", self.env.user.review_ids.ids), + ] + review_groups = self.env["tier.review"].read_group(domain, ["model"], ["model"]) + for review_group in review_groups: + model = review_group["model"] + reviews = self.env["tier.review"].search(review_group.get("__domain")) + if reviews: + records = ( + self.env[model] + .with_user(self.env.user) + .search([("id", "in", reviews.mapped("res_id"))]) + .filtered(lambda x: not x.rejected and x.can_review) + ) + # if len(records): + for rec in records: + record = self.env[model] + user_reviews[model] = { + "id": rec.id, + "name": record._description, + "model": model, + "icon": modules.module.get_module_icon(record._original_module), + "type": "tier_review", + "pending_count": len(records), + } + return list(user_reviews.values()) + + @api.model + def get_reviews(self, data): + review_obj = self.env["tier.review"].with_context(lang=self.env.user.lang) + res = review_obj.search_read([("id", "in", data.get("res_ids"))]) + for r in res: + # Get the translated status value. + r["display_status"] = dict( + review_obj.fields_get("status")["status"]["selection"] + ).get(r.get("status")) + # Convert to datetime timezone + if r["reviewed_date"]: + r["reviewed_date"] = fields.Datetime.context_timestamp( + self, r["reviewed_date"] + ) + return res diff --git a/base_tier_validation/models/tier_definition.py b/base_tier_validation/models/tier_definition.py new file mode 100644 index 0000000000..e3700e5b73 --- /dev/null +++ b/base_tier_validation/models/tier_definition.py @@ -0,0 +1,87 @@ +# Copyright 2017 ForgeFlow S.L. (https://www.forgeflow.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import _, api, fields, models + + +class TierDefinition(models.Model): + _name = "tier.definition" + _description = "Tier Definition" + + @api.model + def _get_default_name(self): + return _("New Tier Validation") + + @api.model + def _get_tier_validation_model_names(self): + res = [] + return res + + name = fields.Char( + string="Description", + required=True, + default=lambda self: self._get_default_name(), + translate=True, + ) + model_id = fields.Many2one( + comodel_name="ir.model", + string="Referenced Model", + domain=lambda self: [("model", "in", self._get_tier_validation_model_names())], + ) + model = fields.Char(related="model_id.model", index=True, store=True) + review_type = fields.Selection( + string="Validated by", + default="individual", + selection=[ + ("individual", "Specific user"), + ("group", "Any user in a specific group"), + ("field", "Field in related record"), + ], + ) + reviewer_id = fields.Many2one(comodel_name="res.users", string="Reviewer") + reviewer_group_id = fields.Many2one( + comodel_name="res.groups", string="Reviewer group" + ) + reviewer_field_id = fields.Many2one( + comodel_name="ir.model.fields", + string="Reviewer field", + domain="[('id', 'in', valid_reviewer_field_ids)]", + ) + valid_reviewer_field_ids = fields.One2many( + comodel_name="ir.model.fields", + compute="_compute_domain_reviewer_field", + ) + definition_type = fields.Selection( + string="Definition", selection=[("domain", "Domain")], default="domain" + ) + definition_domain = fields.Char() + active = fields.Boolean(default=True) + sequence = fields.Integer(default=30) + company_id = fields.Many2one( + comodel_name="res.company", + string="Company", + default=lambda self: self.env.company, + ) + notify_on_create = fields.Boolean( + string="Notify Reviewers on Creation", + help="If set, all possible reviewers will be notified by email when " + "this definition is triggered.", + ) + has_comment = fields.Boolean(string="Comment", default=False) + approve_sequence = fields.Boolean( + string="Approve by sequence", + default=False, + help="Approval order by the specified sequence number", + ) + + @api.onchange("review_type") + def onchange_review_type(self): + self.reviewer_id = None + self.reviewer_group_id = None + + @api.depends("review_type", "model_id") + def _compute_domain_reviewer_field(self): + for rec in self: + rec.valid_reviewer_field_ids = self.env["ir.model.fields"].search( + [("model", "=", rec.model), ("relation", "=", "res.users")] + ) diff --git a/base_tier_validation/models/tier_review.py b/base_tier_validation/models/tier_review.py new file mode 100644 index 0000000000..33fd586bc3 --- /dev/null +++ b/base_tier_validation/models/tier_review.py @@ -0,0 +1,125 @@ +# Copyright 2017-19 ForgeFlow S.L. (https://www.forgeflow.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +import pytz + +from odoo import _, api, fields, models +from odoo.exceptions import ValidationError + + +class TierReview(models.Model): + _name = "tier.review" + _description = "Tier Review" + + name = fields.Char(related="definition_id.name", readonly=True) + status = fields.Selection( + selection=[ + ("pending", "Pending"), + ("rejected", "Rejected"), + ("approved", "Approved"), + ], + default="pending", + ) + model = fields.Char(string="Related Document Model", index=True) + res_id = fields.Integer(string="Related Document ID", index=True) + definition_id = fields.Many2one(comodel_name="tier.definition") + company_id = fields.Many2one( + related="definition_id.company_id", + store=True, + ) + review_type = fields.Selection(related="definition_id.review_type", readonly=True) + reviewer_id = fields.Many2one(related="definition_id.reviewer_id", readonly=True) + reviewer_group_id = fields.Many2one( + related="definition_id.reviewer_group_id", readonly=True + ) + reviewer_field_id = fields.Many2one( + related="definition_id.reviewer_field_id", readonly=True + ) + reviewer_ids = fields.Many2many( + string="Reviewers", + comodel_name="res.users", + compute="_compute_reviewer_ids", + store=True, + ) + sequence = fields.Integer(string="Tier") + todo_by = fields.Char(compute="_compute_todo_by", store=True) + done_by = fields.Many2one(comodel_name="res.users") + requested_by = fields.Many2one(comodel_name="res.users") + reviewed_date = fields.Datetime(string="Validation Date") + reviewed_formated_date = fields.Char( + string="Validation Formated Date", compute="_compute_reviewed_formated_date" + ) + has_comment = fields.Boolean(related="definition_id.has_comment", readonly=True) + comment = fields.Char(string="Comments") + can_review = fields.Boolean( + compute="_compute_can_review", + store=True, + help="""Can review will be marked if the review is pending and the + approve sequence has been achieved""", + ) + approve_sequence = fields.Boolean( + related="definition_id.approve_sequence", readonly=True + ) + + @api.depends_context("tz") + def _compute_reviewed_formated_date(self): + timezone = self._context.get("tz") or self.env.user.partner_id.tz or "UTC" + for review in self: + if not review.reviewed_date: + review.reviewed_formated_date = False + continue + requested_date_utc = pytz.timezone(timezone).localize(review.reviewed_date) + requested_date = requested_date_utc.astimezone(pytz.timezone(timezone)) + review.reviewed_formated_date = requested_date.replace(tzinfo=None) + + @api.depends("definition_id.approve_sequence") + def _compute_can_review(self): + for record in self: + record.can_review = record._can_review_value() + + def _can_review_value(self): + if self.status != "pending": + return False + if not self.approve_sequence: + return True + resource = self.env[self.model].browse(self.res_id) + reviews = resource.review_ids.filtered(lambda r: r.status == "pending") + if not reviews: + return True + sequence = min(reviews.mapped("sequence")) + return self.sequence == sequence + + @api.model + def _get_reviewer_fields(self): + return ["reviewer_id", "reviewer_group_id", "reviewer_group_id.users"] + + @api.depends(lambda self: self._get_reviewer_fields()) + def _compute_reviewer_ids(self): + for rec in self: + rec.reviewer_ids = rec._get_reviewers() + + @api.depends("reviewer_ids") + def _compute_todo_by(self): + """Show by group or by abbrev list of names""" + num_show = 3 # Max number of users to display + for rec in self: + todo_by = False + if rec.reviewer_group_id: + todo_by = _("Group %s") % rec.reviewer_group_id.name + else: + todo_by = ", ".join(rec.reviewer_ids[:num_show].mapped("display_name")) + num_users = len(rec.reviewer_ids) + if num_users > num_show: + todo_by = "{} (and {} more)".format(todo_by, num_users - num_show) + rec.todo_by = todo_by + + def _get_reviewers(self): + if self.reviewer_id or self.reviewer_group_id.users: + return self.reviewer_id + self.reviewer_group_id.users + reviewer_field = self.env["res.users"] + if self.reviewer_field_id: + resource = self.env[self.model].browse(self.res_id) + reviewer_field = getattr(resource, self.reviewer_field_id.name, False) + if not reviewer_field or not reviewer_field._name == "res.users": + raise ValidationError(_("There are no res.users in the selected field")) + return reviewer_field diff --git a/base_tier_validation/models/tier_validation.py b/base_tier_validation/models/tier_validation.py new file mode 100644 index 0000000000..6dd80133c7 --- /dev/null +++ b/base_tier_validation/models/tier_validation.py @@ -0,0 +1,519 @@ +# Copyright 2017-19 ForgeFlow S.L. (https://www.forgeflow.com) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from ast import literal_eval + +from lxml import etree + +from odoo import _, api, fields, models +from odoo.exceptions import ValidationError +from odoo.tools.misc import frozendict + + +class TierValidation(models.AbstractModel): + _name = "tier.validation" + _description = "Tier Validation (abstract)" + + _tier_validation_buttons_xpath = "/form/header/button[last()]" + _tier_validation_manual_config = True + + _state_field = "state" + _state_from = ["draft"] + _state_to = ["confirmed"] + _cancel_state = "cancel" + + # TODO: step by step validation? + + review_ids = fields.One2many( + comodel_name="tier.review", + inverse_name="res_id", + string="Validations", + domain=lambda self: [("model", "=", self._name)], + auto_join=True, + ) + to_validate_message = fields.Html(compute="_compute_validated_rejected") + validated = fields.Boolean( + compute="_compute_validated_rejected", search="_search_validated" + ) + validated_message = fields.Html(compute="_compute_validated_rejected") + need_validation = fields.Boolean(compute="_compute_need_validation") + rejected = fields.Boolean( + compute="_compute_validated_rejected", search="_search_rejected" + ) + rejected_message = fields.Html(compute="_compute_validated_rejected") + reviewer_ids = fields.Many2many( + string="Reviewers", + comodel_name="res.users", + compute="_compute_reviewer_ids", + search="_search_reviewer_ids", + ) + can_review = fields.Boolean( + compute="_compute_can_review", search="_search_can_review" + ) + has_comment = fields.Boolean(compute="_compute_has_comment") + next_review = fields.Char(compute="_compute_next_review") + + def _compute_has_comment(self): + for rec in self: + has_comment = rec.review_ids.filtered( + lambda r: r.status == "pending" and (self.env.user in r.reviewer_ids) + ).mapped("has_comment") + rec.has_comment = True in has_comment + + def _get_sequences_to_approve(self, user): + all_reviews = self.review_ids.filtered(lambda r: r.status == "pending") + my_reviews = all_reviews.filtered(lambda r: user in r.reviewer_ids) + # Include all my_reviews with approve_sequence = False + sequences = my_reviews.filtered(lambda r: not r.approve_sequence).mapped( + "sequence" + ) + # Include only my_reviews with approve_sequence = True + approve_sequences = my_reviews.filtered("approve_sequence").mapped("sequence") + if approve_sequences: + my_sequence = min(approve_sequences) + min_sequence = min(all_reviews.mapped("sequence")) + if my_sequence <= min_sequence: + sequences.append(my_sequence) + return sequences + + def _compute_can_review(self): + for rec in self: + rec.can_review = rec._get_sequences_to_approve(self.env.user) + + @api.model + def _search_can_review(self, operator, value): + res_ids = ( + self.search( + [ + ("review_ids.reviewer_ids", "=", self.env.user.id), + ("review_ids.status", "=", "pending"), + ("review_ids.can_review", "=", True), + ("rejected", "=", False), + ] + ) + .filtered("can_review") + .ids + ) + return [("id", "in", res_ids)] + + @api.depends("review_ids") + def _compute_reviewer_ids(self): + for rec in self: + rec.reviewer_ids = rec.review_ids.filtered( + lambda r: r.status == "pending" + ).mapped("reviewer_ids") + + @api.model + def _search_validated(self, operator, value): + assert operator in ("=", "!="), "Invalid domain operator" + assert value in (True, False), "Invalid domain value" + pos = self.search([(self._state_field, "in", self._state_from)]).filtered( + lambda r: r.review_ids and r.validated == value + ) + return [("id", "in", pos.ids)] + + @api.model + def _search_rejected(self, operator, value): + assert operator in ("=", "!="), "Invalid domain operator" + assert value in (True, False), "Invalid domain value" + pos = self.search([(self._state_field, "in", self._state_from)]).filtered( + lambda r: r.review_ids and r.rejected == value + ) + return [("id", "in", pos.ids)] + + @api.model + def _search_reviewer_ids(self, operator, value): + model_operator = "in" + if operator == "=" and value in ("[]", False): + # Search for records that have not yet been through a validation + # process. + operator = "!=" + model_operator = "not in" + reviews = self.env["tier.review"].search( + [ + ("model", "=", self._name), + ("reviewer_ids", operator, value), + ("can_review", "=", True), + ("status", "=", "pending"), + ] + ) + return [("id", model_operator, list(set(reviews.mapped("res_id"))))] + + def _get_to_validate_message_name(self): + return self._description + + def _get_to_validate_message(self): + return ( + """ %s""" + % _("This %s needs to be validated") + % self._get_to_validate_message_name() + ) + + def _get_validated_message(self): + msg = """ %s""" % _( + """Operation has been validated!""" + ) + return self.validated and msg or "" + + def _get_rejected_message(self): + msg = """ %s""" % _( + """Operation has been rejected.""" + ) + return self.rejected and msg or "" + + def _compute_validated_rejected(self): + for rec in self: + rec.validated = self._calc_reviews_validated(rec.review_ids) + rec.validated_message = rec._get_validated_message() + rec.rejected = self._calc_reviews_rejected(rec.review_ids) + rec.rejected_message = rec._get_rejected_message() + rec.to_validate_message = rec._get_to_validate_message() + + def _compute_next_review(self): + for rec in self: + review = rec.review_ids.sorted("sequence").filtered( + lambda l: l.status == "pending" + )[:1] + rec.next_review = review and _("Next: %s") % review.name or "" + + @api.model + def _calc_reviews_validated(self, reviews): + """Override for different validation policy.""" + if not reviews: + return False + return not any([s != "approved" for s in reviews.mapped("status")]) + + @api.model + def _calc_reviews_rejected(self, reviews): + """Override for different rejection policy.""" + return any([s == "rejected" for s in reviews.mapped("status")]) + + def _compute_need_validation(self): + for rec in self: + if isinstance(rec.id, models.NewId): + rec.need_validation = False + continue + tiers = self.env["tier.definition"].search([("model", "=", self._name)]) + valid_tiers = any([rec.evaluate_tier(tier) for tier in tiers]) + rec.need_validation = ( + not rec.review_ids + and valid_tiers + and getattr(rec, self._state_field) in self._state_from + ) + + def evaluate_tier(self, tier): + if tier.definition_domain: + domain = literal_eval(tier.definition_domain) + return self.filtered_domain(domain) + else: + return self + + @api.model + def _get_under_validation_exceptions(self): + """Extend for more field exceptions.""" + return ["message_follower_ids", "access_token"] + + def _check_allow_write_under_validation(self, vals): + """Allow to add exceptions for fields that are allowed to be written + even when the record is under validation.""" + exceptions = self._get_under_validation_exceptions() + for val in vals: + if val not in exceptions: + return False + return True + + def write(self, vals): + for rec in self: + if rec._check_state_conditions(vals): + if rec.need_validation: + # try to validate operation + reviews = rec.request_validation() + rec._validate_tier(reviews) + if not self._calc_reviews_validated(reviews): + raise ValidationError( + _( + "This action needs to be validated for at least " + "one record. \nPlease request a validation." + ) + ) + if rec.review_ids and not rec.validated: + raise ValidationError( + _( + "A validation process is still open for at least " + "one record." + ) + ) + if ( + rec.review_ids + and getattr(rec, self._state_field) in self._state_from + and not vals.get(self._state_field) + in (self._state_to + [self._cancel_state]) + and not rec._check_allow_write_under_validation(vals) + ): + raise ValidationError(_("The operation is under validation.")) + if vals.get(self._state_field) in self._state_from: + self.mapped("review_ids").unlink() + return super(TierValidation, self).write(vals) + + def _check_state_conditions(self, vals): + self.ensure_one() + return ( + getattr(self, self._state_field) in self._state_from + and vals.get(self._state_field) in self._state_to + ) + + def _validate_tier(self, tiers=False): + self.ensure_one() + tier_reviews = tiers or self.review_ids + user_reviews = tier_reviews.filtered( + lambda r: r.status == "pending" and (self.env.user in r.reviewer_ids) + ) + user_reviews.write( + { + "status": "approved", + "done_by": self.env.user.id, + "reviewed_date": fields.Datetime.now(), + } + ) + for review in user_reviews: + rec = self.env[review.model].browse(review.res_id) + rec._notify_accepted_reviews() + + def _get_requested_notification_subtype(self): + return "base_tier_validation.mt_tier_validation_requested" + + def _get_accepted_notification_subtype(self): + return "base_tier_validation.mt_tier_validation_accepted" + + def _get_rejected_notification_subtype(self): + return "base_tier_validation.mt_tier_validation_rejected" + + def _get_restarted_notification_subtype(self): + return "base_tier_validation.mt_tier_validation_restarted" + + def _notify_accepted_reviews(self): + post = "message_post" + if hasattr(self, post): + # Notify state change + getattr(self.sudo(), post)( + subtype_xmlid=self._get_accepted_notification_subtype(), + body=self._notify_accepted_reviews_body(), + ) + + def _notify_accepted_reviews_body(self): + has_comment = self.review_ids.filtered( + lambda r: (self.env.user in r.reviewer_ids) and r.comment + ) + if has_comment: + comment = has_comment.mapped("comment")[0] + return _("A review was accepted. (%s)") % comment + return _("A review was accepted") + + def _add_comment(self, validate_reject, reviews): + wizard = self.env.ref("base_tier_validation.view_comment_wizard") + return { + "name": _("Comment"), + "type": "ir.actions.act_window", + "view_mode": "form", + "res_model": "comment.wizard", + "views": [(wizard.id, "form")], + "view_id": wizard.id, + "target": "new", + "context": { + "default_res_id": self.id, + "default_res_model": self._name, + "default_review_ids": reviews.ids, + "default_validate_reject": validate_reject, + }, + } + + def validate_tier(self): + self.ensure_one() + sequences = self._get_sequences_to_approve(self.env.user) + reviews = self.review_ids.filtered(lambda l: l.sequence in sequences) + if self.has_comment: + return self._add_comment("validate", reviews) + self._validate_tier(reviews) + self._update_counter({"review_deleted": True}) + + def reject_tier(self): + self.ensure_one() + sequences = self._get_sequences_to_approve(self.env.user) + reviews = self.review_ids.filtered(lambda l: l.sequence in sequences) + if self.has_comment: + return self._add_comment("reject", reviews) + self._rejected_tier(reviews) + self._update_counter({"review_deleted": True}) + + def _notify_rejected_review_body(self): + has_comment = self.review_ids.filtered( + lambda r: (self.env.user in r.reviewer_ids) and r.comment + ) + if has_comment: + comment = has_comment.mapped("comment")[0] + return _("A review was rejected by %(user)s. (%(comment)s)") % { + "user": self.env.user.name, + "comment": comment, + } + return _("A review was rejected by %s.") % (self.env.user.name) + + def _notify_rejected_review(self): + post = "message_post" + if hasattr(self, post): + # Notify state change + getattr(self.sudo(), post)( + subtype_xmlid=self._get_rejected_notification_subtype(), + body=self._notify_rejected_review_body(), + ) + + def _rejected_tier(self, tiers=False): + self.ensure_one() + tier_reviews = tiers or self.review_ids + user_reviews = tier_reviews.filtered( + lambda r: r.status == "pending" and (self.env.user in r.reviewer_ids) + ) + user_reviews.write( + { + "status": "rejected", + "done_by": self.env.user.id, + "reviewed_date": fields.Datetime.now(), + } + ) + for review in user_reviews: + rec = self.env[review.model].browse(review.res_id) + rec._notify_rejected_review() + + def _notify_requested_review_body(self): + return _("A review has been requested by %s.") % (self.env.user.name) + + def _notify_review_requested(self, tier_reviews): + subscribe = "message_subscribe" + post = "message_post" + if hasattr(self, post) and hasattr(self, subscribe): + for rec in self: + users_to_notify = tier_reviews.filtered( + lambda r: r.definition_id.notify_on_create and r.res_id == rec.id + ).mapped("reviewer_ids") + # Subscribe reviewers and notify + getattr(rec, subscribe)( + partner_ids=users_to_notify.mapped("partner_id").ids + ) + getattr(rec, post)( + subtype_xmlid=self._get_requested_notification_subtype(), + body=rec._notify_requested_review_body(), + ) + + def request_validation(self): + td_obj = self.env["tier.definition"] + tr_obj = created_trs = self.env["tier.review"] + for rec in self: + if getattr(rec, self._state_field) in self._state_from: + if rec.need_validation: + tier_definitions = td_obj.search( + [("model", "=", self._name)], order="sequence desc" + ) + sequence = 0 + for td in tier_definitions: + if rec.evaluate_tier(td): + sequence += 1 + created_trs += tr_obj.create( + { + "model": self._name, + "res_id": rec.id, + "definition_id": td.id, + "sequence": sequence, + "requested_by": self.env.uid, + } + ) + self._update_counter({"review_created": True}) + self._notify_review_requested(created_trs) + return created_trs + + def _notify_restarted_review_body(self): + return _("The review has been reset by %s.") % (self.env.user.name) + + def _notify_restarted_review(self): + post = "message_post" + if hasattr(self, post): + getattr(self.sudo(), post)( + subtype_xmlid=self._get_restarted_notification_subtype(), + body=self._notify_restarted_review_body(), + ) + + def restart_validation(self): + for rec in self: + if getattr(rec, self._state_field) in self._state_from: + to_update_counter = ( + rec.mapped("review_ids").filtered(lambda a: a.status == "pending") + and True + or False + ) + rec.mapped("review_ids").unlink() + if to_update_counter: + self._update_counter({"review_deleted": True}) + rec._notify_restarted_review() + + @api.model + def _update_counter(self, review_counter): + self.review_ids._compute_can_review() + notifications = [] + channel = "base.tier.validation/updated" + notifications.append([self.env.user.partner_id, channel, review_counter]) + self.env["bus.bus"]._sendmany(notifications) + + def unlink(self): + self.mapped("review_ids").unlink() + return super().unlink() + + @api.model + def get_view(self, view_id=None, view_type="form", **options): + res = super().get_view(view_id=view_id, view_type=view_type, **options) + + View = self.env["ir.ui.view"] + + # Override context for postprocessing + if view_id and res.get("base_model", self._name) != self._name: + View = View.with_context(base_model_name=res["base_model"]) + if view_type == "form" and not self._tier_validation_manual_config: + doc = etree.XML(res["arch"]) + params = { + "state_field": self._state_field, + "state_from": ",".join("'%s'" % state for state in self._state_from), + } + all_models = res["models"].copy() + for node in doc.xpath(self._tier_validation_buttons_xpath): + # By default, after the last button of the header + str_element = self.env["ir.qweb"]._render( + "base_tier_validation.tier_validation_buttons", params + ) + new_node = etree.fromstring(str_element) + new_arch, new_models = View.postprocess_and_fields(new_node, self._name) + new_node = etree.fromstring(new_arch) + for new_element in new_node: + node.addnext(new_element) + for node in doc.xpath("/form/sheet"): + str_element = self.env["ir.qweb"]._render( + "base_tier_validation.tier_validation_label", params + ) + new_node = etree.fromstring(str_element) + 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) + str_element = self.env["ir.qweb"]._render( + "base_tier_validation.tier_validation_reviews", params + ) + new_node = etree.fromstring(str_element) + new_arch, new_models = View.postprocess_and_fields(new_node, self._name) + for model in new_models: + if model in all_models: + continue + if model not in res["models"]: + all_models[model] = new_models[model] + else: + all_models[model] = res["models"][model] + new_node = etree.fromstring(new_arch) + node.append(new_node) + res["arch"] = etree.tostring(doc) + res["models"] = frozendict(all_models) + return res diff --git a/base_tier_validation/readme/CONFIGURE.rst b/base_tier_validation/readme/CONFIGURE.rst new file mode 100644 index 0000000000..425bfa0cd8 --- /dev/null +++ b/base_tier_validation/readme/CONFIGURE.rst @@ -0,0 +1,11 @@ +To configure this module, you need to: + +#. Go to *Settings > Technical > Tier Validations > Tier Definition*. +#. Create as many tiers as you want for any model having tier validation + functionality. + +**Note:** + +* If check *Notify Reviewers on Creation*, all possible reviewers will be notified by email when this definition is triggered. +* If check *Comment*, reviewers can comment after click Validate or Reject. +* If check *Approve by sequence*, reviewers is forced to review by specified sequence. diff --git a/base_tier_validation/readme/CONTRIBUTORS.rst b/base_tier_validation/readme/CONTRIBUTORS.rst new file mode 100644 index 0000000000..4fd44dfad7 --- /dev/null +++ b/base_tier_validation/readme/CONTRIBUTORS.rst @@ -0,0 +1,7 @@ +* Lois Rilo +* Naglis Jonaitis +* Adrià Gil Sorribes +* Pimolnat Suntian +* Pedro Gonzalez +* Kitti U. +* Saran Lim. diff --git a/base_tier_validation/readme/DESCRIPTION.rst b/base_tier_validation/readme/DESCRIPTION.rst new file mode 100644 index 0000000000..5758782c26 --- /dev/null +++ b/base_tier_validation/readme/DESCRIPTION.rst @@ -0,0 +1,13 @@ +Validating some operations is a common need across different areas in a company +and sometimes it also involves several people and stages in the process. With +this module you will be able to define your custom validation workflows for +any Odoo document. + +This module does not provide a functionality by itself but an abstract model +to implement a validation process based on tiers on other models (e.g. +purchase orders, sales orders, budgets, expenses...). + +**Note:** To be able to use this module in a new model you will need some +development. + +See `purchase_tier_validation `_ as an example of implementation. diff --git a/base_tier_validation/readme/HISTORY.rst b/base_tier_validation/readme/HISTORY.rst new file mode 100644 index 0000000000..2443029ed6 --- /dev/null +++ b/base_tier_validation/readme/HISTORY.rst @@ -0,0 +1,91 @@ +14.0.1.0.0 (2020-11-19) +~~~~~~~~~~~~~~~~~~~~~~~ + +Migrated to Odoo 14. + +13.0.1.2.2 (2020-08-30) +~~~~~~~~~~~~~~~~~~~~~~~ + +Fixes: + +- When using approve_sequence option in any tier.definition there can be inconsistencies in the systray notifications +- When using approve_sequence, still not approve only the needed sequence, but also other sequence for the same approver + +12.0.3.3.1 (2019-12-02) +~~~~~~~~~~~~~~~~~~~~~~~ + +Fixes: + +- Show comment on Reviews Table. +- Edit notification with approve_sequence. + +12.0.3.3.0 (2019-11-27) +~~~~~~~~~~~~~~~~~~~~~~~ + +New features: + +- Add comment on Reviews Table. +- Approve by sequence. + +12.0.3.2.1 (2019-11-26) +~~~~~~~~~~~~~~~~~~~~~~~ + +Fixes: + +- Remove message_subscribe_users + +12.0.3.2.0 (2019-11-25) +~~~~~~~~~~~~~~~~~~~~~~~ + +New features: + +- Notify reviewers + +12.0.3.1.0 (2019-07-08) +~~~~~~~~~~~~~~~~~~~~~~~ + +Fixes: + +- Singleton error + +12.0.3.0.0 (2019-12-02) +~~~~~~~~~~~~~~~~~~~~~~~ + +Fixes: + +- Edit Reviews Table + +12.0.2.1.0 (2019-05-29) +~~~~~~~~~~~~~~~~~~~~~~~ + +Fixes: + +- Edit drop-down style width and position + +12.0.2.0.0 (2019-05-28) +~~~~~~~~~~~~~~~~~~~~~~~ + +New features: + +- Pass parameters as functions. +- Add Systray. + +12.0.1.0.0 (2019-02-18) +~~~~~~~~~~~~~~~~~~~~~~~ + +Migrated to Odoo 12. + +11.0.1.0.0 (2018-05-09) +~~~~~~~~~~~~~~~~~~~~~~~ + +Migrated to Odoo 11. + +10.0.1.0.0 (2018-03-26) +~~~~~~~~~~~~~~~~~~~~~~~ + +Migrated to Odoo 10. + +9.0.1.0.0 (2017-12-02) +~~~~~~~~~~~~~~~~~~~~~~~ + +First version. diff --git a/base_tier_validation/readme/ROADMAP.rst b/base_tier_validation/readme/ROADMAP.rst new file mode 100644 index 0000000000..767b9b5b3b --- /dev/null +++ b/base_tier_validation/readme/ROADMAP.rst @@ -0,0 +1,20 @@ +This is the list of known issues for this module. Any proposal for improvement will +be very valuable. + +* **Issue:** + + When using `approve_sequence` option in any tier.definition there can be inconsistencies + in the systray notifications. + + **Description:** + + Field `can_review` in tier.review is used to filter out, in the systray notifications, + the reviews a user can approve. This `can_review` field is updated **in the database** + in method `review_user_count`, this can make it very inconsistent for databases + with a lot of users and recurring updates that can change the expected behavior. + +* **Migration to 15.0:** + + The parameter _tier_validation_manual_config will become False, on 14.0, the default + value is True, as the change is applied after the migration. In order to use the new + behavior we need to modify the value on our expected model. diff --git a/base_tier_validation/security/ir.model.access.csv b/base_tier_validation/security/ir.model.access.csv new file mode 100644 index 0000000000..d2427d5a8d --- /dev/null +++ b/base_tier_validation/security/ir.model.access.csv @@ -0,0 +1,5 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_tier_review,access.tier.review,model_tier_review,,1,1,1,1 +access_tier_definition_all,tier.definition.all,model_tier_definition,,1,0,0,0 +access_tier_definition_settings,tier.definition.settings,model_tier_definition,base.group_system,1,1,1,1 +access_comment_wizard,access.comment.wizard,model_comment_wizard,,1,1,1,1 diff --git a/base_tier_validation/security/tier_validation_security.xml b/base_tier_validation/security/tier_validation_security.xml new file mode 100644 index 0000000000..2ad71f5749 --- /dev/null +++ b/base_tier_validation/security/tier_validation_security.xml @@ -0,0 +1,19 @@ + + + + Tier Definition multi-company + + + + ['|',('company_id','=',False),('company_id', 'in', company_ids)] + + + + Tier Review multi-company + + + + ['|',('company_id','=',False),('company_id', 'in', company_ids)] + + + diff --git a/base_tier_validation/static/description/icon.png b/base_tier_validation/static/description/icon.png new file mode 100644 index 0000000000..3a0328b516 Binary files /dev/null and b/base_tier_validation/static/description/icon.png differ diff --git a/base_tier_validation/static/description/index.html b/base_tier_validation/static/description/index.html new file mode 100644 index 0000000000..dcf1a77f52 --- /dev/null +++ b/base_tier_validation/static/description/index.html @@ -0,0 +1,581 @@ + + + + + + +Base Tier Validation + + + +
+

Base Tier Validation

+ + +

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

+

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

+

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

+

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

+

See purchase_tier_validation as an example of implementation.

+

Table of contents

+ +
+

Configuration

+

To configure 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 Comment, reviewers can comment after click Validate or Reject.
  • +
  • If check Approve by sequence, reviewers is forced to review by specified sequence.
  • +
+
+
+

Known issues / Roadmap

+

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

+
    +
  • Issue:

    +

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

    +

    Description:

    +

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

    +
  • +
  • Migration to 15.0:

    +

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

    +
  • +
+
+
+

Changelog

+
+

14.0.1.0.0 (2020-11-19)

+

Migrated to Odoo 14.

+
+
+

13.0.1.2.2 (2020-08-30)

+

Fixes:

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

12.0.3.3.1 (2019-12-02)

+

Fixes:

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

12.0.3.3.0 (2019-11-27)

+

New features:

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

12.0.3.2.1 (2019-11-26)

+

Fixes:

+
    +
  • Remove message_subscribe_users
  • +
+
+
+

12.0.3.2.0 (2019-11-25)

+

New features:

+
    +
  • Notify reviewers
  • +
+
+
+

12.0.3.1.0 (2019-07-08)

+

Fixes:

+
    +
  • Singleton error
  • +
+
+
+

12.0.3.0.0 (2019-12-02)

+

Fixes:

+
    +
  • Edit Reviews Table
  • +
+
+
+

12.0.2.1.0 (2019-05-29)

+

Fixes:

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

12.0.2.0.0 (2019-05-28)

+

New features:

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

12.0.1.0.0 (2019-02-18)

+

Migrated to Odoo 12.

+
+
+

11.0.1.0.0 (2018-05-09)

+

Migrated to Odoo 11.

+
+
+

10.0.1.0.0 (2018-03-26)

+

Migrated to Odoo 10.

+
+
+

9.0.1.0.0 (2017-12-02)

+

First version.

+
+
+
+

Bug Tracker

+

Bugs are tracked on GitHub Issues. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed +feedback.

+

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

+
+
+

Credits

+
+

Authors

+
    +
  • ForgeFlow
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+Odoo Community Association +

OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use.

+

Current maintainer:

+

LoisRForgeFlow

+

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

+

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

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

+ +

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + tier.definition.search + tier.definition + + + + + + + + + + + + + + + + Tier Definition + ir.actions.act_window + tier.definition + tree,form + {'search_default_all': 1} + + + + diff --git a/base_tier_validation/views/tier_review_view.xml b/base_tier_validation/views/tier_review_view.xml new file mode 100644 index 0000000000..2c9fa538c0 --- /dev/null +++ b/base_tier_validation/views/tier_review_view.xml @@ -0,0 +1,25 @@ + + + + + tier.review.tree + tier.review + + + + + + + + + + + + + + + diff --git a/base_tier_validation/wizard/__init__.py b/base_tier_validation/wizard/__init__.py new file mode 100644 index 0000000000..92bd0df50b --- /dev/null +++ b/base_tier_validation/wizard/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import comment_wizard diff --git a/base_tier_validation/wizard/comment_wizard.py b/base_tier_validation/wizard/comment_wizard.py new file mode 100644 index 0000000000..5c5a6c933d --- /dev/null +++ b/base_tier_validation/wizard/comment_wizard.py @@ -0,0 +1,25 @@ +# Copyright 2019 Ecosoft Co., Ltd. (http://ecosoft.co.th) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class CommentWizard(models.TransientModel): + _name = "comment.wizard" + _description = "Comment Wizard" + + validate_reject = fields.Char() + res_model = fields.Char() + res_id = fields.Integer() + review_ids = fields.Many2many(comodel_name="tier.review") + comment = fields.Char(required=True) + + def add_comment(self): + self.ensure_one() + rec = self.env[self.res_model].browse(self.res_id) + self.review_ids.write({"comment": self.comment}) + if self.validate_reject == "validate": + rec._validate_tier(self.review_ids) + if self.validate_reject == "reject": + rec._rejected_tier(self.review_ids) + rec._update_counter({"review_deleted": True}) diff --git a/base_tier_validation/wizard/comment_wizard_view.xml b/base_tier_validation/wizard/comment_wizard_view.xml new file mode 100644 index 0000000000..70c1a9285a --- /dev/null +++ b/base_tier_validation/wizard/comment_wizard_view.xml @@ -0,0 +1,26 @@ + + + + + Comment Wizard + comment.wizard + form + +
+ + + + +
+
+
+
diff --git a/setup/base_tier_validation/odoo/addons/base_tier_validation b/setup/base_tier_validation/odoo/addons/base_tier_validation new file mode 120000 index 0000000000..d48caa1952 --- /dev/null +++ b/setup/base_tier_validation/odoo/addons/base_tier_validation @@ -0,0 +1 @@ +../../../../base_tier_validation \ No newline at end of file diff --git a/setup/base_tier_validation/setup.py b/setup/base_tier_validation/setup.py new file mode 100644 index 0000000000..28c57bb640 --- /dev/null +++ b/setup/base_tier_validation/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +)